Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .agents/pm/extensions/.managed-extensions.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"version": 1,
"updated_at": "2026-08-03T09:53:27.290Z",
"updated_at": "2026-08-03T15:02:53.911Z",
"entries": [
{
"name": "pm-changelog",
Expand Down
35 changes: 35 additions & 0 deletions .agents/pm/history/pm-6z0wzf.jsonl

Large diffs are not rendered by default.

31 changes: 31 additions & 0 deletions .agents/pm/history/pm-998juj.jsonl

Large diffs are not rendered by default.

18 changes: 18 additions & 0 deletions .agents/pm/history/pm-csuce0.jsonl

Large diffs are not rendered by default.

41 changes: 34 additions & 7 deletions .agents/pm/issues/pm-6z0wzf.toon
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,67 @@ id: pm-6z0wzf
title: "GH-832: package command namespace ownership and collision diagnostics are not discoverable"
description: "Track the public-package collision with the bundled private pm-vcs exemplar and define deterministic, inspectable command namespace ownership for extension authors and operators."
type: Issue
status: open
status: closed
priority: 1
tags: []
created_at: "2026-07-31T07:01:54.979Z"
updated_at: "2026-08-03T09:06:52.703Z"
updated_at: "2026-08-03T14:54:22.935Z"
closed_at: "2026-08-03T14:54:22.217Z"
completed_at: "2026-08-03T14:54:22.217Z"
author: "harness:codex"
estimated_minutes: 180
acceptance_criteria: Expose command-path and alias ownership through SDK and contracts; fail closed or resolve collisions by a documented deterministic policy naming all claimants; report collisions in health; namespace bundled exemplars without breaking existing invocations; cover scope-preserving package identity and dual-package activation
parent: pm-tnud
risk: medium
confidence: high
severity: high
resolution: "Namespaced the private VCS SDK exemplar and its canonical commands, retained internal legacy invocations, and projected managed install aliases plus command ownership through loader/describe contracts."
expected_result: "Package authors can preflight command and alias ownership, activation resolves collisions deterministically, and diagnostics name every claimant without silently dropping sibling commands."
actual_result: A private bundled exemplar and a public package independently claim vcs aliases and command paths; fresh workspaces cannot discover ownership or the collision outcome.
actual_result: "The bundled package installs as @unbrained/pm-vcs-sdk-exemplar via vcs-exemplar; canonical vcs-exemplar commands and internal vcs compatibility commands both work, and package describe resolves the install alias with deterministic ownership."
component: extensions/command-registry
dependencies[3]{id,kind,created_at,author,source_kind,author_source}:
pm-4vwcvq,related_to,"2026-07-31T07:01:54.979Z","harness:codex","cli:create:dep",detected
pm-v1yo,related_to,"2026-07-31T07:01:54.979Z","harness:codex","cli:create:dep",detected
pm-tnud,implements,"2026-07-31T10:15:13.251Z","harness:codex","cli:update:dep",detected
comments[6]{created_at,author,text}:
comments[14]{created_at,author,text}:
"2026-07-31T07:01:54.979Z","harness:codex","Duplicate check evidence: searched all statuses for VCS alias, command registration, and collision claimants; pm-v1yo covers core-group aliases and pm-4vwcvq covers partial activation, while GH-832 is the distinct package-to-package namespace ownership gap. Source: https://github.com/unbraind/pm-cli/issues/832"
"2026-07-31T10:15:15.393Z","harness:codex","Organization rationale 2026-07-31: this issue is the discoverability acceptance gap for pm-tnud, not a parallel package epic. Estimate 180m, medium risk, high confidence; the consolidation task now records it as an explicit completion prerequisite."
"2026-08-03T07:39:30.021Z","harness:codex","TDD evidence: duplicate handler ownership assertion failed before the describe projection and now reports activation-ordered claimants, the effective final winner, collision state, and last_activated_wins policy through CLI results and public SDK types."
"2026-08-03T08:23:07.826Z","harness:codex","Manual acceptance: package describe --json in fresh Node and Bun workspaces reports the installed command-kit handler, project claimant, last_activated_wins policy, winner, and collision=false. The packed consumer imports buildExtensionDescribeResult from @unbrained/pm-cli/sdk."
"2026-08-03T08:53:22.136Z","harness:codex","Tranche boundary: this PR delivers deterministic activation-ordered command claimant discovery, winner/collision projection, public SDK types, CLI JSON/Markdown output, documentation, focused tests, and Node/Bun packed acceptance. The item remains open because the acceptance criterion to namespace the bundled VCS exemplar without breaking legacy invocations is intentionally not claimed by this tranche."
"2026-08-03T09:06:52.703Z","harness:codex","PR evidence for delivered ownership-discovery scope: https://github.com/unbraind/pm-cli/pull/880. The canonical item remains open for the separately stated bundled VCS exemplar namespacing residual."
files[5]{path,scope,note}:
"2026-08-03T13:32:19.851Z","harness:codex","TDD evidence: canonical vcs-exemplar command expectations and package identity assertions were updated first; focused package/catalog tests now pass with legacy vcs command compatibility retained at internal tier."
"2026-08-03T13:51:36.428Z","harness:codex","TDD/manual acceptance evidence: package describe now resolves the persisted install alias through managed source provenance and bundled package identity. Focused extension-describe suite passes 20/20, typecheck and build pass, and the original isolated command PM_PATH=/tmp/pm-package-platform.0QLv6q/project/.agents/pm PM_GLOBAL_PATH=/tmp/pm-package-platform.0QLv6q/global/.agents/pm node dist/cli.js package describe vcs-exemplar --project --json returns ok=true, target=vcs-exemplar, total=1, canonical builtin-vcs-sdk-exemplar ownership, and all 14 canonical plus compatibility command paths."
"2026-08-03T13:52:34.472Z","harness:codex","Live GitHub cross-check 2026-08-03: GH-832 has a direct pm item .toon link comment; all 23 open repository issues have at least one direct pm .toon link comment; there are zero open PRs, zero Dependabot alerts, zero code-scanning alerts, and zero secret-scanning alerts. Current main CI/Security/CodeQL/Scorecard/CodSpeed runs are green."
"2026-08-03T14:34:06.957Z","harness:codex","Final local verification: repository coverage passes 100/100/100/100 across 425 files and 6,782 tests; full static/docstring/SDK parity/context/token gates pass; packed npx smoke and 88-command package-first dogfood pass. Exact install alias is now a loader-projected SDK identity rather than CLI-only special handling."
"2026-08-03T14:37:48.835Z","harness:codex","PR evidence: https://github.com/unbraind/pm-cli/pull/883 at initial exact head 3a184d480. Awaiting hosted checks and full Greptile/CodeRabbit review."
"2026-08-03T14:46:44.765Z","harness:codex","Hosted CI evidence at PR #883 head 98448a77950e: Gates (static) failed only because readManagedExtensionSourcePackages reached complexity 17 against the mandatory maximum 16. Simplified parsed managed-state validation and alias normalization without weakening lint or changing the SDK identity contract; focused ESLint now passes and extension loader/describe tests pass 130/130."
"2026-08-03T14:48:06.691Z","harness:codex","Follow-up verification complete: repo-wide pnpm lint:eslint passes; all three linked sandbox-safe test commands pass (19 + 130 + 141 tests), and the contract-preserving simplification is ready for exact-head hosted rerun."
"2026-08-03T14:54:17.503Z","harness:codex","Second hosted static-gate evidence at exact head c0f92b72d: code lint and all later checks pass; the remaining failure is deterministic CHANGELOG.md drift caused by the just-recorded PM close evidence. Regenerating exclusively through installed pm-changelog 2026.8.3, then checking idempotence."
files[12]{path,scope,note}:
packages/pm-vcs/extensions/vcs/index.ts,project,canonical namespaced commands with internal compatibility spellings
packages/pm-vcs/extensions/vcs/manifest.json,project,namespaced bundled extension identity
packages/pm-vcs/package.json,project,collision-free package identity and canonical alias
sdk/public-surface.json,project,public command ownership contracts snapshot
src/core/extensions/extension-types.ts,project,Public loaded-extension install-source alias identity contract
src/core/extensions/loader.ts,project,Persist managed install identities into loaded extension context
src/sdk/extension.ts,project,CLI lifecycle result integration
src/sdk/extension/describe.ts,project,deterministic command ownership projection
src/sdk/index.ts,project,public ownership SDK exports
tests/unit/extensions/extension-command.spec.ts,project,bundled catalog and wildcard activation identity coverage
tests/unit/extensions/extension-describe.spec.ts,project,winner and claimant contract coverage
tests[1]{command,scope,timeout_seconds}:
tests/unit/packages/vcs-extension.spec.ts,project,canonical and legacy command acceptance coverage
tests[3]{command,scope,timeout_seconds}:
node scripts/run-tests.mjs test -- tests/unit/extensions/extension-describe.spec.ts,project,240
docs[1]{path,scope,note}:
node scripts/run-tests.mjs test -- tests/unit/extensions/extension-loader.spec.ts tests/unit/extensions/extension-describe.spec.ts,project,300
node scripts/run-tests.mjs test -- tests/unit/packages/vcs-extension.spec.ts tests/unit/extensions/extension-command.spec.ts,project,300
test_runs[2]{run_id,kind,status,started_at,finished_at,recorded_at,passed,failed,skipped}:
test-local-msdbyul9-genmgh,test,passed,"2026-08-03T14:34:08.910Z","2026-08-03T14:34:37.533Z","2026-08-03T14:34:37.533Z",2,0,0
test-local-msdcfyho-0v80bn,test,passed,"2026-08-03T14:47:20.233Z","2026-08-03T14:47:55.740Z","2026-08-03T14:47:55.740Z",3,0,0
docs[4]{path,scope,note}:
CHANGELOG.md,project,Generated release-facing namespace and alias resolution entry
docs/EXTENSIONS.md,project,ownership policy and discovery workflow
packages/pm-vcs/GAP_REPORT.md,project,SDK exemplar namespace assessment
packages/pm-vcs/README.md,project,canonical install and command migration guidance
close_reason: PR #883 follow-up is fully verified; strict complexity passes and CHANGELOG.md is regenerated from the final closed PM state with pm-changelog 2026.8.3.
body: ""
29 changes: 26 additions & 3 deletions .agents/pm/issues/pm-csuce0.toon
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,22 @@ id: pm-csuce0
title: "GH-681: latest calendar ordinal must satisfy stable package peer ranges"
description: "Resolve the npm latest channel and peer-range incompatibility where a production calendar ordinal such as 2026.7.24-3 is selected by latest but does not satisfy ordinary stable peer ranges used by pm packages. Coordinate the core release policy, SDK scaffold peer guidance, and affected package repositories without relaxing npm peer validation."
type: Issue
status: open
status: closed
priority: 1
tags[6]: gh-issue,npm,packages,release,sdk,semver
created_at: "2026-07-25T00:15:27.200Z"
updated_at: "2026-07-28T15:15:25.025Z"
updated_at: "2026-08-03T14:37:49.411Z"
closed_at: "2026-08-03T14:35:32.661Z"
completed_at: "2026-08-03T14:35:32.661Z"
author: codex-root
estimated_minutes: 240
acceptance_criteria: "npm latest for @unbrained/pm-cli always resolves to a version that satisfies ordinary stable peer ranges used by first-party packages; Release tooling fails the publish when the calendar ordinal about to be tagged latest would violate the documented peer contract; Package scaffolds and SDK authoring docs state the supported peer range shape for date-based versions; A regression check installs the published latest against a first-party package peer range and fails on incompatibility; A same-day replacement version sorts strictly above the version it replaces and is selected by an ordinary range, so a range resolver never returns the artifact the replacement was cut to supersede, with the published 2026.7.24 and 2026.7.24-3 pair as the regression fixture"
parent: pm-u9d0
risk: high
confidence: 90
resolution: "Removed same-day production ordinal generation from the active release path, reject historical ordinal verification, and document stable >=date peer ranges in SDK scaffolds."
expected_result: Every automatic production date has at most one stable release and generated packages use peer ranges that npm stable resolution can satisfy.
actual_result: Second same-day production releases now fail closed; stable date versions remain compatible with ordinary peer ranges; historical ordinal tags remain immutable recovery evidence only.
dependencies[8]:
- id: pm-4s24d2
kind: related
Expand Down Expand Up @@ -41,9 +46,27 @@ dependencies[8]:
author: "harness:claude-code"
source_kind: "cli:update:dep"
author_source: detected
comments[2]{created_at,author,text}:
comments[6]{created_at,author,text}:
"2026-07-25T00:15:27.200Z",codex-root,"Duplicate check: searched all statuses for GH-681, npm latest prerelease stable dist-tag peer resolution, and calendar ordinal compatibility. The closed pm-gis0qo owns the intentional production latest-tag policy and pm-4s24d2 owns the one-auto-release-per-day invariant, but neither owns ecosystem peer-range compatibility. This residual cross-package contract is distinct and remains open/unclaimed unless safely included in the active SDK bundle."
"2026-07-26T18:30:31.222Z","harness:claude-code","Live registry verification 2026-07-26: npm dist-tags for @unbrained/pm-cli show a single latest tag at 2026.7.26 with no prerelease pointer, and both npx -y @unbrained/pm-cli@latest --version and bunx @unbrained/pm-cli@latest --version resolve, install and print 2026.7.26. The stable-peer-range failure mode described by GH-681 does not reproduce against the current registry state. Full release-health sweep recorded on pm-7zs0."
"2026-08-03T13:32:20.785Z","harness:codex","TDD evidence: the historical ordinal-producing next-version expectation now fails by design; release-version refuses a second same-day version with stable peer-range recovery guidance, and generated SDK package docs pin the ordinary >= stable range contract."
"2026-08-03T13:52:35.107Z","harness:codex","Live GitHub cross-check 2026-08-03: GH-681 has a direct pm item .toon link comment. Across the repository all 23 open issues have direct pm .toon link comments; zero open PRs and zero GitHub security/dependency alerts remain before this tranche."
"2026-08-03T14:34:07.611Z","harness:codex","Final local verification: release-version suite passes 36 tests; full 6,782-test coverage is 100/100/100/100; version policy/sync, release automation contracts, packed npx smoke, and package-first dogfood pass. Same-day production ordinals fail closed and historical ordinal verification remains explicitly rejected."
"2026-08-03T14:37:49.411Z","harness:codex","PR evidence: https://github.com/unbraind/pm-cli/pull/883 at initial exact head 3a184d480. Awaiting hosted checks and full Greptile/CodeRabbit review."
notes[1]{created_at,author,text}:
"2026-07-27T12:56:03.083Z","harness:claude-code","Evidence 2026-07-27: the same-day suffix is a semver prerelease, so the replacement sorts below the thing it replaces and is unreachable from every ordinary range.\n\nVerified against the live registry rather than by reading the spec. The command npm view for the range caret 2026.7.24 lists 2026.7.24, 2026.7.25, 2026.7.26 and 2026.7.27. It does not list 2026.7.24-3, which is published and installable by exact version. npm excludes it because the hyphen makes it a prerelease of 2026.7.24, and prereleases are outside every range that does not name them.\n\nThree consequences follow, and only the first is currently in this item's acceptance criteria.\n\nOrdering inversion. 2026.7.24-3 is strictly less than 2026.7.24 under semver. The artifact published at 09:46 on 2026-07-24 to replace the one published at 05:51 that morning sorts beneath it. Anyone resolving a range that day received the version the replacement was cut to supersede, and will continue to, permanently. The dist-tag rescue that pm-gis0qo shipped fixes what \"latest\" points at; it cannot fix what a range resolves to, because dist-tags and ranges are different resolution paths.\n\nTwo auto-releases in one day. The retry path is documented as producing a replacement rather than a second release, and the workflow comment says so explicitly. On 2026-07-24 both 2026.7.24 and 2026.7.24-3 reached npm, four hours apart, from the automated pipeline. Whatever the intent, the observable outcome is two published auto-releases on one calendar day, which is the invariant the release policy is supposed to hold.\n\nA tag with no artifact. v2026.7.24-2 exists in git and was never published. That is the general case of the ledger divergence tracked by pm-q91qyd.\n\nThe underlying question this item can settle: a date-based scheme needs a same-day disambiguator that increases monotonically and stays inside the release range. A hyphen suffix cannot do that under semver by construction. A fourth numeric position is not available in semver, so the disambiguator has to be inside one of the three components."
files[4]{path,scope,note}:
scripts/release-version.mjs,project,fail-closed same-day stable release diagnostic
src/sdk/extension/scaffold.ts,project,stable peer-range authoring scaffold
tests/unit/extensions/extension-scaffold-define-guidance.spec.ts,project,generated stable peer-range guidance coverage
tests/unit/scripts/release-version.spec.ts,project,historical ordinal and same-day refusal regression coverage
tests[1]{command,scope,timeout_seconds}:
node scripts/run-tests.mjs test -- tests/unit/scripts/release-version.spec.ts tests/unit/extensions/extension-scaffold-define-guidance.spec.ts,project,240
test_runs[1]{run_id,kind,status,started_at,finished_at,recorded_at,passed,failed,skipped}:
test-local-msdbz00q-05wj08,test,passed,"2026-08-03T14:34:38.120Z","2026-08-03T14:34:44.570Z","2026-08-03T14:34:44.570Z",1,0,0
docs[3]{path,scope,note}:
CHANGELOG.md,project,Generated release-facing stable version policy entry
docs/RELEASING.md,project,immutable daily release and peer-range policy
docs/SDK.md,project,first-party package stable peer guidance
close_reason: "Delivered stable SemVer peer-range guidance and fail-closed once-per-day production version policy with historical ordinal verification rejection, complete tests, docs, and release automation proof."
body: ""
Loading