diff --git a/.agents/pm/chores/pm-3y56.toon b/.agents/pm/chores/pm-3y56.toon index c4c443220..f36ef42d1 100644 --- a/.agents/pm/chores/pm-3y56.toon +++ b/.agents/pm/chores/pm-3y56.toon @@ -6,7 +6,7 @@ status: closed priority: 3 tags[4]: dedup,docs,plan,plugins created_at: "2026-05-22T19:18:21.800Z" -updated_at: "2026-09-19T08:39:23.778Z" +updated_at: "2026-09-27T07:45:18.538Z" closed_at: "2026-05-25T00:22:23.205Z" author: codex-duplicate-audit acceptance_criteria: A canonical Plan workflow recipe exists in docs or shared plugin reference; Claude/Codex skills and commands keep only harness-specific deltas and link to the recipe; examples stay valid against current plan contracts; docs-skills gate and focused plugin docs checks pass. @@ -23,9 +23,8 @@ comments[2]{created_at,author,text}: "2026-05-24T23:56:28.488Z",codex-docs-dedupe-lane,"Evidence from docs/plugin single-source lane (read-only, 2026-05-25): Plan examples are duplicated in plugins/pm-claude/skills/pm-planner/SKILL.md, plugins/pm-claude/commands/pm-planner.md, plugins/pm-codex/skills/pm-native/SKILL.md, and docs/COMMANDS.md#plan-workflow. The MCP server contract lists pm_plan subcommands as create|show|add-step|update-step|complete-step|block-step|reorder-step|remove-step|link|unlink|decision|discovery|validation|resume|approve|materialize. Drift found: Claude skill has the fullest lifecycle (decision/discovery/validation/show depths) but omits block/reorder/remove/link/unlink in examples; Codex skill has a shorter lifecycle with resume but omits discovery/validation/show variants; Claude slash command has the shortest create/add/complete/approve/materialize/show/resume set. Recommendation: make docs/COMMANDS.md#plan-workflow canonical for CLI-level Plan workflow and exact subcommand examples; create or keep one shared plugin-facing recipe only if needed, then reduce Claude/Codex skills/commands to harness-specific deltas (`harness: claude-code` vs `codex`, MCP JSON shape, when to use pm_plan). Smallest edit: in plugin skills/commands, replace the copied lifecycle blocks with 3-5 lines: when to use pm_plan, harness-specific create example, and link to docs/COMMANDS.md#plan-workflow for complete lifecycle. Validation commands to wire: pm contracts --command plan --flags-only --json, pm contracts --json (or MCP tools/list via plugin smoke), pnpm quality:docs-skills, pnpm smoke:claude-plugin, pnpm smoke:codex-plugin, plus rg -n \"pm_plan|pm plan\" plugins/pm-claude/skills/pm-planner/SKILL.md plugins/pm-claude/commands/pm-planner.md plugins/pm-codex/skills/pm-native/SKILL.md docs/COMMANDS.md to verify only canonical page contains the full lifecycle list.\n" tests[1]{command,scope,timeout_seconds,note}: pm contracts --command plan --flags-only --json,project,120,Plan contract surface probe -docs[4]{path,scope,note}: +docs[3]{path,scope,note}: docs/COMMANDS.md,project,canonical Plan workflow lifecycle recipe - plugins/pm-claude/commands/pm-planner.md,project,Plan example clone plugins/pm-claude/skills/pm-planner/SKILL.md,project,Plan example clone plugins/pm-codex/skills/pm-native/SKILL.md,project,Plan example clone close_reason: "Completed in combined extension/plugin dedupe PR: canonicalized duplicated extension contract/default sources or routed duplicated plugin/docs inventory to one source. Evidence is recorded on the item and parent pm-rnpb; focused tests, docs/plugin checks, manual temp-project smoke, package dogfood, full release gate, changelog check, GitHub/dependency/security checks, and Sentry/telemetry checks passed." diff --git a/.agents/pm/chores/pm-dudr.toon b/.agents/pm/chores/pm-dudr.toon index e17305c78..e4f883c3c 100644 --- a/.agents/pm/chores/pm-dudr.toon +++ b/.agents/pm/chores/pm-dudr.toon @@ -2,21 +2,76 @@ id: pm-dudr title: "Claude plugin spec-alignment hygiene vs 2026-07-11 official docs (minor, non-blocking)" description: Close minor Claude plugin packaging and documentation deviations from the current official specification without changing the established native runtime architecture. type: Chore -status: open +status: closed priority: 3 tags[3]: claude-plugin,docs,hygiene created_at: "2026-07-11T10:05:30.442Z" -updated_at: "2026-09-08T13:33:39.517Z" +updated_at: "2026-09-27T08:36:45.317Z" +closed_at: "2026-09-27T08:36:41.856Z" +completed_at: "2026-09-27T08:36:41.856Z" author: maintainer-agent estimated_minutes: 60 acceptance_criteria: "All five spec-alignment gaps closed against the official plugin docs: .mcp.json note key corrected; metadata.* nesting matches schema; commands/ renamed to skills/; displayName + $schema present; root marketplace.json duplicate removed; plugin still validates --strict" parent: pm-ugqx risk: low confidence: high -expected_result: The Claude plugin matches the official spec on all five flagged points and still validates strictly. +resolution: "Moved nine unique Claude command prompts into native skills, removed five duplicate command copies, corrected marketplace and plugin manifest fields, kept the compatibility marketplace identical, and migrated historical PM links to current skill paths." +expected_result: "Both Claude marketplace and plugin manifests validate strictly, all 14 /pm-* invocations remain available through skills, and generated portable skill ownership stays exact." +actual_result: Both claude plugin validate --strict commands passed; focused linked tests and full 100/100/100/100 coverage passed; packed npm/Bun smoke passed; historical linked-path count returned to its 195 baseline. Local timing gates showed host-sensitive overages; hosted CI is pending. dependencies[4]{id,kind,created_at}: pm-l9wl,related,"2026-07-11T10:05:30.442Z" pm-wg07,related,"2026-07-24T23:53:23.133Z" pm-z3ez,related,"2026-07-24T23:53:23.133Z" pm-ugqx,implements,"2026-07-26T05:56:10.428Z" +comments[5]{created_at,author,text}: + "2026-09-27T07:08:34.573Z","harness:codex","Current official Claude plugin manifest docs support $schema/displayName, skills with stable slash names, and top-level marketplace description/version. Pre-fix contract test failed at four independent boundaries. The migrated plugin and marketplace now pass claude plugin validate --strict; the compatibility marketplace copy remains byte-equivalent by contract." + "2026-09-27T07:11:11.109Z","harness:codex",Static gate found the shared-skill generator rejected nine intentional Claude-owned skill directories. The generator now reserves exactly those names for pm-claude while continuing to refuse arbitrary unowned directories; its focused contract test covers the combined layout. + "2026-09-27T08:00:53.366Z","harness:codex","Plugin migration evidence: moved nine unique Claude command prompts into native skill SKILL.md paths, removed five duplicate command copies, validated both marketplace and plugin roots with claude plugin validate --strict, and kept root marketplace compatibility byte-identical. The repository tracker gate exposed 15 newly missing historical links; migrated each former command file link to its current skill path through pm files/docs and removed one obsolete commands directory link already covered by skills. pm validate --check-files now reports the preexisting ceiling of 195." + "2026-09-27T08:36:12.071Z","harness:codex","Verification: linked plugin contract/generator tests passed; claude plugin validate . --strict and plugins/pm-claude --strict passed; full coverage passed 9,373 tests at exact 100/100/100/100; packed npx/bunx smoke passed across nine packages; docs-skills, graph composition, record integrity, mutation and repository health passed. Static aggregate stopped only at host-sensitive import timing on unchanged SDK bundles, with isolated import gate passing on retry; hosted exact-head CI remains the release gate." + "2026-09-27T08:36:20.615Z","harness:codex","Correction to preceding verification note: a separate CLI transport-floor gate run also exceeded local host latency ceilings for context/next/create/claim under load average about 7. The aggregate static command stopped earlier at import timing. Both timing gates await hosted CI verdict; graph, record-integrity and mutation gates passed separately." +files[9]{path,scope,note}: + .claude-plugin/marketplace.json,project,canonical marketplace catalog + marketplace.json,project,byte-identical compatibility catalog + plugins/pm-claude/.claude-plugin/plugin.json,project,current plugin metadata schema + plugins/pm-claude/.mcp.json,project,schema-clean MCP configuration + scripts/gen-agent-plugin-skills.mjs,project,recognize intentionally Claude-owned skill invocations + scripts/smoke-claude-plugin.mjs,project,skill inventory and genuine manifest guards + tests/integration/claude-plugin-contract.spec.ts,project,plugin manifest and invocation contract + tests/unit/scripts/gen-agent-plugin-skills.spec.ts,project,generator preserves both plugin ownership contracts + tests/unit/scripts/smoke-claude-plugin.spec.ts,project,smoke behavioral coverage without test-only seam +tests[2]{command,scope,timeout_seconds,provenance{author,created_at,source_kind,source_ref},note}: + node scripts/run-tests.mjs test -- tests/integration/claude-plugin-contract.spec.ts tests/unit/scripts/smoke-claude-plugin.spec.ts,project,240,"harness:codex","2026-09-27T07:08:33.619Z",local_mutation,fix/package-install-readiness-claude-plugin-contracts,Claude plugin manifest and smoke contract + node scripts/run-tests.mjs test -- tests/unit/scripts/gen-agent-plugin-skills.spec.ts,project,240,"harness:codex","2026-09-27T07:11:10.302Z",local_mutation,fix/package-install-readiness-claude-plugin-contracts,generated shared skills and Claude-only invocation ownership +test_runs[1]: + - run_id: test-local-mujk8tah-p1a123 + kind: test + status: passed + started_at: "2026-09-27T08:32:04.389Z" + finished_at: "2026-09-27T08:32:21.065Z" + recorded_at: "2026-09-27T08:32:21.065Z" + passed: 2 + failed: 0 + skipped: 0 + executions[2]{command,requested_pm_context_mode,pm_context_mode,workspace_context_mode,trust_reason}: + node scripts/run-tests.mjs test -- tests/integration/claude-plugin-contract.spec.ts tests/unit/scripts/smoke-claude-plugin.spec.ts,schema,schema,source,local_source_ref + node scripts/run-tests.mjs test -- tests/unit/scripts/gen-agent-plugin-skills.spec.ts,schema,schema,source,local_source_ref +docs[17]{path,scope,note}: + CHANGELOG.md,project,Generated changelog entry for Claude plugin contract + docs/CLAUDE_CODE_PLUGIN.md,project,plugin layout and marketplace compatibility invariant + plugins/pm-claude/README.md,project,Claude plugin inventory + plugins/pm-claude/skills/pm-audit/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-calendar/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-close-task/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-developer/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-init/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-list/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-new/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-planner/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-release/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-search/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-start-task/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-status/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-triage/SKILL.md,project,preserved slash invocations under skills layout + plugins/pm-claude/skills/pm-workflow/SKILL.md,project,preserved slash invocations under skills layout +close_reason: Aligned Claude marketplace and plugin surfaces with current strict validation; preserved 14 slash invocations as skills body: "Minor deviations from current official plugin docs (code.claude.com/docs/en/plugins-reference, fetched 2026-07-11; Claude Code v2.1.207). None block loading — `claude plugin validate --strict` passes today. Sweep these when touching the plugin (the substantive install-path defect is pm-l9wl):\n\n1. `plugins/pm-claude/.mcp.json` carries a non-schema `\"note\"` key inside the server entry. Unrecognized-field tolerance is documented for plugin.json top level, not for MCP server configs; Claude Code settings validators are known to strip unknown keys. Move the note to a JS/README comment.\n2. `.claude-plugin/marketplace.json` nests `description`/`version` under `metadata` — docs mark that \"accepted for backward compatibility\"; best practice is top-level fields.\n3. `commands/` (14 flat .md) is the legacy form — docs: \"Commands: Skills as flat Markdown files. Use `skills/` for new plugins.\" Plan a consolidation into `skills/` (each becomes `/SKILL.md`), keeping invocation names stable.\n4. Adopt newer manifest fields: `$schema` (https://json.schemastore.org/claude-code-plugin-manifest.json) for editor validation, `displayName` (v2.1.143+) for the /plugin picker.\n5. Root `marketplace.json` duplicate: kept intentionally for backwards compat (smoke test asserts it). Document the dual-file invariant where it's enforced, or drop it once compat window closes — it is a silent-drift hazard (only `.claude-plugin/marketplace.json` is read by /plugin marketplace add).\n6. If a rename/removal ever happens, use the top-level `renames` map (v2.1.193+) instead of breaking installs." diff --git a/.agents/pm/extensions/.managed-extensions.json b/.agents/pm/extensions/.managed-extensions.json index 74730f052..8980f57f0 100644 --- a/.agents/pm/extensions/.managed-extensions.json +++ b/.agents/pm/extensions/.managed-extensions.json @@ -1,6 +1,6 @@ { "version": 1, - "updated_at": "2026-09-27T03:46:20.555Z", + "updated_at": "2026-09-27T09:24:00.162Z", "entries": [ { "name": "pm-changelog", diff --git a/.agents/pm/features/pm-7t04.toon b/.agents/pm/features/pm-7t04.toon index 6359323f3..6c38fd760 100644 --- a/.agents/pm/features/pm-7t04.toon +++ b/.agents/pm/features/pm-7t04.toon @@ -6,7 +6,7 @@ status: closed priority: 1 tags[5]: agent-ux,bootstrap,docs,init,pm-cli created_at: "2026-05-17T08:58:01.020Z" -updated_at: "2026-09-22T05:25:13.685Z" +updated_at: "2026-09-27T07:45:28.635Z" closed_at: "2026-05-17T10:24:19.569Z" author: codex-agent acceptance_criteria: pm init detects missing core pm guidance in AGENTS.md and/or CLAUDE.md; TTY init asks before modifying files; approval writes idempotent marked guidance; decline persists project state so future init runs do not ask; explicit pm init option can add guidance later; non-interactive runs do not block; settings/schema/contracts/help/docs/tests cover the behavior. @@ -85,7 +85,7 @@ files[23]{path,scope,note}: docs/AGENT_GUIDE.md,project,Agent bootstrap guidance checks docs/COMMANDS.md,project,Init guidance mode command reference docs/QUICKSTART.md,project,Init guidance lifecycle docs - plugins/pm-claude/commands/pm-init.md,project,pm_run init examples for guidance modes + plugins/pm-claude/skills/pm-init/SKILL.md,project,pm_run init examples for guidance modes plugins/pm-codex/README.md,project,Codex automation hint for options.agentGuidance scripts/dogfood-package-first.mjs,project,dogfood assertions for init guidance lifecycle src/cli/commands/completion.ts,project,Bash/zsh/fish completion updates diff --git a/.agents/pm/features/pm-rnpb.toon b/.agents/pm/features/pm-rnpb.toon index f645c638d..143b51240 100644 --- a/.agents/pm/features/pm-rnpb.toon +++ b/.agents/pm/features/pm-rnpb.toon @@ -6,7 +6,7 @@ status: closed priority: 0 tags[10]: agent-ux,audit,calendar,ci,dogfood,pm-cli,sdk,search,security,telemetry created_at: "2026-05-03T13:20:01.343Z" -updated_at: "2026-09-22T05:00:03.509Z" +updated_at: "2026-09-27T07:45:31.227Z" deadline: "2026-06-01T00:00:00.000Z" closed_at: "2026-05-26T22:58:30.907Z" author: codex-audit @@ -1010,8 +1010,8 @@ docs[16]{path,scope,note}: packages/pm-calendar/README.md,project,document project install and package bootstrap packages/pm-search-advanced/README.md,project,document expanded search-advanced flags plugins/pm-claude/agents/pm-coordinator.md,project,sync MCP tool list - plugins/pm-claude/commands/pm-init.md,project,sync MCP tool list plugins/pm-claude/README.md,project,remove stale pm_guide tool documentation + plugins/pm-claude/skills/pm-init/SKILL.md,project,sync MCP tool list plugins/pm-codex/README.md,project,sync MCP tool list README.md,project,remove private telemetry mode from public release docs close_reason: Consolidated perf/reliability umbrella scope delivered and merged in PR #75. diff --git a/.agents/pm/features/pm-v7dj.toon b/.agents/pm/features/pm-v7dj.toon index ccfd836be..37717824c 100644 --- a/.agents/pm/features/pm-v7dj.toon +++ b/.agents/pm/features/pm-v7dj.toon @@ -6,7 +6,7 @@ status: closed priority: 1 tags[6]: agent-ux,context-efficiency,plan,planning,pm-cli,progressive-disclosure created_at: "2026-05-17T08:39:33.695Z" -updated_at: "2026-09-19T08:41:59.832Z" +updated_at: "2026-09-27T07:45:33.220Z" closed_at: "2026-05-17T13:46:55.642Z" author: codex-agent acceptance_criteria: "Built-in Plan item type exists and --type plan resolves to Plan; Plan items are stored in normal pm item storage with full history hash-chain tracking; plan metadata captures scope, harness provenance, ordered steps, step links, decisions, discoveries, validation, and resume context; pm plan create/show/add-step/update-step/complete-step/block-step/link/materialize/approve expose agent-optimized workflows; steps can link pm dependencies and related items; outputs default to low-token TOON with JSON/fields/depth projections; search indexes Plan scope/steps/decisions/discoveries/dependencies; SDK/MCP/plugins/docs/dogfood cover Codex/Claude/Cursor-style usage; focused tests and isolated dogfood prove behavior." @@ -45,8 +45,7 @@ notes[2]{created_at,author,text}: "2026-05-17T08:40:15.335Z",codex-agent,"Concrete command sketch for `pm plan`:\n- `pm plan create --title \"...\" --scope pm-xxxx --related pm-yyyy --claim --json` creates a durable plan attached to an item or request.\n- `pm plan add-step --text \"...\" --depends-on pm-xxxx --related pm-yyyy --status pending` records a linked step.\n- `pm plan update-step 2 --status in_progress --evidence \"...\"` should enforce a single active step unless `--allow-multiple-active` is passed.\n- `pm plan complete-step 2 --evidence \"tests passed\"` is the harness-equivalent checklist completion mutation.\n- `pm plan show --depth brief|standard|deep --fields id,current_step,linked_items --json` gives progressive-disclosure reads.\n- `pm plan materialize --steps 2,3 --type Task --parent pm-xxxx` converts selected steps into real pm items and links them back with discovered_from/implements relationships.\n\nSuggested JSON shape: `{ id, scope_item_id, title, status, current_step_id, steps:[{id, order, text, status, linked_items:[{id, kind}], evidence, updated_at}], summary:{pending,active,blocked,completed}, next_actions:[...] }`." learnings[1]{created_at,author,text}: "2026-05-17T08:40:26.762Z",codex-agent,"Existing `pm-planner` plugin assets are workflow guidance, not a durable first-class plan artifact. The durable gap is a core/SDK/MCP plan state model that agents can update like harness checklists while linking each step to pm dependencies and related work. Keep the MVP harness-neutral and expose stable JSON so Codex, Claude Code, Cursor, and plugins can adapt it without hardcoding one harness model into core." -docs[2]{path,scope,note}: - plugins/pm-claude/commands/pm-planner.md,project,existing Claude slash-command planning loop reference +docs[1]{path,scope,note}: plugins/pm-claude/skills/pm-planner/SKILL.md,project,existing Claude planner skill reference close_reason: "Parent Feature closed after all three child tasks (pm-jauk, pm-ze5g, pm-aqat) implemented and verified: Plan built-in type + storage + search corpus, pm plan command family with full step lifecycle, and SDK/MCP/plugins/docs/dogfood exposure. 1355 tests passing at 100% coverage; release Sentry/telemetry gates green; dogfood-package-first.mjs ok=true." body: "Brainstormed design for a first-class `pm plan` command optimized for agent harness planning loops.\n\nProblem framing:\n- Modern harnesses already expose an ephemeral plan surface: Codex update_plan, Claude Code task/todo panels, Cursor-style planning/checklist flows. Those are useful in-session but weak as durable project memory.\n- `pm plan` should bridge that gap: keep the familiar lightweight plan/update loop while storing enough structured links to make plans searchable, resumable, auditable, and connected to pm items.\n- The command should not replace Epics/Features/Tasks. It should be a progressive-disclosure planning artifact that can later materialize, link, or update pm items.\n\nCore product idea:\n- `pm plan create` starts a plan attached to a scope item or ad-hoc request, with optional `--parent`, `--related`, `--blocks`, `--blocked-by`, `--from-search`, and `--claim` helpers.\n- `pm plan add-step` records ordered steps with `pending|in_progress|completed|blocked|skipped` status, owner, confidence, evidence, and optional linked pm IDs.\n- `pm plan update-step` mirrors agent harness plan updates: exactly one active step by default, deterministic reorder/replace semantics, and append-only history entries.\n- `pm plan link` attaches dependencies or related work after discovery without forcing item creation.\n- `pm plan materialize` can turn selected plan steps into pm tasks/features while preserving links back to the source plan.\n- `pm plan show` defaults to brief TOON, with `--depth standard|deep`, `--fields`, `--json`, and `--for-agent` projection modes.\n\nAgent optimization principles:\n- Low-token first: default output should show plan id, scope, current step, blocked steps, linked item IDs, and next command hints; deep detail should be opt-in.\n- Harness-compatible vocabulary: create/update/complete/block steps map directly to Codex update_plan, Claude TodoWrite/TaskCreate, and Cursor plan checklist behavior.\n- Dependency-first flow: every step may link `depends_on`, `related`, `blocks`, `implements`, `verifies`, or `discovered_from` pm IDs.\n- Search-native storage: plan title, summary, step text, linked item titles, evidence comments, and decisions should enter the keyword/semantic corpus.\n- Progressive disclosure: plans can begin as lightweight local session checklists and later gain item links, acceptance criteria, files/tests/docs, or materialized children.\n- Safe automation: every mutation writes history; plan close requires explicit resolution/evidence; linked test/file/doc mutation boundaries remain existing pm commands.\n\nOpen design questions:\n- Storage model: dedicated `plans/pm-plan-*.toon` artifacts versus plan sections embedded on a normal pm item. Dedicated artifacts are cleaner for many ephemeral plans; embedded plans are simpler and inherit item lifecycle.\n- ID model: separate `pl-xxxx` ids versus normal pm item IDs. Separate ids avoid polluting task lists; normal items are easier for existing search/list/deps.\n- Status semantics: whether a completed plan means the plan was executed, or only that the plan was handed off/materialized.\n- UI contract: whether `pm plan` should emit direct harness adapter hints or stay harness-neutral and expose stable JSON for plugins/MCP to translate.\n\nRecommended MVP:\n1. Implement `pm plan create|show|update|add-step|complete-step|block-step|link|close` as a core command family with TOON/JSON output.\n2. Store plans as a typed metadata section on a pm item first, because it reuses existing history, search, ownership, and dependency machinery.\n3. Add `pm plan create --scope ` and `pm plan link --step --related ` so agents can attach discovered context without creating duplicate tasks.\n4. Add `pm plan materialize --steps 2,4 --type Task --parent ` after the basic loop is stable.\n5. Add SDK/MCP contracts and plugin commands for Codex/Claude once the CLI contract is stable.\n\n## 2026-05-17 Research Update: Make plans a first-class `Plan` item type\n\nDecision: implement plans as a normal built-in pm item type named `Plan`, with lowercase `plan` accepted through the existing case-insensitive type resolver. This is better than a separate `plans/` artifact model because it reuses item storage, search, dependencies, ownership, comments, notes, learnings, linked files/docs/tests, validation, and history streams immediately.\n\nCurrent repo facts for implementers:\n- Built-in item types currently live in `src/types.ts` as `BUILTIN_ITEM_TYPE_VALUES`.\n- Built-in type folder mapping currently lives in `src/core/shared/constants.ts` as `TYPE_TO_FOLDER`.\n- The runtime type registry already resolves names case-insensitively through `alias_to_type`, so adding `Plan` should make `--type plan` work without a separate lowercase built-in.\n- Settings and extensions can already add item types, but this feature should be core because agent plan mode is a first-class pm workflow, not a package-only optional workflow.\n- `pm contracts --command create --flags-only --json` currently reports no `Plan` type, so implementation must update contracts/help/completion/runtime schema tests.\n\nOnline research summary:\n- Codex guidance for long-running work favors durable living execution plans that are self-contained, include progress, decision logs, validation, and enough context for a stateless future agent to resume.\n- Claude Code Plan Mode is read-only before approval: it reads files and proposes a plan without writing changes until the user approves. Its emerging Task tools split list creation and updates into `TaskCreate`, `TaskUpdate`, `TaskList`, and `TaskGet`, with statuses `pending`, `in_progress`, and `completed`, plus blocked-by/blocks and owner metadata.\n- Cursor Plan Mode researches the codebase, asks clarifying questions, creates editable plans with file paths and code references, supports creating/updating plans, and can save plans as Markdown for future reference. Cursor's agent best-practices guide says planning before coding is the most impactful workflow change and recommends saving plans to make future agent resumption easier.\n\nSource links used for the research:\n- OpenAI Codex PLANS.md / ExecPlan cookbook: https://developers.openai.com/cookbook/articles/codex_exec_plans\n- OpenAI Codex CLI overview: https://developers.openai.com/codex/cli\n- Claude Code common workflows / Plan Mode: https://code.claude.com/docs/en/common-workflows\n- Claude Agent SDK todo/task tracking: https://code.claude.com/docs/en/agent-sdk/todo-tracking\n- Cursor Plan Mode announcement: https://cursor.com/blog/plan-mode\n- Cursor agent best practices: https://cursor.com/blog/agent-best-practices\n\nRequired `Plan` item metadata shape:\n- `plan_mode`: `draft|research|review|approved|executing|paused|completed|superseded` for plan-specific lifecycle while retaining normal item `status`.\n- `plan_scope`: short statement of the target change or investigation.\n- `plan_harness`: optional `codex|claude-code|cursor|generic` provenance.\n- `plan_steps`: ordered list of stable step ids with `title`, `body`, `status`, `owner`, `evidence`, `linked_items`, `files`, `tests`, `docs`, `created_at`, `updated_at`.\n- `plan_decisions`: append-only decision log entries with decision, rationale, source/evidence, author, timestamp.\n- `plan_discoveries`: surprises, risks, unknowns, and codebase findings discovered during read-only planning.\n- `plan_validation`: expected commands, manual checks, and observable outcomes.\n- `plan_resume_context`: compact summary for a future agent after context compaction or a new session.\n\nStep status model:\n- Support `pending`, `in_progress`, `completed`, `blocked`, `skipped`, and `superseded`.\n- Default invariant: one `in_progress` step per Plan item unless `--allow-multiple-active` is explicit for parallel work.\n- Preserve every step mutation through normal pm history entries. Do not rewrite steps in-place outside pm mutation commands.\n\nDependency and relation model:\n- Use existing pm dependencies for item-level relations: `parent`, `child`, `related`, `blocks`, `discovered_from`.\n- Add step-level `linked_items` entries with `id`, `kind`, `note`, and optional `required_before_step` boolean.\n- `pm plan link --step --related pm-xxxx` should add a step-level link and optionally a top-level item dependency when `--promote-to-item-dep` is passed.\n- `pm plan materialize` should create normal Tasks/Features from selected steps and add bidirectional `discovered_from`/`child` or `related` links.\n\nCommand MVP:\n- `pm create --type Plan --title ...` should work as a normal item create path.\n- `pm plan create --title ... --scope ... --parent pm-xxxx --related pm-yyyy --from-search \"query\"` should create a `Plan` item with duplicate-check/search evidence.\n- `pm plan show --depth brief|standard|deep --fields ... --json` should provide progressive disclosure. Brief should show id, title, plan_mode, current step, blockers, linked pm ids, and next suggested command.\n- `pm plan add-step --title ... --body ... --depends-on pm-xxxx --related pm-yyyy` should append a stable step id.\n- `pm plan update-step --status ... --evidence ...` should patch one step and history-log the mutation.\n- `pm plan complete-step`, `pm plan block-step`, `pm plan reorder-step`, and `pm plan materialize` should be convenience wrappers around the same typed mutation path.\n- SDK/MCP contracts should expose both normal item CRUD support for type `Plan` and dedicated plan actions for harness-native integrations.\n\nOutput requirements:\n- Default TOON output must be low-token and agent-readable.\n- JSON output must include deterministic fields: `item`, `plan`, `current_step`, `steps_summary`, `linked_items`, `next_actions`, and `history_event` or mutation summary.\n- `--fields` must support low-token projections such as `id,title,plan_mode,current_step,blocked_steps,linked_items`.\n- Search corpus must include plan scope, step titles/bodies, decisions, discoveries, validation, dependencies, and linked docs/files/tests.\n\nSafety and history requirements:\n- Plan items must use the same history hash-chain behavior as all other pm items.\n- Every step add/update/reorder/link/materialize mutation must produce a history entry.\n- Read-only planning should be representable without code edits: `plan_mode=research|review` and item `status=open|in_progress` are enough.\n- Approval to execute should be explicit: `pm plan approve ` can set `plan_mode=approved`, while normal implementation claims/status continue through existing item workflow.\n- Closing a Plan item should require evidence of one of: implemented/materialized, superseded by another plan/item, canceled with rationale, or completed as analysis-only.\n\nImplementation touchpoints:\n- `src/types.ts`: add `Plan` to `BUILTIN_ITEM_TYPE_VALUES`.\n- `src/core/shared/constants.ts`: map `Plan` to a `plans` folder and include folder creation/defaults where required.\n- `src/core/item/type-registry.ts`: confirm lowercase alias behavior and add tests that `--type plan` resolves to `Plan`.\n- `src/core/item/item-format.ts` and `src/types.ts`: add typed plan metadata fields if the project chooses strong typing over generic metadata.\n- `src/core/search/corpus.ts` and search command tests: include plan fields in keyword/semantic corpus.\n- `src/cli/commands/create.ts`, `update.ts`, and help/usage surfaces: ensure `Plan` participates in create/update validation without schedule presets.\n- New `src/cli/commands/plan.ts`: dedicated step lifecycle commands.\n- `src/cli/main.ts`, `src/cli/commands/index.ts`, completion, help, contracts, SDK and MCP surfaces: register/discover `pm plan`.\n- Plugins `plugins/pm-claude` and `plugins/pm-codex`: add slash commands/skills once core contracts exist.\n- `scripts/dogfood-package-first.mjs`: add Plan create/show/update/link/materialize smoke coverage.\n\nRecommended child implementation order:\n1. Add built-in `Plan` item type and folder/runtime/schema/search integration.\n2. Add `pm plan` command family with typed step lifecycle mutations and history tests.\n3. Add SDK/MCP/plugin/docs/dogfood coverage and agent-harness examples.\n\n## 2026-05-17 Implementation Verification\n\n- Commit 3f414541 \"Add first-class pm plan command and Plan item type for agent harness workflows.\" pushed to main.\n- GitHub Actions run 25992642283 (CI): success across Ubuntu/macOS/Windows on Node 20/22/24 + Gates job.\n- Sentry/telemetry gate (`scripts/release/sentry-telemetry-gate.mjs --telemetry-mode required`): critical=0, high=0, total=0; telemetry finish_error_rate_pct=2.06; failures_without_error_code_rows=0.\n- Dogfood (`scripts/dogfood-package-first.mjs`): ok=true (69 commands run end-to-end including new Plan lifecycle).\n- `node scripts/check-secrets.mjs`: no credential-like secrets detected.\n- Coverage: 1355 tests pass at 100% statements/branches/functions/lines.\n- pm health: ok=true." diff --git a/.agents/pm/features/pm-xm7c.toon b/.agents/pm/features/pm-xm7c.toon index bc0afe9a7..ef854f06e 100644 --- a/.agents/pm/features/pm-xm7c.toon +++ b/.agents/pm/features/pm-xm7c.toon @@ -6,7 +6,7 @@ status: closed priority: 2 tags[3]: cli,multi-agent,sdk-first created_at: "2026-07-19T14:43:37.560Z" -updated_at: "2026-09-22T05:18:35.525Z" +updated_at: "2026-09-27T07:45:34.998Z" closed_at: "2026-07-20T12:47:19.609Z" author: maintainer-agent estimated_minutes: 240 @@ -72,7 +72,7 @@ test_runs[2]{run_id,kind,status,started_at,finished_at,recorded_at,passed,failed docs[4]{path,scope,note}: docs/COMMANDS.md,project,CLI atomic batch workflow docs/SDK.md,project,public atomic structured mutation reference - plugins/pm-claude/commands/pm-init.md,project,30-tool initialization summary plugins/pm-claude/README.md,project,pm_mutate and 30-tool reference + plugins/pm-claude/skills/pm-init/SKILL.md,project,30-tool initialization summary close_reason: Delivered broad SDK/CLI structured mutation platform plus final bot hardening with exact 100% coverage. body: "" diff --git a/.agents/pm/history/pm-1265.jsonl b/.agents/pm/history/pm-1265.jsonl index 753b9e6e7..1e468831b 100644 --- a/.agents/pm/history/pm-1265.jsonl +++ b/.agents/pm/history/pm-1265.jsonl @@ -21,3 +21,4 @@ {"ts":"2026-07-26T16:50:14.716Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T16:50:14.716Z"},{"op":"add","path":"/metadata/release","value":"v2026.5.18"}],"before_hash":"899a8e3318030dc61b205e766221887b0a66c33a433f643743e286fcb07b0777","after_hash":"08be4e7ee47b14befd5166accf85ce0ee0e84befd5ebfbe4da5b5e575ff81c1d","message":"Historical release attribution backfill (pm-3j6it6): stamp the release tag whose window contains this item close event, derived from its immutable history stream, so changelog attribution stops depending on updated_at"} {"ts":"2026-07-26T17:00:45.750Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"add","path":"/metadata/dependencies/2","value":{"id":"pm-7t04","kind":"implements","created_at":"2026-07-26T17:00:45.511Z"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T17:00:45.750Z"}],"before_hash":"08be4e7ee47b14befd5166accf85ce0ee0e84befd5ebfbe4da5b5e575ff81c1d","after_hash":"d017c65abcedcf21183a5fd5b8631b1caf729c14b0c56645f88fa0296dc07b0d","message":"Terminal graph backfill (pm-lnrk / pm-3j6it6 lane): add 1 evidence-derived relationship edge(s). Evidence classes used: typed hierarchy mirror so semantic traversal reaches the owning lineage (parent alone is not a traversable semantic kind). Release attribution is stamped, so this metadata write cannot re-bucket the item in the generated changelog."} {"hash_algorithm":"sha256","ts":"2026-09-19T08:39:14.597Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"e700c3209edd3b60c0371159","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-pivf+pm-wrbe","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-19T08:39:14.597Z"},{"op":"add","path":"/metadata/closed_at","value":"2026-05-17T10:10:58.420Z"}],"before_hash":"d017c65abcedcf21183a5fd5b8631b1caf729c14b0c56645f88fa0296dc07b0d","after_hash":"39c90e4f8bc0e5d58681400b02d3defeefb4a5c4253f0ee99f24bc6cc5908fa2","item_hash_version":3,"message":"Backfill closed_at from verified lifecycle history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"8ff40f352750bc03c31f432c427d1f5ed8da0dc4719e9fdc6e48c4e859c94ae1"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:45:38.353Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/3/path","value":"plugins/pm-claude/skills/pm-init/SKILL.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:45:38.353Z"}],"before_hash":"39c90e4f8bc0e5d58681400b02d3defeefb4a5c4253f0ee99f24bc6cc5908fa2","after_hash":"6f816a04c9c56d9342a38124371d6cab2062e515f3677df9c95e777a4bf074e6","item_hash_version":3,"message":"Claude plugin commands migrated to native skills; preserve historical linked evidence","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"917364395dd94b2e50a703922e32112a3114b50fba2257ce209c7d1308294833"} diff --git a/.agents/pm/history/pm-3y56.jsonl b/.agents/pm/history/pm-3y56.jsonl index 3b7e977a8..bcb5c1d00 100644 --- a/.agents/pm/history/pm-3y56.jsonl +++ b/.agents/pm/history/pm-3y56.jsonl @@ -10,3 +10,4 @@ {"ts":"2026-07-26T16:50:38.127Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T16:50:38.127Z"},{"op":"add","path":"/metadata/release","value":"v2026.5.27"}],"before_hash":"bef1c17389baa29945ca028118ae71af4c322b52de2dd813358893bc1530adf7","after_hash":"33913bc87866caf134be748ec8247c8745fb5c011c5cbdc16045f4e4d17126b0","message":"Historical release attribution backfill (pm-3j6it6): stamp the release tag whose window contains this item close event, derived from its immutable history stream, so changelog attribution stops depending on updated_at"} {"ts":"2026-07-26T17:03:31.080Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T17:03:31.080Z"},{"op":"add","path":"/metadata/dependencies","value":[{"id":"pm-aqat","kind":"related","created_at":"2026-07-26T17:03:30.882Z"},{"id":"pm-rnpb","kind":"implements","created_at":"2026-07-26T17:03:30.882Z"}]}],"before_hash":"33913bc87866caf134be748ec8247c8745fb5c011c5cbdc16045f4e4d17126b0","after_hash":"c21e4ea21017ce95ac424532986b7be1c370f87a280965efdd5a83bac7616844","message":"Terminal graph backfill (pm-lnrk / pm-3j6it6 lane): add 2 evidence-derived relationship edge(s). Evidence classes used: explicit item identifier recorded in this item durable text (description, body, comments, notes, resolution or close reason); typed hierarchy mirror so semantic traversal reaches the owning lineage (parent alone is not a traversable semantic kind). Release attribution is stamped, so this metadata write cannot re-bucket the item in the generated changelog."} {"hash_algorithm":"sha256","ts":"2026-09-19T08:39:23.778Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"e700c3209edd3b60c0371159","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-pivf+pm-wrbe","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-19T08:39:23.778Z"},{"op":"add","path":"/metadata/closed_at","value":"2026-05-25T00:22:23.205Z"}],"before_hash":"c21e4ea21017ce95ac424532986b7be1c370f87a280965efdd5a83bac7616844","after_hash":"9081a8c267b24eaa56c9979626227a852a30a26e458bbea6cca7839b735de945","item_hash_version":3,"message":"Backfill closed_at from verified lifecycle history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"8a25dc546d83b5f511d5681b7b30e95d89283d2b36af61d130d44bfab0416874"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:45:18.538Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"remove","path":"/metadata/docs/3"},{"op":"replace","path":"/metadata/docs/2/path","value":"plugins/pm-codex/skills/pm-native/SKILL.md"},{"op":"replace","path":"/metadata/docs/1/path","value":"plugins/pm-claude/skills/pm-planner/SKILL.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:45:18.538Z"}],"before_hash":"9081a8c267b24eaa56c9979626227a852a30a26e458bbea6cca7839b735de945","after_hash":"7271b4ed5b7e5a68e31bbbacecf0160212b647fd1e9714bc3d8867a3e454fe59","item_hash_version":3,"message":"Claude plugin command migrated to native skill; preserve historical documentation link","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"1570f265db91f575e54f34553f1df4497269160bd89434993ae48b641a1cfa9f"} diff --git a/.agents/pm/history/pm-7t04.jsonl b/.agents/pm/history/pm-7t04.jsonl index a03ecad95..8b2e93f38 100644 --- a/.agents/pm/history/pm-7t04.jsonl +++ b/.agents/pm/history/pm-7t04.jsonl @@ -60,3 +60,4 @@ {"hash_algorithm":"sha256","ts":"2026-09-19T08:39:40.735Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"e700c3209edd3b60c0371159","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-pivf+pm-wrbe","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-19T08:39:40.735Z"},{"op":"add","path":"/metadata/closed_at","value":"2026-05-17T10:24:19.569Z"}],"before_hash":"7e502599ae3b4a356ecbd7847da8a7cd4c1a9d84d5ccd7310d19c381d00347f0","after_hash":"660f54362efc26b01f3c3eb0e90b5f325b0a73d35a2dbe110d3a3b2a091c5092","item_hash_version":3,"message":"Backfill closed_at from verified lifecycle history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"435f7604536bb47a9da6ed970116442ef2e043ebceca94cbde1abb4c5ab59719"} {"hash_algorithm":"sha256","ts":"2026-09-22T05:05:02.745Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"37413fb51dc068370cfb0fdc","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-f4yn","claim:pm-j8z6","claim:pm-kb5h","lineage:pm-j8z6","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-f4yn+pm-j8z6+pm-kb5h","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-f4yn","claim:pm-j8z6","claim:pm-kb5h","lineage:pm-j8z6","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/22/note","value":"settings key order and schema coverage"},{"op":"replace","path":"/metadata/files/22/path","value":"tests/unit/settings-store.spec.ts"},{"op":"replace","path":"/metadata/files/21/note","value":"sdk action optional key coverage"},{"op":"replace","path":"/metadata/files/21/path","value":"tests/unit/sdk-index.spec.ts"},{"op":"replace","path":"/metadata/files/20/note","value":"Guidance mode unit coverage"},{"op":"replace","path":"/metadata/files/20/path","value":"tests/unit/init-command.spec.ts"},{"op":"replace","path":"/metadata/files/19/note","value":"init flags contract coverage"},{"op":"replace","path":"/metadata/files/19/path","value":"tests/unit/contracts-command.spec.ts"},{"op":"replace","path":"/metadata/files/18/note","value":"completion surface coverage"},{"op":"replace","path":"/metadata/files/18/path","value":"tests/unit/completion-command.spec.ts"},{"op":"replace","path":"/metadata/files/17/note","value":"runtime ordering and uncovered-files guard update"},{"op":"replace","path":"/metadata/files/17/path","value":"tests/integration/release-readiness-runtime.spec.ts"},{"op":"replace","path":"/metadata/files/16/note","value":"init status/skip/add integration coverage"},{"op":"replace","path":"/metadata/files/16/path","value":"tests/integration/cli.integration.spec.ts"},{"op":"replace","path":"/metadata/files/15/note","value":"PmSettings agent guidance types"},{"op":"replace","path":"/metadata/files/15/path","value":"src/types.ts"},{"op":"replace","path":"/metadata/files/14/note","value":"init action contract options"},{"op":"replace","path":"/metadata/files/14/path","value":"src/sdk/cli-contracts.ts"},{"op":"replace","path":"/metadata/files/13/note","value":"agent guidance persistence schema"},{"op":"replace","path":"/metadata/files/13/path","value":"src/core/store/settings.ts"},{"op":"replace","path":"/metadata/files/12/note","value":"settings defaults for guidance state"},{"op":"replace","path":"/metadata/files/12/path","value":"src/core/shared/constants.ts"},{"op":"replace","path":"/metadata/files/11/note","value":"init option wiring"},{"op":"replace","path":"/metadata/files/11/path","value":"src/cli/register-setup.ts"},{"op":"replace","path":"/metadata/files/10/note","value":"init help guidance"},{"op":"replace","path":"/metadata/files/10/path","value":"src/cli/help-content.ts"},{"op":"replace","path":"/metadata/files/9/note","value":"init detection prompt and write orchestration"},{"op":"replace","path":"/metadata/files/9/path","value":"src/cli/commands/workspace/init.ts"},{"op":"replace","path":"/metadata/files/8/note","value":"New guidance detector and writer module"},{"op":"replace","path":"/metadata/files/8/path","value":"src/cli/commands/workspace/init-agent-guidance.ts"},{"op":"replace","path":"/metadata/files/7/note","value":"Bash/zsh/fish completion updates"},{"op":"replace","path":"/metadata/files/7/path","value":"src/cli/commands/completion.ts"},{"op":"replace","path":"/metadata/files/6/note","value":"dogfood assertions for init guidance lifecycle"},{"op":"replace","path":"/metadata/files/6/path","value":"scripts/dogfood-package-first.mjs"},{"op":"replace","path":"/metadata/files/5/note","value":"Codex automation hint for options.agentGuidance"},{"op":"replace","path":"/metadata/files/5/path","value":"plugins/pm-codex/README.md"},{"op":"replace","path":"/metadata/files/4/note","value":"pm_run init examples for guidance modes"},{"op":"replace","path":"/metadata/files/4/path","value":"plugins/pm-claude/commands/pm-init.md"},{"op":"replace","path":"/metadata/files/3/note","value":"Init guidance lifecycle docs"},{"op":"replace","path":"/metadata/files/3/path","value":"docs/QUICKSTART.md"},{"op":"replace","path":"/metadata/files/2/note","value":"Init guidance mode command reference"},{"op":"replace","path":"/metadata/files/2/path","value":"docs/COMMANDS.md"},{"op":"replace","path":"/metadata/files/1/note","value":"Agent bootstrap guidance checks"},{"op":"replace","path":"/metadata/files/1/path","value":"docs/AGENT_GUIDE.md"},{"op":"replace","path":"/metadata/files/0/note","value":"compact progressive-disclosure agent entrypoint"},{"op":"replace","path":"/metadata/files/0/path","value":"AGENTS.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-22T05:05:02.745Z"}],"before_hash":"660f54362efc26b01f3c3eb0e90b5f325b0a73d35a2dbe110d3a3b2a091c5092","after_hash":"34e74721d01378a0775695f7fadb5cdbae1ae7cee7d6110f9058f9adaf99e7e7","item_hash_version":3,"message":"pm-kb5h/pm-j8z6: migrate current source/spec links to command domains; preserve link notes and immutable delivery history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"c08b3c69bb637ab348ee7a3d7230bd57e80a17931961b2240b13890b1160e78c"} {"hash_algorithm":"sha256","ts":"2026-09-22T05:25:13.685Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"37413fb51dc068370cfb0fdc","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-f4yn","claim:pm-j8z6","claim:pm-kb5h","lineage:pm-j8z6","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-f4yn+pm-j8z6+pm-kb5h","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-f4yn","claim:pm-j8z6","claim:pm-kb5h","lineage:pm-j8z6","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/14/note","value":"New guidance detector and writer module"},{"op":"replace","path":"/metadata/files/14/path","value":"src/sdk/init-agent-guidance.ts"},{"op":"replace","path":"/metadata/files/13/note","value":"init action contract options"},{"op":"replace","path":"/metadata/files/13/path","value":"src/sdk/cli-contracts.ts"},{"op":"replace","path":"/metadata/files/12/note","value":"agent guidance persistence schema"},{"op":"replace","path":"/metadata/files/12/path","value":"src/core/store/settings.ts"},{"op":"replace","path":"/metadata/files/11/note","value":"settings defaults for guidance state"},{"op":"replace","path":"/metadata/files/11/path","value":"src/core/shared/constants.ts"},{"op":"replace","path":"/metadata/files/10/note","value":"init option wiring"},{"op":"replace","path":"/metadata/files/10/path","value":"src/cli/register-setup.ts"},{"op":"replace","path":"/metadata/files/9/note","value":"init help guidance"},{"op":"replace","path":"/metadata/files/9/path","value":"src/cli/help-content.ts"},{"op":"replace","path":"/metadata/files/8/note","value":"init detection prompt and write orchestration"},{"op":"replace","path":"/metadata/files/8/path","value":"src/cli/commands/workspace/init.ts"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-22T05:25:13.685Z"}],"before_hash":"34e74721d01378a0775695f7fadb5cdbae1ae7cee7d6110f9058f9adaf99e7e7","after_hash":"d9844de2a8cf05a7a4a86409211c5dc3e4e30525f41c65aded59fa119f161382","item_hash_version":3,"message":"pm-f4yn/pm-j8z6: retire unused compatibility shims in favor of their SDK owners; reuse existing owner links, preserve prior notes in immutable history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"d6932e48af6a929363e1cb9bba8e38484c326653f9f899cd26c737f51550dcf9"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:45:28.635Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/4/path","value":"plugins/pm-claude/skills/pm-init/SKILL.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:45:28.635Z"}],"before_hash":"d9844de2a8cf05a7a4a86409211c5dc3e4e30525f41c65aded59fa119f161382","after_hash":"9666835d6b36f7887d2c25b50c995afdd59cf02e33225ee0406710ff329fba85","item_hash_version":3,"message":"Claude plugin commands migrated to native skills; preserve historical linked evidence","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"ac713ed47de9e87d49127d93bed5aacc36a7c304d14d60d87e05be19be076ae5"} diff --git a/.agents/pm/history/pm-aqat.jsonl b/.agents/pm/history/pm-aqat.jsonl index e2cd8c881..fe55d253f 100644 --- a/.agents/pm/history/pm-aqat.jsonl +++ b/.agents/pm/history/pm-aqat.jsonl @@ -8,3 +8,5 @@ {"ts":"2026-07-26T16:50:14.483Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T16:50:14.483Z"},{"op":"add","path":"/metadata/release","value":"v2026.5.18"}],"before_hash":"09e4a943c9ce739ef3e45d7d970d0e919d7508354d5778a4f105b73fe24fc685","after_hash":"9c506e60c49908510866efc1c6f6979d15df79f2d24c59815aed1901dde57c38","message":"Historical release attribution backfill (pm-3j6it6): stamp the release tag whose window contains this item close event, derived from its immutable history stream, so changelog attribution stops depending on updated_at"} {"ts":"2026-07-26T17:09:24.406Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"add","path":"/metadata/dependencies/2","value":{"id":"pm-v7dj","kind":"implements","created_at":"2026-07-26T17:09:24.115Z"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T17:09:24.406Z"}],"before_hash":"9c506e60c49908510866efc1c6f6979d15df79f2d24c59815aed1901dde57c38","after_hash":"8117c03d557324524b806448eb3aac998209fea72470aa9baffce49c5be1064c","message":"Terminal graph backfill (pm-lnrk / pm-3j6it6 lane): add 1 evidence-derived relationship edge(s). Evidence classes used: typed hierarchy mirror so semantic traversal reaches the owning lineage (parent alone is not a traversable semantic kind). Release attribution is stamped, so this metadata write cannot re-bucket the item in the generated changelog."} {"hash_algorithm":"sha256","ts":"2026-09-19T08:39:51.892Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"e700c3209edd3b60c0371159","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-pivf+pm-wrbe","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-19T08:39:51.892Z"},{"op":"add","path":"/metadata/closed_at","value":"2026-05-17T13:46:45.696Z"}],"before_hash":"8117c03d557324524b806448eb3aac998209fea72470aa9baffce49c5be1064c","after_hash":"ee4fa115e87d28456a56756b7cf635a363f3e97bacfdde0d8d5b07fd30e2be8f","item_hash_version":3,"message":"Backfill closed_at from verified lifecycle history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"5e0822c787b7fe14b55057913d0c59d561208fe4e494375c1542f7fcc646e8cb"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:45:40.175Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"remove","path":"/metadata/files/9"},{"op":"replace","path":"/metadata/files/8/note","value":"Plan SDK action boundary regression"},{"op":"replace","path":"/metadata/files/8/path","value":"tests/unit/sdk-index.spec.ts"},{"op":"replace","path":"/metadata/files/7/note","value":"Plan docs/help release-readiness regression"},{"op":"replace","path":"/metadata/files/7/path","value":"tests/integration/release-readiness-runtime.spec.ts"},{"op":"replace","path":"/metadata/files/6/note","value":"Plan plugin contract regression"},{"op":"replace","path":"/metadata/files/6/path","value":"tests/integration/claude-plugin-contract.spec.ts"},{"op":"replace","path":"/metadata/files/5/note","value":"Plan SDK contract discovery"},{"op":"replace","path":"/metadata/files/5/path","value":"src/sdk/cli-contracts.ts"},{"op":"replace","path":"/metadata/files/4/note","value":"Plan MCP schema/action exposure"},{"op":"replace","path":"/metadata/files/4/path","value":"src/mcp/server.ts"},{"op":"replace","path":"/metadata/files/3/note","value":"Plan workflow dogfood coverage"},{"op":"replace","path":"/metadata/files/3/path","value":"scripts/dogfood-package-first.mjs"},{"op":"replace","path":"/metadata/files/2/note","value":"Codex native Plan workflow skill"},{"op":"replace","path":"/metadata/files/2/path","value":"plugins/pm-codex/skills/pm-native/SKILL.md"},{"op":"replace","path":"/metadata/files/1/note","value":"Codex plugin Plan workflow docs"},{"op":"replace","path":"/metadata/files/1/path","value":"plugins/pm-codex/README.md"},{"op":"replace","path":"/metadata/files/0/note","value":"Claude planner skill should adopt pm plan"},{"op":"replace","path":"/metadata/files/0/path","value":"plugins/pm-claude/skills/pm-planner/SKILL.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:45:40.175Z"}],"before_hash":"ee4fa115e87d28456a56756b7cf635a363f3e97bacfdde0d8d5b07fd30e2be8f","after_hash":"f1e124f6a84d12968b3b0d2263f0af476efa2f73ff1cf4d9ffbbe2d745eb48da","item_hash_version":3,"message":"Claude plugin commands migrated to native skills; preserve historical linked evidence","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"c3ba06d58b9309a1a300968cd721834b63cb46f25bda1a7051e01586dba19a9e"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:45:41.515Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"remove","path":"/metadata/docs/2"},{"op":"replace","path":"/metadata/docs/1/note","value":"Codex plugin Plan workflow docs target"},{"op":"replace","path":"/metadata/docs/1/path","value":"plugins/pm-codex/README.md"},{"op":"replace","path":"/metadata/docs/0/note","value":"existing planner skill docs to migrate"},{"op":"replace","path":"/metadata/docs/0/path","value":"plugins/pm-claude/skills/pm-planner/SKILL.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:45:41.515Z"}],"before_hash":"f1e124f6a84d12968b3b0d2263f0af476efa2f73ff1cf4d9ffbbe2d745eb48da","after_hash":"be237fe6ba0be196ae2dbaf5701d245d7c386e71cc21e26115414e1527d6a3ad","item_hash_version":3,"message":"Claude plugin commands migrated to native skills; preserve historical linked evidence","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"bcf79ea03cc1b8c52e0c63fd13cc01a71261865df26619190c98c6929bdaad82"} diff --git a/.agents/pm/history/pm-cg1sjb.jsonl b/.agents/pm/history/pm-cg1sjb.jsonl index 88f171939..cb9ae7c1d 100644 --- a/.agents/pm/history/pm-cg1sjb.jsonl +++ b/.agents/pm/history/pm-cg1sjb.jsonl @@ -30,3 +30,5 @@ {"ts":"2026-08-12T02:34:14.857Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_instance":"09d99a3d99ca542892066fe0","agent_provenance":{"model":null,"effort":null,"role":{"value":"release-operator","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-cg1sjb","release:pm-5q8wa0"]},"topic":{"value":"pm-cg1sjb","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-cg1sjb","release:pm-5q8wa0"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/6","value":{"created_at":"2026-08-12T02:34:14.857Z","author":"harness:codex","text":"Merged-head evidence: PR #983 merged median-of-five import admission with discarded warm-up, unchanged budgets, diagnostic p95, and strict maximum RSS at 17b40763f. Main CodSpeed run 31556883858 and CI run 31556883969 passed, including static gate and the persistent-regression negative control."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-08-12T02:34:14.857Z"}],"before_hash":"ca2b9fdcf1488b2b7dd4ca29f7e479f0c323ce8f39b378bcf46bc447b3bfb74b","after_hash":"9f4d79ae08ada0507f31c406e286608eabc0422f6646a86e6dd3c87cc3c4a12f","item_hash_version":2} {"ts":"2026-08-12T02:34:15.554Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_instance":"09d99a3d99ca542892066fe0","agent_provenance":{"model":null,"effort":null,"role":{"value":"release-operator","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-cg1sjb","release:pm-5q8wa0"]},"topic":{"value":"pm-cg1sjb","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-cg1sjb","release:pm-5q8wa0"]}},"op":"close","patch":[{"op":"replace","path":"/metadata/actual_result","value":"The five-sample median policy and negative controls merged in 17b40763f; merged-head benchmark and CI workflows passed."},{"op":"replace","path":"/metadata/expected_result","value":"A single noisy process cannot fail the gate; genuinely over-budget repeated samples still fail and RSS remains fail-closed."},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-08-12T02:34:15.554Z"},{"op":"replace","path":"/metadata/status","value":"closed"},{"op":"add","path":"/metadata/closed_at","value":"2026-08-12T02:34:15.523Z"},{"op":"add","path":"/metadata/completed_at","value":"2026-08-12T02:34:15.523Z"},{"op":"add","path":"/metadata/resolution","value":"SDK entrypoint import cost admission is resilient to isolated scheduler or cache outliers while still failing a majority persistent slowdown against unchanged budgets."},{"op":"add","path":"/metadata/close_reason","value":"Merged in PR #983 with exact merged-head verification"}],"before_hash":"9f4d79ae08ada0507f31c406e286608eabc0422f6646a86e6dd3c87cc3c4a12f","after_hash":"7b5138c50bf11efa4541c6d03c288621a8d7f6af75572f9eae1ae372aac7ea45","item_hash_version":2} {"ts":"2026-08-12T02:34:16.221Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_instance":"09d99a3d99ca542892066fe0","agent_provenance":{"model":null,"effort":null,"role":{"value":"release-operator","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-cg1sjb","release:pm-5q8wa0"]},"topic":{"value":"pm-cg1sjb","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-cg1sjb","release:pm-5q8wa0"]}},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"replace","path":"/metadata/updated_at","value":"2026-08-12T02:34:16.221Z"}],"before_hash":"7b5138c50bf11efa4541c6d03c288621a8d7f6af75572f9eae1ae372aac7ea45","after_hash":"d6de143422ad9b14ffe6105ad78e3c744876e3cdfec3241f74c857ba5dee15ff","item_hash_version":2} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:27:18.288Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/7","value":{"created_at":"2026-09-27T08:27:18.288Z","author":"harness:codex","text":"2026-09-27 recurrence on unchanged SDK entrypoint bundles during pm-dudr/pm-erogk1 validation: aggregate quality:static failed ./sdk/merge median 233ms > 226ms; immediate isolated --check failed a different entrypoint, ./sdk/governance 330ms > 327ms; next unchanged isolated --check passed all 10 entrypoints. This is the prior warm-cache nondeterminism signature despite median-of-five, not evidence of an import regression in either changed work item. Follow-up should evaluate host-load-normalized admission without weakening persistent-regression controls."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:27:18.288Z"}],"before_hash":"d6de143422ad9b14ffe6105ad78e3c744876e3cdfec3241f74c857ba5dee15ff","after_hash":"48df86cc4f60d582b6e74e5260bcf917dc8dce14af12e5354aa8549b12056b7b","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"a8486d63f5c66d248d3956fca310266358af061a3104164b86da8a5c23c5d19d"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:29:11.537Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"add","path":"/metadata/dependencies/9","value":{"id":"pm-dudr","kind":"discovered_from","created_at":"2026-09-27T08:29:11.162Z","author":"harness:codex","source_kind":"cli:update:dep","author_source":"detected"}},{"op":"add","path":"/metadata/dependencies/10","value":{"id":"pm-erogk1","kind":"discovered_from","created_at":"2026-09-27T08:29:11.162Z","author":"harness:codex","source_kind":"cli:update:dep","author_source":"detected"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:29:11.537Z"}],"before_hash":"48df86cc4f60d582b6e74e5260bcf917dc8dce14af12e5354aa8549b12056b7b","after_hash":"950b49511b40e6bd64b71fc659183f2bc0f685953e335642fb7d8204c3617f23","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"13d8d0b6a4d5077675490b923b8253d73563249ccafa0983e69bcfc563679c48"} diff --git a/.agents/pm/history/pm-dudr.jsonl b/.agents/pm/history/pm-dudr.jsonl index 1cf2c0258..8054dab68 100644 --- a/.agents/pm/history/pm-dudr.jsonl +++ b/.agents/pm/history/pm-dudr.jsonl @@ -7,3 +7,21 @@ {"ts":"2026-07-24T23:53:23.397Z","author":"maintainer-agent","op":"update","patch":[{"op":"add","path":"/metadata/dependencies/1","value":{"id":"pm-wg07","kind":"related","created_at":"2026-07-24T23:53:23.133Z"}},{"op":"add","path":"/metadata/dependencies/2","value":{"id":"pm-z3ez","kind":"related","created_at":"2026-07-24T23:53:23.133Z"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-07-24T23:53:23.397Z"}],"before_hash":"1eea99fc5e21130317f1926c81ab2af7da2c2c72958a46ac8a7c4afae2eb202f","after_hash":"bcfc46327cbb21d05aba6bab633d2a8d05fb6265bebfe91f5c2d44ecac05b049","message":"Plugin hygiene shares the plugin install and agent-distribution surface"} {"ts":"2026-07-26T05:56:10.657Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","op":"update","patch":[{"op":"add","path":"/metadata/dependencies/3","value":{"id":"pm-ugqx","kind":"implements","created_at":"2026-07-26T05:56:10.428Z"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T05:56:10.657Z"}],"before_hash":"bcfc46327cbb21d05aba6bab633d2a8d05fb6265bebfe91f5c2d44ecac05b049","after_hash":"e7ccfceb9f4781188e2a7742bfb6b05e1f398975acdef351c293de4f92fac286","message":"Strategic reachability edge: mirror the hierarchy rung into the typed layer so every active item resolves to an outcome milestone through an explainable implements path (pm-bzmeaa invariant), which the parent chain alone cannot express because it terminates at the roadmap root rather than at an outcome"} {"ts":"2026-09-08T13:33:39.517Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_model":"claude-fable-5-1","agent_model_source":"probe","agent_instance":"72ded8f654edba84116a543f","agent_provenance":{"model":{"value":"claude-fable-5-1","source":"probe"},"effort":{"value":"xhigh","source":"environment"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-n8a6e7","lineage:pm-n8a6e7","lineage:pm-ydp6","lineage:pm-doxj"]},"topic":{"value":"pm-n8a6e7","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-n8a6e7","lineage:pm-n8a6e7","lineage:pm-ydp6","lineage:pm-doxj"]},"version":{"value":"2.1.263","source":"probe"}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-08T13:33:39.517Z"},{"op":"add","path":"/metadata/expected_result","value":"The Claude plugin matches the official spec on all five flagged points and still validates strictly."}],"before_hash":"e7ccfceb9f4781188e2a7742bfb6b05e1f398975acdef351c293de4f92fac286","after_hash":"d4f0e80b486893f8d06579dfda3f54c312e8d75d5dbc792cdb53260b51491a87","item_hash_version":3,"message":"Record the observable end state this item is expected to produce","event_class":"maintenance","record_hash_version":1,"record_hash":"673b386f3fd0abe0ea1bf59932cdb1f9a99a72398ae1849154450449a0eca2a6"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:01:19.494Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:01:19.494Z"},{"op":"add","path":"/metadata/assignee","value":"harness:codex"},{"op":"add","path":"/metadata/claim_principal","value":"harness:codex#d47f0e0d79925f50a0df2359"}],"before_hash":"d4f0e80b486893f8d06579dfda3f54c312e8d75d5dbc792cdb53260b51491a87","after_hash":"928d68c577ba3a1eaa504a21dabed8f035a9fa33de17a1c488b3431deef62edc","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"9436ad0c95a4b0dc8289f389839818ade63f31815b4572ef9a5d7ca9ae0ec03a"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:01:19.682Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:01:19.682Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"928d68c577ba3a1eaa504a21dabed8f035a9fa33de17a1c488b3431deef62edc","after_hash":"b8007a148e1f11fdf7bcc29f0dd7dbc11d9770779217531ba2ce21936ef81eac","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"c6def5479a31f7ac63e901428d83ec2f66729b175552e448decd53abed56be59"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:08:32.031Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:08:32.031Z"},{"op":"add","path":"/metadata/files","value":[{"path":".claude-plugin/marketplace.json","scope":"project","note":"canonical marketplace catalog"},{"path":"marketplace.json","scope":"project","note":"byte-identical compatibility catalog"},{"path":"plugins/pm-claude/.claude-plugin/plugin.json","scope":"project","note":"current plugin metadata schema"},{"path":"plugins/pm-claude/.mcp.json","scope":"project","note":"schema-clean MCP configuration"},{"path":"scripts/smoke-claude-plugin.mjs","scope":"project","note":"skill inventory and genuine manifest guards"},{"path":"tests/integration/claude-plugin-contract.spec.ts","scope":"project","note":"plugin manifest and invocation contract"},{"path":"tests/unit/scripts/smoke-claude-plugin.spec.ts","scope":"project","note":"smoke behavioral coverage without test-only seam"}]}],"before_hash":"b8007a148e1f11fdf7bcc29f0dd7dbc11d9770779217531ba2ce21936ef81eac","after_hash":"4cbc5cd336dc606df595bd25feab1757055ebd366800e8a7d6212b9c4fc64f57","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"147e3789a7a6a67275f3f8d0269317b3244f756e476521324f107ab298ba0ac5"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:08:32.781Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:08:32.781Z"},{"op":"add","path":"/metadata/docs","value":[{"path":"docs/CLAUDE_CODE_PLUGIN.md","scope":"project","note":"plugin layout and marketplace compatibility invariant"},{"path":"plugins/pm-claude/README.md","scope":"project","note":"Claude plugin inventory"},{"path":"plugins/pm-claude/skills/pm-audit/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-calendar/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-close-task/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-developer/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-init/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-list/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-new/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-planner/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-release/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-search/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-start-task/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-status/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-triage/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"},{"path":"plugins/pm-claude/skills/pm-workflow/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"}]}],"before_hash":"4cbc5cd336dc606df595bd25feab1757055ebd366800e8a7d6212b9c4fc64f57","after_hash":"eba50d0b48a3d29fd657a36f3c0e627acef3c4c8f977f4b8dc31fa53be50c225","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"df1b3246e7340d1eac40f77a5a814da8ba2ea98795eef28662760ce6fe3aaf80"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:08:33.728Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"tests_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:08:33.728Z"},{"op":"add","path":"/metadata/tests","value":[{"command":"node scripts/run-tests.mjs test -- tests/integration/claude-plugin-contract.spec.ts tests/unit/scripts/smoke-claude-plugin.spec.ts","scope":"project","timeout_seconds":240,"provenance":{"author":"harness:codex","created_at":"2026-09-27T07:08:33.619Z","source_kind":"local_mutation","source_ref":"fix/package-install-readiness-claude-plugin-contracts"},"note":"Claude plugin manifest and smoke contract"}]}],"before_hash":"eba50d0b48a3d29fd657a36f3c0e627acef3c4c8f977f4b8dc31fa53be50c225","after_hash":"928af7d8af3c11764d99bb43c6bf088901ffed5ad7fad583c9650f654cd67110","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"e9aec63f240dd54477c91819c36f2e39a83cf3714e3b782541d365ab269c3137"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:08:34.573Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:08:34.573Z"},{"op":"add","path":"/metadata/comments","value":[{"created_at":"2026-09-27T07:08:34.573Z","author":"harness:codex","text":"Current official Claude plugin manifest docs support $schema/displayName, skills with stable slash names, and top-level marketplace description/version. Pre-fix contract test failed at four independent boundaries. The migrated plugin and marketplace now pass claude plugin validate --strict; the compatibility marketplace copy remains byte-equivalent by contract."}]}],"before_hash":"928af7d8af3c11764d99bb43c6bf088901ffed5ad7fad583c9650f654cd67110","after_hash":"f3ae8885eac9d92d621c08220331c70d3b035dcac69f9a528e7d1c1b0656f077","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"f27121bc63f9080d4a018b2949e763a4bdeae98247ada1f3fbb6797dc8c535c4"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:11:09.653Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/6/note","value":"plugin manifest and invocation contract"},{"op":"replace","path":"/metadata/files/6/path","value":"tests/integration/claude-plugin-contract.spec.ts"},{"op":"replace","path":"/metadata/files/5/note","value":"skill inventory and genuine manifest guards"},{"op":"replace","path":"/metadata/files/5/path","value":"scripts/smoke-claude-plugin.mjs"},{"op":"replace","path":"/metadata/files/4/note","value":"recognize intentionally Claude-owned skill invocations"},{"op":"replace","path":"/metadata/files/4/path","value":"scripts/gen-agent-plugin-skills.mjs"},{"op":"add","path":"/metadata/files/7","value":{"path":"tests/unit/scripts/gen-agent-plugin-skills.spec.ts","scope":"project","note":"generator preserves both plugin ownership contracts"}},{"op":"add","path":"/metadata/files/8","value":{"path":"tests/unit/scripts/smoke-claude-plugin.spec.ts","scope":"project","note":"smoke behavioral coverage without test-only seam"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:11:09.653Z"}],"before_hash":"f3ae8885eac9d92d621c08220331c70d3b035dcac69f9a528e7d1c1b0656f077","after_hash":"209a7954875db178d0052deb54a52807336cc14f4743615ea1899e488f1beabe","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"9c241fae96ed4658ea62dcec91f85669912e4250cef2fd8a05378d6492c98963"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:11:10.359Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"tests_add","patch":[{"op":"add","path":"/metadata/tests/1","value":{"command":"node scripts/run-tests.mjs test -- tests/unit/scripts/gen-agent-plugin-skills.spec.ts","scope":"project","timeout_seconds":240,"provenance":{"author":"harness:codex","created_at":"2026-09-27T07:11:10.302Z","source_kind":"local_mutation","source_ref":"fix/package-install-readiness-claude-plugin-contracts"},"note":"generated shared skills and Claude-only invocation ownership"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:11:10.359Z"}],"before_hash":"209a7954875db178d0052deb54a52807336cc14f4743615ea1899e488f1beabe","after_hash":"a36506d1e03fc2d1e78958ed8bd6d464153e8ff78c93e34adfaf6f3132bb153a","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"a3f1b82643adc7fc4271b728767ece5ce2abbdc3700e466cc9b25f7b7af2229a"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:11:11.109Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/1","value":{"created_at":"2026-09-27T07:11:11.109Z","author":"harness:codex","text":"Static gate found the shared-skill generator rejected nine intentional Claude-owned skill directories. The generator now reserves exactly those names for pm-claude while continuing to refuse arbitrary unowned directories; its focused contract test covers the combined layout."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:11:11.109Z"}],"before_hash":"a36506d1e03fc2d1e78958ed8bd6d464153e8ff78c93e34adfaf6f3132bb153a","after_hash":"55a6d2d2fc7967e59b8991cad28ab0a2abff120c81d18767c1a24c35e5b203dd","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"76ebf313a12e72cebc22084b7786eeb826f28cae77c36d59a5fee9b183406c0b"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:00:53.366Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/2","value":{"created_at":"2026-09-27T08:00:53.366Z","author":"harness:codex","text":"Plugin migration evidence: moved nine unique Claude command prompts into native skill SKILL.md paths, removed five duplicate command copies, validated both marketplace and plugin roots with claude plugin validate --strict, and kept root marketplace compatibility byte-identical. The repository tracker gate exposed 15 newly missing historical links; migrated each former command file link to its current skill path through pm files/docs and removed one obsolete commands directory link already covered by skills. pm validate --check-files now reports the preexisting ceiling of 195."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:00:53.366Z"}],"before_hash":"55a6d2d2fc7967e59b8991cad28ab0a2abff120c81d18767c1a24c35e5b203dd","after_hash":"fecb7540eb81e48be376d664ef6da7fe08d65bbeb31054bb0749691dfd54b7f2","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"5591cc07def7593c54cdfa1871674b6b14174459d49a0699090a9315976b4daa"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:32:21.079Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"test_run_track","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:32:21.079Z"},{"op":"add","path":"/metadata/test_runs","value":[{"run_id":"test-local-mujk8tah-p1a123","kind":"test","status":"passed","started_at":"2026-09-27T08:32:04.389Z","finished_at":"2026-09-27T08:32:21.065Z","recorded_at":"2026-09-27T08:32:21.065Z","passed":2,"failed":0,"skipped":0,"executions":[{"command":"node scripts/run-tests.mjs test -- tests/integration/claude-plugin-contract.spec.ts tests/unit/scripts/smoke-claude-plugin.spec.ts","requested_pm_context_mode":"schema","pm_context_mode":"schema","workspace_context_mode":"source","trust_reason":"local_source_ref"},{"command":"node scripts/run-tests.mjs test -- tests/unit/scripts/gen-agent-plugin-skills.spec.ts","requested_pm_context_mode":"schema","pm_context_mode":"schema","workspace_context_mode":"source","trust_reason":"local_source_ref"}]}]}],"before_hash":"fecb7540eb81e48be376d664ef6da7fe08d65bbeb31054bb0749691dfd54b7f2","after_hash":"4a3ec6b6b86b962f3639213fcfb08e253fff82fe8c07b14fb84170b0e265efb7","item_hash_version":3,"message":"Track test run summary (test-local-mujk8tah-p1a123)","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"29ba0020478056e28ace828675056d3a81e1db9f7415f2e27b8acb89d8b82232"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:35:28.194Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/docs/15/path","value":"plugins/pm-claude/skills/pm-triage/SKILL.md"},{"op":"replace","path":"/metadata/docs/14/path","value":"plugins/pm-claude/skills/pm-status/SKILL.md"},{"op":"replace","path":"/metadata/docs/13/path","value":"plugins/pm-claude/skills/pm-start-task/SKILL.md"},{"op":"replace","path":"/metadata/docs/12/path","value":"plugins/pm-claude/skills/pm-search/SKILL.md"},{"op":"replace","path":"/metadata/docs/11/path","value":"plugins/pm-claude/skills/pm-release/SKILL.md"},{"op":"replace","path":"/metadata/docs/10/path","value":"plugins/pm-claude/skills/pm-planner/SKILL.md"},{"op":"replace","path":"/metadata/docs/9/path","value":"plugins/pm-claude/skills/pm-new/SKILL.md"},{"op":"replace","path":"/metadata/docs/8/path","value":"plugins/pm-claude/skills/pm-list/SKILL.md"},{"op":"replace","path":"/metadata/docs/7/path","value":"plugins/pm-claude/skills/pm-init/SKILL.md"},{"op":"replace","path":"/metadata/docs/6/path","value":"plugins/pm-claude/skills/pm-developer/SKILL.md"},{"op":"replace","path":"/metadata/docs/5/path","value":"plugins/pm-claude/skills/pm-close-task/SKILL.md"},{"op":"replace","path":"/metadata/docs/4/path","value":"plugins/pm-claude/skills/pm-calendar/SKILL.md"},{"op":"replace","path":"/metadata/docs/3/path","value":"plugins/pm-claude/skills/pm-audit/SKILL.md"},{"op":"replace","path":"/metadata/docs/2/note","value":"Claude plugin inventory"},{"op":"replace","path":"/metadata/docs/2/path","value":"plugins/pm-claude/README.md"},{"op":"replace","path":"/metadata/docs/1/note","value":"plugin layout and marketplace compatibility invariant"},{"op":"replace","path":"/metadata/docs/1/path","value":"docs/CLAUDE_CODE_PLUGIN.md"},{"op":"replace","path":"/metadata/docs/0/note","value":"generated%20release%20history%20for%20Claude%20plugin%20contract"},{"op":"replace","path":"/metadata/docs/0/path","value":"CHANGELOG.md"},{"op":"add","path":"/metadata/docs/16","value":{"path":"plugins/pm-claude/skills/pm-workflow/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:35:28.194Z"}],"before_hash":"4a3ec6b6b86b962f3639213fcfb08e253fff82fe8c07b14fb84170b0e265efb7","after_hash":"300c93114a081afbeba792d2f04752cc69e5e4683fa8f5c1607edef415fd678a","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"1c6ad03033906cfd323870e0a535ddab837f9844d352915df7bf3de8fa9b6cd9"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:35:56.496Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"remove","path":"/metadata/docs/16"},{"op":"replace","path":"/metadata/docs/15/path","value":"plugins/pm-claude/skills/pm-workflow/SKILL.md"},{"op":"replace","path":"/metadata/docs/14/path","value":"plugins/pm-claude/skills/pm-triage/SKILL.md"},{"op":"replace","path":"/metadata/docs/13/path","value":"plugins/pm-claude/skills/pm-status/SKILL.md"},{"op":"replace","path":"/metadata/docs/12/path","value":"plugins/pm-claude/skills/pm-start-task/SKILL.md"},{"op":"replace","path":"/metadata/docs/11/path","value":"plugins/pm-claude/skills/pm-search/SKILL.md"},{"op":"replace","path":"/metadata/docs/10/path","value":"plugins/pm-claude/skills/pm-release/SKILL.md"},{"op":"replace","path":"/metadata/docs/9/path","value":"plugins/pm-claude/skills/pm-planner/SKILL.md"},{"op":"replace","path":"/metadata/docs/8/path","value":"plugins/pm-claude/skills/pm-new/SKILL.md"},{"op":"replace","path":"/metadata/docs/7/path","value":"plugins/pm-claude/skills/pm-list/SKILL.md"},{"op":"replace","path":"/metadata/docs/6/path","value":"plugins/pm-claude/skills/pm-init/SKILL.md"},{"op":"replace","path":"/metadata/docs/5/path","value":"plugins/pm-claude/skills/pm-developer/SKILL.md"},{"op":"replace","path":"/metadata/docs/4/path","value":"plugins/pm-claude/skills/pm-close-task/SKILL.md"},{"op":"replace","path":"/metadata/docs/3/path","value":"plugins/pm-claude/skills/pm-calendar/SKILL.md"},{"op":"replace","path":"/metadata/docs/2/note","value":"preserved slash invocations under skills layout"},{"op":"replace","path":"/metadata/docs/2/path","value":"plugins/pm-claude/skills/pm-audit/SKILL.md"},{"op":"replace","path":"/metadata/docs/1/note","value":"Claude plugin inventory"},{"op":"replace","path":"/metadata/docs/1/path","value":"plugins/pm-claude/README.md"},{"op":"replace","path":"/metadata/docs/0/note","value":"plugin layout and marketplace compatibility invariant"},{"op":"replace","path":"/metadata/docs/0/path","value":"docs/CLAUDE_CODE_PLUGIN.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:35:56.496Z"}],"before_hash":"300c93114a081afbeba792d2f04752cc69e5e4683fa8f5c1607edef415fd678a","after_hash":"1e6ec38f3aba5c676e2b91bdc488f2da686c16f9710f340d419938790a7ba261","item_hash_version":3,"message":"Replace URL-encoded changelog note with readable evidence note","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"fdb90159d48339a21437f25d67087515b79054ba643cdbfb558c044148feabae"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:36:01.024Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/docs/15/path","value":"plugins/pm-claude/skills/pm-triage/SKILL.md"},{"op":"replace","path":"/metadata/docs/14/path","value":"plugins/pm-claude/skills/pm-status/SKILL.md"},{"op":"replace","path":"/metadata/docs/13/path","value":"plugins/pm-claude/skills/pm-start-task/SKILL.md"},{"op":"replace","path":"/metadata/docs/12/path","value":"plugins/pm-claude/skills/pm-search/SKILL.md"},{"op":"replace","path":"/metadata/docs/11/path","value":"plugins/pm-claude/skills/pm-release/SKILL.md"},{"op":"replace","path":"/metadata/docs/10/path","value":"plugins/pm-claude/skills/pm-planner/SKILL.md"},{"op":"replace","path":"/metadata/docs/9/path","value":"plugins/pm-claude/skills/pm-new/SKILL.md"},{"op":"replace","path":"/metadata/docs/8/path","value":"plugins/pm-claude/skills/pm-list/SKILL.md"},{"op":"replace","path":"/metadata/docs/7/path","value":"plugins/pm-claude/skills/pm-init/SKILL.md"},{"op":"replace","path":"/metadata/docs/6/path","value":"plugins/pm-claude/skills/pm-developer/SKILL.md"},{"op":"replace","path":"/metadata/docs/5/path","value":"plugins/pm-claude/skills/pm-close-task/SKILL.md"},{"op":"replace","path":"/metadata/docs/4/path","value":"plugins/pm-claude/skills/pm-calendar/SKILL.md"},{"op":"replace","path":"/metadata/docs/3/path","value":"plugins/pm-claude/skills/pm-audit/SKILL.md"},{"op":"replace","path":"/metadata/docs/2/note","value":"Claude plugin inventory"},{"op":"replace","path":"/metadata/docs/2/path","value":"plugins/pm-claude/README.md"},{"op":"replace","path":"/metadata/docs/1/note","value":"plugin layout and marketplace compatibility invariant"},{"op":"replace","path":"/metadata/docs/1/path","value":"docs/CLAUDE_CODE_PLUGIN.md"},{"op":"replace","path":"/metadata/docs/0/note","value":"Generated changelog entry for Claude plugin contract"},{"op":"replace","path":"/metadata/docs/0/path","value":"CHANGELOG.md"},{"op":"add","path":"/metadata/docs/16","value":{"path":"plugins/pm-claude/skills/pm-workflow/SKILL.md","scope":"project","note":"preserved slash invocations under skills layout"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:36:01.024Z"}],"before_hash":"1e6ec38f3aba5c676e2b91bdc488f2da686c16f9710f340d419938790a7ba261","after_hash":"5df42bee0668830607e6b22f290d740fd5786c0a3a7e3e9b7fd7e912767848b4","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"bf0de278a47a1d811d03f0ca5c00eb43e46c4da3f6d7d5c9ce4bd9cca3599938"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:36:12.071Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/3","value":{"created_at":"2026-09-27T08:36:12.071Z","author":"harness:codex","text":"Verification: linked plugin contract/generator tests passed; claude plugin validate . --strict and plugins/pm-claude --strict passed; full coverage passed 9,373 tests at exact 100/100/100/100; packed npx/bunx smoke passed across nine packages; docs-skills, graph composition, record integrity, mutation and repository health passed. Static aggregate stopped only at host-sensitive import timing on unchanged SDK bundles, with isolated import gate passing on retry; hosted exact-head CI remains the release gate."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:36:12.071Z"}],"before_hash":"5df42bee0668830607e6b22f290d740fd5786c0a3a7e3e9b7fd7e912767848b4","after_hash":"eb26834d744c89bf5e4e35a1d6fc00034b10bcc5c13e64cbff9f14a22b891e80","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"ba8bd5c98209d908b6eea9ed9759500a5c05dc0ff83be7ce8b56b28b6c4e877a"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:36:20.615Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/4","value":{"created_at":"2026-09-27T08:36:20.615Z","author":"harness:codex","text":"Correction to preceding verification note: a separate CLI transport-floor gate run also exceeded local host latency ceilings for context/next/create/claim under load average about 7. The aggregate static command stopped earlier at import timing. Both timing gates await hosted CI verdict; graph, record-integrity and mutation gates passed separately."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:36:20.615Z"}],"before_hash":"eb26834d744c89bf5e4e35a1d6fc00034b10bcc5c13e64cbff9f14a22b891e80","after_hash":"5b5177770f4bedabbb5fa43c9fbd9b84ff32ddb676f78bd278f657d5a465d33d","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"f228faa14ab7df4183adbada17cea3f5b48fbddb239429f77a54a4ef07cee854"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:36:41.883Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"release-operator","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","release:pm-erogk1"]},"topic":{"value":"pm-dudr","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","release:pm-erogk1"]}},"op":"close","patch":[{"op":"replace","path":"/metadata/expected_result","value":"Both Claude marketplace and plugin manifests validate strictly, all 14 /pm-* invocations remain available through skills, and generated portable skill ownership stays exact."},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:36:41.883Z"},{"op":"replace","path":"/metadata/status","value":"closed"},{"op":"add","path":"/metadata/closed_at","value":"2026-09-27T08:36:41.856Z"},{"op":"add","path":"/metadata/completed_at","value":"2026-09-27T08:36:41.856Z"},{"op":"add","path":"/metadata/resolution","value":"Moved nine unique Claude command prompts into native skills, removed five duplicate command copies, corrected marketplace and plugin manifest fields, kept the compatibility marketplace identical, and migrated historical PM links to current skill paths."},{"op":"add","path":"/metadata/actual_result","value":"Both claude plugin validate --strict commands passed; focused linked tests and full 100/100/100/100 coverage passed; packed npm/Bun smoke passed; historical linked-path count returned to its 195 baseline. Local timing gates showed host-sensitive overages; hosted CI is pending."},{"op":"add","path":"/metadata/close_reason","value":"Aligned Claude marketplace and plugin surfaces with current strict validation; preserved 14 slash invocations as skills"}],"before_hash":"5b5177770f4bedabbb5fa43c9fbd9b84ff32ddb676f78bd278f657d5a465d33d","after_hash":"a6ae46ccd04460fb9bae34b646bbe519ae744553ecc88ab0b0fcac3d0e1da690","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"0e90d07b7bd2670707c3c184d38b6aeb68aa97e8d64547d7b15ed931f2c000cc"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:36:45.317Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"release-operator","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","release:pm-erogk1"]},"topic":{"value":"pm-dudr","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","release:pm-erogk1"]}},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:36:45.317Z"}],"before_hash":"a6ae46ccd04460fb9bae34b646bbe519ae744553ecc88ab0b0fcac3d0e1da690","after_hash":"ff7b2eb650ead75aa39743db7c08cd1faa95b2d7d375eaf46eef71345240bba2","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"9ba23059da01a71827dcce91e746a1469eb7258c52cf6082c88f94e231e0b8fe"} diff --git a/.agents/pm/history/pm-erogk1.jsonl b/.agents/pm/history/pm-erogk1.jsonl index 50a292ef7..24198beb3 100644 --- a/.agents/pm/history/pm-erogk1.jsonl +++ b/.agents/pm/history/pm-erogk1.jsonl @@ -1 +1,33 @@ {"hash_algorithm":"sha256","ts":"2026-09-27T00:37:15.358Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"f9d60a3a144e8d9ec3f9b203","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-kynkl8","claim:pm-t05d8d","lineage:pm-t05d8d","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-kynkl8+pm-t05d8d","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-kynkl8","claim:pm-t05d8d","lineage:pm-t05d8d","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"create","patch":[{"op":"add","path":"/metadata/id","value":"pm-erogk1"},{"op":"add","path":"/metadata/title","value":"Refuse local package installation when source scan stops at entry limit"},{"op":"add","path":"/metadata/description","value":"GitHub #1321: local package source inspection reaches max_entries=10000, reports copy.complete=false and stop_reason=entry_limit, yet dry-run and real install return ok=true, warnings=[] and exit 0; real path may activate a partial package. Fail closed before write/activation, give a packed-package recovery hint, and align dry-run readiness."},{"op":"add","path":"/metadata/type","value":"Issue"},{"op":"add","path":"/metadata/status","value":"open"},{"op":"add","path":"/metadata/priority","value":1},{"op":"add","path":"/metadata/tags","value":[]},{"op":"add","path":"/metadata/created_at","value":"2026-09-27T00:37:15.358Z"},{"op":"add","path":"/metadata/updated_at","value":"2026-09-27T00:37:15.358Z"},{"op":"add","path":"/metadata/author","value":"harness:codex"},{"op":"add","path":"/metadata/parent","value":"pm-x6jf"},{"op":"add","path":"/metadata/dependencies","value":[{"id":"pm-x6jf","kind":"discovered_from","created_at":"2026-09-27T00:37:15.358Z","author":"harness:codex","source_kind":"cli:create:dep","author_source":"detected"}]},{"op":"add","path":"/metadata/comments","value":[{"created_at":"2026-09-27T00:37:15.358Z","author":"harness:codex","text":"Duplicate check across all PM statuses: searched GH #1321, entry_limit, incomplete source scan, partial package copy, and package install. Earlier lifecycle items cover different completed fixes; no existing item owns this limit-truncation defect. Source: https://github.com/unbraind/pm-cli/issues/1321. Intake only; item remains open and unclaimed."}]}],"before_hash":"3cc22dff72be7b14824654a7a64ea62b04799939b2fee54c1b5f52ca60bf6df0","after_hash":"7d0efe9810572cf2effbaaf56994e8fee9f0a849b034f9b039a6137804e49865","item_hash_version":3,"message":"Track GitHub #1321 partial package install defect without claiming work","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"af88212bdba8fe77db3868942ac531e3cdc616f1463a94e13e95246876468498"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:01:18.685Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:01:18.685Z"},{"op":"add","path":"/metadata/assignee","value":"harness:codex"},{"op":"add","path":"/metadata/claim_principal","value":"harness:codex#d47f0e0d79925f50a0df2359"}],"before_hash":"7d0efe9810572cf2effbaaf56994e8fee9f0a849b034f9b039a6137804e49865","after_hash":"11549c67e1374ec85cc6af7d10b03be8bb53e3e84a4de3caaec977b39f5bd749","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"a7f3b10c14400655f3ca12e96d42606954b5a3d3037fbada5599f8ae239ea591"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:01:18.883Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:01:18.883Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"11549c67e1374ec85cc6af7d10b03be8bb53e3e84a4de3caaec977b39f5bd749","after_hash":"0b12aed74934cf1aa90b4ab9bfb97b98bb5486f00a899f7424dbb9183bc89882","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"530cb450dd1fababc1751fc7732fb70d8007fb3c78baa0e2776577ff4054e22f"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:08:17.967Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:08:17.967Z"},{"op":"add","path":"/metadata/files","value":[{"path":"src/sdk/extension/install-plan.ts","scope":"project","note":"SDK fail-closed local directory scan"},{"path":"tests/unit/extensions/extension-install-dry-run.spec.ts","scope":"project","note":"dry-run and real install regression with entry and depth limits"}]}],"before_hash":"0b12aed74934cf1aa90b4ab9bfb97b98bb5486f00a899f7424dbb9183bc89882","after_hash":"5ef628d185fddf884652d159c750231fe7922dc0bbf427910995e2470ac96b17","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"5db28e3354b950c47d5b37cad61ce06367c66e828d61ec00d78b7dd423f131ea"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:08:18.681Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:08:18.681Z"},{"op":"add","path":"/metadata/docs","value":[{"path":"docs/PACKAGE_EVIDENCE.md","scope":"project","note":"installer refusal and recovery contract"}]}],"before_hash":"5ef628d185fddf884652d159c750231fe7922dc0bbf427910995e2470ac96b17","after_hash":"d7765f96c25592d70afaa9fd905184db83bdafe5a3e716c89a969ac3419999a6","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"20183332fcb39e295decd4654eb3d056f2bb6ff9da3f1e10369a5bf0fdb2b440"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:08:19.433Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"tests_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:08:19.433Z"},{"op":"add","path":"/metadata/tests","value":[{"command":"node scripts/run-tests.mjs test -- tests/unit/extensions/extension-install-dry-run.spec.ts","scope":"project","timeout_seconds":240,"provenance":{"author":"harness:codex","created_at":"2026-09-27T07:08:19.397Z","source_kind":"local_mutation","source_ref":"fix/package-install-readiness-claude-plugin-contracts"},"note":"SDK package install boundary regression"}]}],"before_hash":"d7765f96c25592d70afaa9fd905184db83bdafe5a3e716c89a969ac3419999a6","after_hash":"88bd6cf6b5af6a24adcdad915df0e74ef1cac128878f26822026f3f65af0c657","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"f86307c41f1e50593bc021d385735a254392a52e721d3c3c1310be0f38dca0a2"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:08:20.357Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"add","path":"/metadata/dependencies/1","value":{"id":"pm-5bsofk","kind":"discovered_from","created_at":"2026-09-27T07:08:20.071Z","author":"harness:codex","source_kind":"cli:update:dep","author_source":"detected"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:08:20.357Z"}],"before_hash":"88bd6cf6b5af6a24adcdad915df0e74ef1cac128878f26822026f3f65af0c657","after_hash":"53d2228fed0a82c4f85250073ae09b106e5b577515bcd7d5d0b6a7a2246c7c82","item_hash_version":3,"message":"Link incomplete-scan defect to the earlier bounded install-plan contract","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"6340e373e84ff3c85ba79908721174ba6c59ff9e73508f093420950c4ea8c862"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:08:21.032Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/1","value":{"created_at":"2026-09-27T07:08:21.032Z","author":"harness:codex","text":"Pre-fix regression: focused SDK test returned ok=true with copy.complete=false and stop_reason=entry_limit. The same test now passes after the SDK planner refuses incomplete local directory scans before dry-run or real installation, with a stable error code and archive recovery. Direct planner remains able to report lower-bound scans."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:08:21.032Z"}],"before_hash":"53d2228fed0a82c4f85250073ae09b106e5b577515bcd7d5d0b6a7a2246c7c82","after_hash":"815b41dbbacc07dc4e0700dab853c10c0853fc662e46736abebb2bbf71eaddf2","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"0657e07a367b12ac6731769ca0ad98cf5f782a469ec0eb8671d6b41128f5c635"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:14:32.574Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/1/note","value":"generated public refusal code contract"},{"op":"replace","path":"/metadata/files/1/path","value":"src/sdk/generated/generated-error-code-catalog-part-1.ts"},{"op":"add","path":"/metadata/files/2","value":{"path":"src/sdk/generated/generated-error-code-catalog-part-2.ts","scope":"project","note":"partition moved by exhaustive catalog generation"}},{"op":"add","path":"/metadata/files/3","value":{"path":"tests/unit/extensions/extension-install-dry-run.spec.ts","scope":"project","note":"dry-run and real install regression with entry and depth limits"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:14:32.574Z"}],"before_hash":"815b41dbbacc07dc4e0700dab853c10c0853fc662e46736abebb2bbf71eaddf2","after_hash":"e21f5156d16b1abbccd81db1b2202078c0cb49e0ea16df2057cdd647f5c1eeaa","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"9c31b1e9e53a7dc98d005b11c97a6917b269ffbb1dcdf8ea194498774f591ed2"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:14:33.251Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/2","value":{"created_at":"2026-09-27T07:14:33.251Z","author":"harness:codex","text":"Generated the SDK public error-code catalog after adding extension_install_incomplete_source_scan; the generator rebalanced one existing entry across partitions without changing its contract."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:14:33.251Z"}],"before_hash":"e21f5156d16b1abbccd81db1b2202078c0cb49e0ea16df2057cdd647f5c1eeaa","after_hash":"f7995af700d986a1a1415c7d5d582880ea9b45454d8e49ad86ef49eb10dd2367","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"f94936529819ee2c7138dfae23b3e77b8c3b38f14b55f05325416a2d3d5bb224"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:16:16.451Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/3/note","value":"generated public error-code contract snapshot"},{"op":"replace","path":"/metadata/files/3/path","value":"tests/fixtures/contracts/full.json"},{"op":"add","path":"/metadata/files/4","value":{"path":"tests/unit/extensions/extension-install-dry-run.spec.ts","scope":"project","note":"dry-run and real install regression with entry and depth limits"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:16:16.451Z"}],"before_hash":"f7995af700d986a1a1415c7d5d582880ea9b45454d8e49ad86ef49eb10dd2367","after_hash":"2625f2b348b8c065282e249c7ae8105a49c20add749a5e041b54b7bfe37d37e8","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"fc2c285c4c100d9d8b500d82b8e8c37391e58d9865ed7331b603536b1efc4666"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:16:17.412Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/3","value":{"created_at":"2026-09-27T07:16:17.412Z","author":"harness:codex","text":"Regenerated the exact public contracts fixture for the new refusal code after the static gate correctly detected catalog drift."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:16:17.412Z"}],"before_hash":"2625f2b348b8c065282e249c7ae8105a49c20add749a5e041b54b7bfe37d37e8","after_hash":"6616ba4df99a15553fd584994529a801a8efb9b98860eca1d7e97c8b9711cf08","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"dbce929f5383f3076dcfb0ac944dc42a23a11242d5445eab15c34e598bb7f634"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:28:35.404Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/4/note","value":"generated public error-code contract snapshot"},{"op":"replace","path":"/metadata/files/4/path","value":"tests/fixtures/contracts/full.json"},{"op":"replace","path":"/metadata/files/3/note","value":"partition moved by exhaustive catalog generation"},{"op":"replace","path":"/metadata/files/3/path","value":"src/sdk/generated/generated-error-code-catalog-part-2.ts"},{"op":"replace","path":"/metadata/files/2/note","value":"generated public refusal code contract"},{"op":"replace","path":"/metadata/files/2/path","value":"src/sdk/generated/generated-error-code-catalog-part-1.ts"},{"op":"replace","path":"/metadata/files/1/note","value":"SDK fail-closed local directory scan"},{"op":"replace","path":"/metadata/files/1/path","value":"src/sdk/extension/install-plan.ts"},{"op":"replace","path":"/metadata/files/0/note","value":"additive SDK refusal vocabulary snapshot"},{"op":"replace","path":"/metadata/files/0/path","value":"sdk/public-surface.json"},{"op":"add","path":"/metadata/files/5","value":{"path":"tests/unit/extensions/extension-install-dry-run.spec.ts","scope":"project","note":"dry-run and real install regression with entry and depth limits"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:28:35.404Z"}],"before_hash":"6616ba4df99a15553fd584994529a801a8efb9b98860eca1d7e97c8b9711cf08","after_hash":"2474d35f08cc109d12952d72336138fcc0a99452b6ea5a22d2c3af3ceea44a8f","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"033ec689b6019059b4b942fda38a4affd65bff2d993571d5e6bae2a2160138f6"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:30:30.672Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/docs/0/note","value":"generated new refusal census row"},{"op":"replace","path":"/metadata/docs/0/path","value":"docs/generated/REFUSAL_CLOSURE_CENSUS.md"},{"op":"add","path":"/metadata/docs/1","value":{"path":"docs/PACKAGE_EVIDENCE.md","scope":"project","note":"installer refusal and recovery contract"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:30:30.672Z"}],"before_hash":"2474d35f08cc109d12952d72336138fcc0a99452b6ea5a22d2c3af3ceea44a8f","after_hash":"5a64ae528db19f653ef826608e7eb33a695b9dfe127f3b0b001e9f45a893a3fa","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"9f7585470a8351831ee856be839487e6b79b1ea9eb7ad2223e41f4baf364345b"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:30:31.403Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/4","value":{"created_at":"2026-09-27T07:30:31.403Z","author":"harness:codex","text":"The generated refusal census now lists the new code as uncovered by its executable cross-command recovery probes, even though the focused SDK regression checks its structured code and recovery message. This is explicit scope evidence, not a claim of full recovery-census coverage."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:30:31.403Z"}],"before_hash":"5a64ae528db19f653ef826608e7eb33a695b9dfe127f3b0b001e9f45a893a3fa","after_hash":"a92aa1d5231980f1fc34753e7531aaacee4e2f1f9ffbdc6e7cf8a6b709d86841","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"02d19b5f3e8438f4848d16e20a422b662f781a626489f23e213cbc9d54b7c780"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:50:25.287Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/5","value":{"created_at":"2026-09-27T07:50:25.287Z","author":"harness:codex","text":"Manual temporary-project proof (2026-09-27): initialized isolated PM_PATH/PM_GLOBAL_PATH; SDK maxEntries=1 and CLI default maxDepth=64 refused local source with extension_install_incomplete_source_scan in both dry-run and real modes; no destination created. npm pack --ignore-scripts --json then pm package install --project activated the package and installed index.js. First proof script only misparsed npm 11 object-shaped pack JSON; corrected parser and full proof passed."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:50:25.287Z"}],"before_hash":"a92aa1d5231980f1fc34753e7531aaacee4e2f1f9ffbdc6e7cf8a6b709d86841","after_hash":"5f8d961841f4fb3129e154ce79456cf183c52d8a0a7a1f35e8c10cd643f50317","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"55b403b2f55a2c8c6ceab0cf64636f99d2d0bdc6985b474ed56ef4716ea55a54"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:32:00.099Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"test_run_track","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:32:00.099Z"},{"op":"add","path":"/metadata/test_runs","value":[{"run_id":"test-local-mujk8d3l-7msa2y","kind":"test","status":"passed","started_at":"2026-09-27T08:31:43.603Z","finished_at":"2026-09-27T08:32:00.081Z","recorded_at":"2026-09-27T08:32:00.081Z","passed":1,"failed":0,"skipped":0,"executions":[{"command":"node scripts/run-tests.mjs test -- tests/unit/extensions/extension-install-dry-run.spec.ts","requested_pm_context_mode":"schema","pm_context_mode":"schema","workspace_context_mode":"source","trust_reason":"local_source_ref"}]}]}],"before_hash":"5f8d961841f4fb3129e154ce79456cf183c52d8a0a7a1f35e8c10cd643f50317","after_hash":"4eb7e273b8eb1917bf849a71760aedab7fe59867db896e32e32f4d725afc1ab1","item_hash_version":3,"message":"Track test run summary (test-local-mujk8d3l-7msa2y)","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"e7b577c6bcc5825b99d6c6d5d8d4197db822cae5e9131a08cd664afed784f25a"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:35:28.210Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/docs/1/note","value":"generated new refusal census row"},{"op":"replace","path":"/metadata/docs/1/path","value":"docs/generated/REFUSAL_CLOSURE_CENSUS.md"},{"op":"replace","path":"/metadata/docs/0/note","value":"generated%20release%20history%20for%20package%20install%20refusal"},{"op":"replace","path":"/metadata/docs/0/path","value":"CHANGELOG.md"},{"op":"add","path":"/metadata/docs/2","value":{"path":"docs/PACKAGE_EVIDENCE.md","scope":"project","note":"installer refusal and recovery contract"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:35:28.210Z"}],"before_hash":"4eb7e273b8eb1917bf849a71760aedab7fe59867db896e32e32f4d725afc1ab1","after_hash":"45006f795fd1c9adc214cd981afa19251433972c234f40d833dbe279c391d6f5","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"75935103004f68684a3debb2d93ee4ff94b8996e19479f857eb32c3749b222fd"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:35:45.950Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"remove","path":"/metadata/docs/2"},{"op":"replace","path":"/metadata/docs/1/note","value":"installer refusal and recovery contract"},{"op":"replace","path":"/metadata/docs/1/path","value":"docs/PACKAGE_EVIDENCE.md"},{"op":"replace","path":"/metadata/docs/0/note","value":"generated new refusal census row"},{"op":"replace","path":"/metadata/docs/0/path","value":"docs/generated/REFUSAL_CLOSURE_CENSUS.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:35:45.950Z"}],"before_hash":"45006f795fd1c9adc214cd981afa19251433972c234f40d833dbe279c391d6f5","after_hash":"f1d6f41f157d062e682c09658224019b15913b0f8be217ce88b584cd02e3cfc6","item_hash_version":3,"message":"Replace URL-encoded changelog note with readable evidence note","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"348d7c98ec56f92187000c3e04893fed44a3e0cfe047d3194d05ed0aa7ebf057"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:35:52.040Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/docs/1/note","value":"generated new refusal census row"},{"op":"replace","path":"/metadata/docs/1/path","value":"docs/generated/REFUSAL_CLOSURE_CENSUS.md"},{"op":"replace","path":"/metadata/docs/0/note","value":"Generated changelog entry for package install refusal"},{"op":"replace","path":"/metadata/docs/0/path","value":"CHANGELOG.md"},{"op":"add","path":"/metadata/docs/2","value":{"path":"docs/PACKAGE_EVIDENCE.md","scope":"project","note":"installer refusal and recovery contract"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:35:52.040Z"}],"before_hash":"f1d6f41f157d062e682c09658224019b15913b0f8be217ce88b584cd02e3cfc6","after_hash":"a9b54245504b5c17b177dc54663bcbe06edffd0ec3bffb153fc91232b96f1dec","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"a49bbc159bcd0e48519372dc1048d5b4149d4118f9446fca7c3206ed54206d9b"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:36:11.973Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/6","value":{"created_at":"2026-09-27T08:36:11.973Z","author":"harness:codex","text":"Verification: linked focused test passed 2/2 in sandbox; full repository coverage passed 9,373 tests and exact 100/100/100/100; packed npm/npx and Bun/bunx smoke passed across nine packages; manual isolated project proved no partial destination and archive recovery. pnpm audit found zero advisories. Static aggregate advanced past contracts, docstrings, lint, duplicate checks, tracker gate and SDK surface before an unchanged-entrypoint timing overrun; its isolated import gate passed on retry. Graph, record-integrity and mutation gates passed separately. Hosted exact-head CI remains the release gate."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:36:11.973Z"}],"before_hash":"a9b54245504b5c17b177dc54663bcbe06edffd0ec3bffb153fc91232b96f1dec","after_hash":"6e6d45340d7a23225760eefcb64bc2de4efd0b265e1b187a1cc600c14041cc84","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"68e974302559166a4f7798fad4a8e944dd6b79662bae9cacfe268a81392da4e1"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:36:20.713Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/7","value":{"created_at":"2026-09-27T08:36:20.713Z","author":"harness:codex","text":"Correction to preceding verification note: the aggregate static script stopped at SDK import timing; a separate run of its subsequent CLI transport-floor gate also exceeded local host latency ceilings (context/next/create/claim), while host load average was about 7. Both timing gates await hosted CI verdict. All non-timing static stages reached so far passed."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:36:20.713Z"}],"before_hash":"6e6d45340d7a23225760eefcb64bc2de4efd0b265e1b187a1cc600c14041cc84","after_hash":"f5075d2b29e4d88a6816bcb055d9aa2da84924453bf40de9c6e384a6fec837de","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"f64a1b579a8c6036a743348eef369d1503355f9159eae014ff4efd87832241e0"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:36:28.499Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"close","patch":[{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:36:28.499Z"},{"op":"replace","path":"/metadata/status","value":"closed"},{"op":"add","path":"/metadata/closed_at","value":"2026-09-27T08:36:28.474Z"},{"op":"add","path":"/metadata/completed_at","value":"2026-09-27T08:36:28.474Z"},{"op":"add","path":"/metadata/resolution","value":"The SDK install planner now rejects entry- or depth-limited directory scans with a stable refusal code and actionable archive recovery; generated SDK contracts, tests and docs include the new behavior."},{"op":"add","path":"/metadata/expected_result","value":"Dry and real package installs never accept a truncated local source scan or create a partial package; packed archives remain installable."},{"op":"add","path":"/metadata/actual_result","value":"Focused linked test passed, isolated manual project refused SDK and CLI truncated scans without destination writes and installed/activated the packed archive; full coverage was 100/100/100/100 and packed npm/Bun smoke passed. Local timing gates showed host-sensitive overages; hosted CI is pending."},{"op":"add","path":"/metadata/close_reason","value":"Refused incomplete local extension installs before destination mutation; verified SDK, CLI and packed archive recovery"}],"before_hash":"f5075d2b29e4d88a6816bcb055d9aa2da84924453bf40de9c6e384a6fec837de","after_hash":"924e905f917e35c98205e32bb70c161fc737b64badcd8337d820fd2abc7baa72","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"22629a19fb4b5781679b835bbfd0b11608fbfcc5b97fcd9bfcd5169ea8c04141"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:36:32.158Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:36:32.158Z"}],"before_hash":"924e905f917e35c98205e32bb70c161fc737b64badcd8337d820fd2abc7baa72","after_hash":"5860ab2e9a7ece02666ce158b96b16233a53294fc57a1091894c06cc1dd49e15","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"c2df4d3de52cc382e98e17a3643ac28d048f806f7527773850d53d086c90d075"} +{"hash_algorithm":"sha256","ts":"2026-09-27T08:49:14.564Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T08:49:14.564Z"},{"op":"add","path":"/metadata/escape_class","value":"production_defect"},{"op":"add","path":"/metadata/gate_evidence","value":{"disposition":"gate_strengthened","owner":"pm-erogk1","gate_id":"CI / Gates (coverage)","negative_control":"With the SDK incomplete-scan refusal removed, node scripts/run-tests.mjs test -- tests/unit/extensions/extension-install-dry-run.spec.ts fails because a truncated local source install resolves successfully.","local_checks":["node scripts/run-tests.mjs test -- tests/unit/extensions/extension-install-dry-run.spec.ts","node scripts/run-tests.mjs coverage -- --maxWorkers=4","pnpm smoke:npx"],"hosted_checks":["CI / Gates (coverage)","CI / Gates (static)"]}}],"before_hash":"5860ab2e9a7ece02666ce158b96b16233a53294fc57a1091894c06cc1dd49e15","after_hash":"5b7fd64665a4d2d9fc664e697abdf2c96616d3979b639f081298fbe12dc3af10","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"c45a7dd3e2b9776358196122b6b3e296d1055a82000c44626ddcf14cb70f0319"} +{"hash_algorithm":"sha256","ts":"2026-09-27T09:04:37.171Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"reopen","patch":[{"op":"remove","path":"/metadata/close_reason"},{"op":"remove","path":"/metadata/actual_result"},{"op":"remove","path":"/metadata/expected_result"},{"op":"remove","path":"/metadata/resolution"},{"op":"remove","path":"/metadata/completed_at"},{"op":"remove","path":"/metadata/closed_at"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T09:04:37.171Z"},{"op":"replace","path":"/metadata/status","value":"open"}],"before_hash":"5b7fd64665a4d2d9fc664e697abdf2c96616d3979b639f081298fbe12dc3af10","after_hash":"bd70c49aa065e54799c1f0b6b5b5c8826b3c5d550666cf747aff1877011a9df3","item_hash_version":3,"message":"Reopen for exact-head CodeRabbit functional correctness finding on recovery scope","context":{"recurrence":{"reason":"Review found global-scope archive recovery text incorrectly says --project","from_status":"closed","to_status":"open","previous_terminal":{"close_reason":"Refused incomplete local extension installs before destination mutation; verified SDK, CLI and packed archive recovery","resolution":"The SDK install planner now rejects entry- or depth-limited directory scans with a stable refusal code and actionable archive recovery; generated SDK contracts, tests and docs include the new behavior.","expected_result":"Dry and real package installs never accept a truncated local source scan or create a partial package; packed archives remain installable.","actual_result":"Focused linked test passed, isolated manual project refused SDK and CLI truncated scans without destination writes and installed/activated the packed archive; full coverage was 100/100/100/100 and packed npm/Bun smoke passed. Local timing gates showed host-sensitive overages; hosted CI is pending."}},"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"e51f69f4f1592fdc3ecd1e19ed802a8a89a266dec1d29b4f906e019e34c36afd"} +{"hash_algorithm":"sha256","ts":"2026-09-27T09:04:41.165Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T09:04:41.165Z"},{"op":"add","path":"/metadata/assignee","value":"harness:codex"},{"op":"add","path":"/metadata/claim_principal","value":"harness:codex#d47f0e0d79925f50a0df2359"}],"before_hash":"bd70c49aa065e54799c1f0b6b5b5c8826b3c5d550666cf747aff1877011a9df3","after_hash":"d6041d65c978ff6147b4af7d91d9e1d818350a616e799deac053216a902d4238","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"891bc378809180a0ecf1f994ad7ffafc263df859527a22d7fc1213ceee3dc316"} +{"hash_algorithm":"sha256","ts":"2026-09-27T09:04:41.487Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T09:04:41.487Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"d6041d65c978ff6147b4af7d91d9e1d818350a616e799deac053216a902d4238","after_hash":"b5156259d5cbcefa47c4f63622c7813b8b1036944e1daa61e89c27d4659ff5f3","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"9f75f094644644cd01aa74e59f211ca477453b8b8e4aee91e97a3d3f3f22e481"} +{"hash_algorithm":"sha256","ts":"2026-09-27T09:06:39.775Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"test_run_track","patch":[{"op":"add","path":"/metadata/test_runs/1","value":{"run_id":"test-local-mujlgxsm-yxwm7r","kind":"test","status":"passed","started_at":"2026-09-27T09:06:23.528Z","finished_at":"2026-09-27T09:06:39.766Z","recorded_at":"2026-09-27T09:06:39.766Z","passed":1,"failed":0,"skipped":0,"executions":[{"command":"node scripts/run-tests.mjs test -- tests/unit/extensions/extension-install-dry-run.spec.ts","requested_pm_context_mode":"schema","pm_context_mode":"schema","workspace_context_mode":"source","trust_reason":"local_source_ref"}]}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T09:06:39.775Z"}],"before_hash":"b5156259d5cbcefa47c4f63622c7813b8b1036944e1daa61e89c27d4659ff5f3","after_hash":"48f1581beb1da389c266e7e19f0364e1225550b1e896b25f02f1ef7b7b34b4a1","item_hash_version":3,"message":"Track test run summary (test-local-mujlgxsm-yxwm7r)","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"4c06e466c297f141534d4a41b73215f3f7c7449d4ff2c285b5e5075e005542f3"} +{"hash_algorithm":"sha256","ts":"2026-09-27T09:07:24.114Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/8","value":{"created_at":"2026-09-27T09:07:24.110Z","author":"harness:codex","text":"Review finding on PR #1323 (CodeRabbit inline): packed-archive recovery text hardcoded --project even for a global install. Added a real global-scope SDK regression to the existing install-refusal test; it failed before the fix with nextSteps ending --project and passed after the SDK interpolated the requested scope. Build and linked focused test pass. Full coverage is running before reclosure."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T09:07:24.114Z"}],"before_hash":"48f1581beb1da389c266e7e19f0364e1225550b1e896b25f02f1ef7b7b34b4a1","after_hash":"68153d20483e4e6276dd7afd7ce7f2a24fb6164edc8fb76a9d652b05339a06cd","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"c79fd75faa784d8960fc5a1831dea4327f51cbc1600d2df88dd7ccf45502b489"} +{"hash_algorithm":"sha256","ts":"2026-09-27T09:22:00.077Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/9","value":{"created_at":"2026-09-27T09:22:00.077Z","author":"harness:codex","text":"Manual review-fix acceptance in a fresh temporary project: a 65-level local source refused both dry and real pm package install --global commands with a nonzero structured error whose archive retry uses --global; no global destination was written. npm pack --ignore-scripts --json followed by pm package install --global activated the package and installed index.js. Temporary PM_PATH/PM_GLOBAL_PATH were removed afterward."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T09:22:00.077Z"}],"before_hash":"68153d20483e4e6276dd7afd7ce7f2a24fb6164edc8fb76a9d652b05339a06cd","after_hash":"8cf38cc5aeb078fc376a7ceba5608fd94ac6e849811e3b60d96009e847e894f3","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"53661a6d0b174be72050fb0e38a61c6e2040603eda5b64d7a5f5a5ca7c3534a5"} +{"hash_algorithm":"sha256","ts":"2026-09-27T09:23:26.046Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"close","patch":[{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T09:23:26.046Z"},{"op":"replace","path":"/metadata/status","value":"closed"},{"op":"add","path":"/metadata/closed_at","value":"2026-09-27T09:23:26.012Z"},{"op":"add","path":"/metadata/completed_at","value":"2026-09-27T09:23:26.012Z"},{"op":"add","path":"/metadata/resolution","value":"The SDK rejects incomplete local package scans before mutation and now formats packed-archive recovery with the caller-selected project or global scope. A global-scope regression test and documentation enforce the behavior."},{"op":"add","path":"/metadata/expected_result","value":"Truncated project and global directory installs refuse safely, preserve their requested archive retry scope, and leave destinations untouched; packed archives install in that same scope."},{"op":"add","path":"/metadata/actual_result","value":"The global regression failed before the scope fix and passed afterward; an isolated CLI project refused dry and real global installs without destination writes and activated a packed global archive. Linked test, docs-skills, ESLint and full 9,373-test coverage passed at 100/100/100/100; prior exact-head hosted checks were green before this correction, and new-head CI remains pending."},{"op":"add","path":"/metadata/close_reason","value":"Fixed review-identified global archive recovery scope and verified both package scopes"}],"before_hash":"8cf38cc5aeb078fc376a7ceba5608fd94ac6e849811e3b60d96009e847e894f3","after_hash":"5f87680ce58850c1fca2c856e34d11f7ebae8cc9d1bc269dce93da00e8ac42b3","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"58e79b255c2697c321f13280bcae0bce9b6db8bd9db9b684ba82591419b87ba6"} +{"hash_algorithm":"sha256","ts":"2026-09-27T09:23:30.512Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-erogk1","lineage:pm-erogk1","lineage:pm-x6jf","lineage:pm-usfg","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T09:23:30.512Z"}],"before_hash":"5f87680ce58850c1fca2c856e34d11f7ebae8cc9d1bc269dce93da00e8ac42b3","after_hash":"3ea156c62909688953d87d81545b653f782c745fae437dcc28588adf6d96e7d8","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"d3eedfb8bb4414e533eb78bf50e573c872415620e497bdd087bbe5dd28d27db0"} diff --git a/.agents/pm/history/pm-rnpb.jsonl b/.agents/pm/history/pm-rnpb.jsonl index 837f5ef39..395eb180d 100644 --- a/.agents/pm/history/pm-rnpb.jsonl +++ b/.agents/pm/history/pm-rnpb.jsonl @@ -691,3 +691,4 @@ {"ts":"2026-09-08T05:30:35.479Z","author":"harness:codex","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"22d7da348d66bb9f892a835e","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-doxj","claim:pm-e9zh","claim:pm-pd7nh0","claim:pm-wg07","lineage:pm-e9zh","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-doxj+pm-e9zh+pm-pd7nh0+pm-wg07","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-doxj","claim:pm-e9zh","claim:pm-pd7nh0","claim:pm-wg07","lineage:pm-e9zh","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-08T05:30:35.479Z"},{"op":"add","path":"/metadata/resolution","value":"Consolidated perf/reliability umbrella scope delivered and merged in PR #75."},{"op":"add","path":"/metadata/expected_result","value":"Audit findings are actionable and deduplicated; changed files and verification commands are linked; temporary dogfood project validates core workflows; any discovered bugs with safe fixes are remediated and tested."},{"op":"add","path":"/metadata/actual_result","value":"Consolidated perf/reliability umbrella scope delivered and merged in PR #75."}],"before_hash":"d2219f2bd152c4800c2511056045a7e0cf55f1db792eb1126025d0412b5e43d6","after_hash":"5a1818fef9d579f7b1d3be7f176cfd9fe50c10883be8f45df9aff7e7d440be33","item_hash_version":3,"message":"bulk-item-transaction ecosystem-evidence-20260908-0 1-update-pm-rnpb-2ffba21c417b apply","context":{"agent_provenance_outcomes":{"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"80f2d088545d2d595cb0b11e7f2b7d10a560790992f7763fdf00b6215fed209f"} {"hash_algorithm":"sha256","ts":"2026-09-19T08:41:28.597Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"e700c3209edd3b60c0371159","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-pivf+pm-wrbe","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-19T08:41:28.597Z"},{"op":"add","path":"/metadata/closed_at","value":"2026-05-26T22:58:30.907Z"}],"before_hash":"5a1818fef9d579f7b1d3be7f176cfd9fe50c10883be8f45df9aff7e7d440be33","after_hash":"fbbe23b9774746aa2c5be0758474f72cdb43bc8d0d9a90ad237bf841e3def4d7","item_hash_version":3,"message":"Backfill closed_at from verified lifecycle history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"69b1615be43fb8c2418b52713eed8631370a28009f91df615d422dec050356bc"} {"hash_algorithm":"sha256","ts":"2026-09-22T05:00:03.509Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"37413fb51dc068370cfb0fdc","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-f4yn","claim:pm-j8z6","claim:pm-kb5h","lineage:pm-j8z6","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-f4yn+pm-j8z6+pm-kb5h","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-f4yn","claim:pm-j8z6","claim:pm-kb5h","lineage:pm-j8z6","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/51/note","value":"agent-friendly init defaults and author_default"},{"op":"replace","path":"/metadata/files/51/path","value":"src/cli/commands/workspace/init.ts"},{"op":"replace","path":"/metadata/files/50/note","value":"use compact flag contracts in command surface"},{"op":"replace","path":"/metadata/files/50/path","value":"src/cli/commands/workspace/contracts.ts"},{"op":"replace","path":"/metadata/files/49/note","value":"config positional value routing"},{"op":"replace","path":"/metadata/files/49/path","value":"src/cli/commands/workspace/config.ts"},{"op":"replace","path":"/metadata/files/48/note","value":"type support for test list option"},{"op":"replace","path":"/metadata/files/48/path","value":"src/cli/commands/test/test.ts"},{"op":"replace","path":"/metadata/files/46/note","value":"keyword search scores reminder/event corpus and short phrase matches"},{"op":"replace","path":"/metadata/files/46/path","value":"src/cli/commands/query/search.ts"},{"op":"replace","path":"/metadata/files/45/path","value":"src/cli/commands/query/list.ts"},{"op":"replace","path":"/metadata/files/44/note","value":"get depth projections for low-token agent reads"},{"op":"replace","path":"/metadata/files/44/path","value":"src/cli/commands/query/get.ts"},{"op":"replace","path":"/metadata/files/43/note","value":"review note: document local validation regex risk boundary"},{"op":"replace","path":"/metadata/files/43/path","value":"src/cli/commands/linked-test-parsers.ts"},{"op":"replace","path":"/metadata/files/42/note","value":"event date alias for update"},{"op":"replace","path":"/metadata/files/42/path","value":"src/cli/commands/lifecycle/update.ts"},{"op":"replace","path":"/metadata/files/41/note","value":"Plan show field projection UX fix"},{"op":"replace","path":"/metadata/files/41/path","value":"src/cli/commands/lifecycle/plan.ts"},{"op":"replace","path":"/metadata/files/40/note","value":"event date alias for create"},{"op":"replace","path":"/metadata/files/40/path","value":"src/cli/commands/lifecycle/create.ts"},{"op":"replace","path":"/metadata/files/39/note","value":"claim skipped response coverage and claimed_by branch hardening"},{"op":"replace","path":"/metadata/files/39/path","value":"src/cli/commands/lifecycle/claim.ts"},{"op":"replace","path":"/metadata/files/38/note","value":"Avoid duplicated compact history diff payload for token efficiency"},{"op":"replace","path":"/metadata/files/38/path","value":"src/cli/commands/history/history.ts"},{"op":"replace","path":"/metadata/files/37/note","value":"harden activity output for malformed legacy history rows"},{"op":"replace","path":"/metadata/files/37/path","value":"src/cli/commands/history/activity.ts"},{"op":"replace","path":"/metadata/files/36/note","value":"metadata output token-noise reduction verification"},{"op":"replace","path":"/metadata/files/36/path","value":"src/cli/commands/governance/validate.ts"},{"op":"replace","path":"/metadata/files/35/note","value":"health brief projection for low-token agent diagnostics"},{"op":"replace","path":"/metadata/files/35/path","value":"src/cli/commands/governance/health.ts"},{"op":"replace","path":"/metadata/files/34/note","value":"fix extension reload/watch usage guidance"},{"op":"replace","path":"/metadata/files/34/path","value":"src/cli/commands/extension/extension.ts"},{"op":"replace","path":"/metadata/files/33/note","value":"Add get projection flags to shell completions"},{"op":"replace","path":"/metadata/files/33/path","value":"src/cli/commands/completion.ts"},{"op":"replace","path":"/metadata/files/32/note","value":"type support for docs list option"},{"op":"replace","path":"/metadata/files/32/path","value":"src/cli/commands/annotations/docs.ts"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-22T05:00:03.509Z"}],"before_hash":"fbbe23b9774746aa2c5be0758474f72cdb43bc8d0d9a90ad237bf841e3def4d7","after_hash":"e19bd628ca72a3a30e86991bfcc697a13de44c2e1573184c5b9ca2dd7cde8c00","item_hash_version":3,"message":"pm-kb5h/pm-j8z6: migrate current source/spec links to command domains; preserve link notes and immutable delivery history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"32fe4be25a08d0f4814e726730d73b1c6559236c297b7ed7fcbad5f3b8813b46"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:45:31.227Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/docs/13/note","value":"sync MCP tool list"},{"op":"replace","path":"/metadata/docs/13/path","value":"plugins/pm-claude/skills/pm-init/SKILL.md"},{"op":"replace","path":"/metadata/docs/12/note","value":"remove stale pm_guide tool documentation"},{"op":"replace","path":"/metadata/docs/12/path","value":"plugins/pm-claude/README.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:45:31.227Z"}],"before_hash":"e19bd628ca72a3a30e86991bfcc697a13de44c2e1573184c5b9ca2dd7cde8c00","after_hash":"daa8f1fb406acd7f924620635cf70e78aa36d213ba8802cb1c45b839a76a83a4","item_hash_version":3,"message":"Claude plugin commands migrated to native skills; preserve historical linked evidence","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"ef1728317f6c03c437c2831718e49361aa652d4933bebb5247aa8aa03cf5ce8b"} diff --git a/.agents/pm/history/pm-v7dj.jsonl b/.agents/pm/history/pm-v7dj.jsonl index 62a00903c..57eab1465 100644 --- a/.agents/pm/history/pm-v7dj.jsonl +++ b/.agents/pm/history/pm-v7dj.jsonl @@ -19,3 +19,4 @@ {"ts":"2026-07-26T17:27:45.820Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"add","path":"/metadata/dependencies/7","value":{"id":"pm-rnpb","kind":"implements","created_at":"2026-07-26T17:27:45.521Z"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T17:27:45.820Z"}],"before_hash":"2c0b233f7815d9de914a463e85d3062ed35311f9d59c5f0a97009a691cc23ab6","after_hash":"7e2f8482ebe9971fed914afa8c9c9743ab81128e01a401ed4a6bb050f25666eb","message":"Terminal graph backfill (pm-lnrk / pm-3j6it6 lane): add 1 evidence-derived relationship edge(s). Evidence classes used: typed hierarchy mirror so semantic traversal reaches the owning lineage (parent alone is not a traversable semantic kind). Release attribution is stamped, so this metadata write cannot re-bucket the item in the generated changelog."} {"ts":"2026-08-13T07:48:43.988Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_model":"claude-opus-5","agent_model_source":"probe","agent_instance":"7ebf2cca0e1c37e7b3d988ef","agent_provenance":{"model":{"value":"claude-opus-5","source":"probe"},"effort":{"value":"xhigh","source":"environment"},"role":{"value":"implementer","source":"argv"},"topic":null,"version":{"value":"2.1.229","source":"probe"}},"op":"update","patch":[{"op":"remove","path":"/metadata/dependencies/7"},{"op":"remove","path":"/metadata/dependencies/6"},{"op":"remove","path":"/metadata/dependencies/5"},{"op":"remove","path":"/metadata/dependencies/4/author"},{"op":"replace","path":"/metadata/dependencies/4/created_at","value":"2026-07-26T17:27:45.521Z"},{"op":"replace","path":"/metadata/dependencies/4/kind","value":"implements"},{"op":"replace","path":"/metadata/dependencies/4/id","value":"pm-rnpb"},{"op":"replace","path":"/metadata/updated_at","value":"2026-08-13T07:48:43.988Z"}],"before_hash":"7e2f8482ebe9971fed914afa8c9c9743ab81128e01a401ed4a6bb050f25666eb","after_hash":"4d3cfc7c0fe6c4e92e3742b0d8ffe5799167dcd24638f732dae5768d3f355857","item_hash_version":2,"message":"Drop reciprocal child rows: each child already stores the canonical parent edge, so the child spelling was a duplicate of the same logical hierarchy edge"} {"hash_algorithm":"sha256","ts":"2026-09-19T08:41:59.832Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"e700c3209edd3b60c0371159","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-pivf+pm-wrbe","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-19T08:41:59.832Z"},{"op":"add","path":"/metadata/closed_at","value":"2026-05-17T13:46:55.642Z"}],"before_hash":"4d3cfc7c0fe6c4e92e3742b0d8ffe5799167dcd24638f732dae5768d3f355857","after_hash":"b45a2757910d58eab71c311e6cf946725453ff855c075f3943bda9bf4d6909a2","item_hash_version":3,"message":"Backfill closed_at from verified lifecycle history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"2ebbcfc504fb9d0507296f2b3e8d0b2b83dd81799f1482c5e7dd8cd5d0ff6b84"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:45:33.220Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"remove","path":"/metadata/docs/1"},{"op":"replace","path":"/metadata/docs/0/note","value":"existing Claude planner skill reference"},{"op":"replace","path":"/metadata/docs/0/path","value":"plugins/pm-claude/skills/pm-planner/SKILL.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:45:33.220Z"}],"before_hash":"b45a2757910d58eab71c311e6cf946725453ff855c075f3943bda9bf4d6909a2","after_hash":"94ecf82d036f1f216f0e5b9b04a55cf783fa72e51c9c7ef6641a043403ba8829","item_hash_version":3,"message":"Claude plugin commands migrated to native skills; preserve historical linked evidence","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"400b1dec608d2485bec9e7776c492c7fe87eb9a691dff60479394180b6ffa015"} diff --git a/.agents/pm/history/pm-xm7c.jsonl b/.agents/pm/history/pm-xm7c.jsonl index bc268b315..bb0fe8539 100644 --- a/.agents/pm/history/pm-xm7c.jsonl +++ b/.agents/pm/history/pm-xm7c.jsonl @@ -64,3 +64,4 @@ {"ts":"2026-07-26T16:52:59.102Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T16:52:59.102Z"},{"op":"add","path":"/metadata/release","value":"v2026.7.21"}],"before_hash":"113d5e4c521a776dba80661fea6605fed6a195d7e5437cf5b8a3fc4187a59e89","after_hash":"a6c07ecfdb54782625ded50f31ea571fec873b906a7a5ff84370a141abb3db5f","message":"Historical release attribution backfill (pm-3j6it6): stamp the release tag whose window contains this item close event, derived from its immutable history stream, so changelog attribution stops depending on updated_at"} {"ts":"2026-07-26T17:29:41.013Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"add","path":"/metadata/dependencies/10","value":{"id":"pm-gnzh","kind":"related","created_at":"2026-07-26T17:29:40.809Z"}},{"op":"add","path":"/metadata/dependencies/11","value":{"id":"pm-mfkv92","kind":"related","created_at":"2026-07-26T17:29:40.809Z"}},{"op":"add","path":"/metadata/dependencies/12","value":{"id":"pm-qwoy","kind":"related","created_at":"2026-07-26T17:29:40.809Z"}},{"op":"add","path":"/metadata/dependencies/13","value":{"id":"pm-usfg","kind":"implements","created_at":"2026-07-26T17:29:40.809Z"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T17:29:41.013Z"}],"before_hash":"a6c07ecfdb54782625ded50f31ea571fec873b906a7a5ff84370a141abb3db5f","after_hash":"b74b902b35962f2f44d7ce78f3d2a19abc34dfa2f0bf79c57c1be47d4d703f56","message":"Terminal graph backfill (pm-lnrk / pm-3j6it6 lane): add 4 evidence-derived relationship edge(s). Evidence classes used: explicit item identifier recorded in this item durable text (description, body, comments, notes, resolution or close reason); typed hierarchy mirror so semantic traversal reaches the owning lineage (parent alone is not a traversable semantic kind). Release attribution is stamped, so this metadata write cannot re-bucket the item in the generated changelog."} {"hash_algorithm":"sha256","ts":"2026-09-22T05:18:35.525Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"37413fb51dc068370cfb0fdc","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-f4yn","claim:pm-j8z6","claim:pm-kb5h","lineage:pm-j8z6","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-f4yn+pm-j8z6+pm-kb5h","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-f4yn","claim:pm-j8z6","claim:pm-kb5h","lineage:pm-j8z6","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/1/path","value":"src/cli/commands/workspace/contracts.ts"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-22T05:18:35.525Z"}],"before_hash":"b74b902b35962f2f44d7ce78f3d2a19abc34dfa2f0bf79c57c1be47d4d703f56","after_hash":"a638fe1f0e6d05747553e1124c05bebb1d1f5751109b0d360792da0a8c5f5c08","item_hash_version":3,"message":"pm-kb5h/pm-j8z6: migrate current source/spec links to command domains; preserve link notes and immutable delivery history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"a6a7227bad0d1ccfc59090158632650b3ef8be009bd93e0fbea26fb972f34779"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:45:34.998Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/docs/3/note","value":"30-tool initialization summary"},{"op":"replace","path":"/metadata/docs/3/path","value":"plugins/pm-claude/skills/pm-init/SKILL.md"},{"op":"replace","path":"/metadata/docs/2/note","value":"pm_mutate and 30-tool reference"},{"op":"replace","path":"/metadata/docs/2/path","value":"plugins/pm-claude/README.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:45:34.998Z"}],"before_hash":"a638fe1f0e6d05747553e1124c05bebb1d1f5751109b0d360792da0a8c5f5c08","after_hash":"5115e7afd99a6ce50acd542da81075db463aa7de3f493869ae257173acbd07c0","item_hash_version":3,"message":"Claude plugin commands migrated to native skills; preserve historical linked evidence","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"7d08d86baf2c441a127fe3ac5cec62bd1cc6730b38d679ee9d4d73c411e07a00"} diff --git a/.agents/pm/history/pm-xz1p.jsonl b/.agents/pm/history/pm-xz1p.jsonl index 66ee41c05..e24363144 100644 --- a/.agents/pm/history/pm-xz1p.jsonl +++ b/.agents/pm/history/pm-xz1p.jsonl @@ -21,3 +21,4 @@ {"ts":"2026-07-26T17:29:58.493Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T17:29:58.493Z"},{"op":"add","path":"/metadata/dependencies","value":[{"id":"pm-rnpb","kind":"implements","created_at":"2026-07-26T17:29:58.246Z"}]}],"before_hash":"6e64bb0c181c30021bdefb7e6ce7da570c1c41ca68fee4bdb5456453dd09260b","after_hash":"9ede9c38ac9f4da2116ee4702e296e1b0fa3314ec5fd629ff5196b3a3add54d3","message":"Terminal graph backfill (pm-lnrk / pm-3j6it6 lane): add 1 evidence-derived relationship edge(s). Evidence classes used: typed hierarchy mirror so semantic traversal reaches the owning lineage (parent alone is not a traversable semantic kind). Release attribution is stamped, so this metadata write cannot re-bucket the item in the generated changelog."} {"hash_algorithm":"sha256","ts":"2026-09-19T08:42:59.276Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"e700c3209edd3b60c0371159","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-pivf+pm-wrbe","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-pivf","claim:pm-wrbe","lineage:pm-pivf","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-19T08:42:59.276Z"},{"op":"add","path":"/metadata/closed_at","value":"2026-05-17T14:24:38.475Z"}],"before_hash":"9ede9c38ac9f4da2116ee4702e296e1b0fa3314ec5fd629ff5196b3a3add54d3","after_hash":"58ff07a25c0b45bdf86bc149050cbd8cf76c11e81974f67ae959cfe6679a829d","item_hash_version":3,"message":"Backfill closed_at from verified lifecycle history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"c246abe64e3c7d5d9051e6da82019a3f7978599b19e945166be276a529a4a48a"} {"hash_algorithm":"sha256","ts":"2026-09-22T05:12:09.453Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-astra","agent_model_source":"probe","agent_instance":"37413fb51dc068370cfb0fdc","agent_provenance":{"model":{"value":"gpt-6-astra","source":"probe"},"effort":{"value":"medium","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-f4yn","claim:pm-j8z6","claim:pm-kb5h","lineage:pm-j8z6","lineage:pm-33cw","lineage:pm-doxj"]},"topic":{"value":"workset:pm-f4yn+pm-j8z6+pm-kb5h","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-f4yn","claim:pm-j8z6","claim:pm-kb5h","lineage:pm-j8z6","lineage:pm-33cw","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/70/path","value":"src/cli/commands/lifecycle/plan.ts"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-22T05:12:09.453Z"}],"before_hash":"58ff07a25c0b45bdf86bc149050cbd8cf76c11e81974f67ae959cfe6679a829d","after_hash":"1529330d688fa9e67923a7d6620bdb2eac426aafda582f61cd24d122f6384c8a","item_hash_version":3,"message":"pm-kb5h/pm-j8z6: migrate current source/spec links to command domains; preserve link notes and immutable delivery history","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"2769134a905e8f5fdc2c469bc736de8f2f799ab373a9898a3c1f878db86713a6"} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:45:36.356Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"remove","path":"/metadata/files/76"},{"op":"remove","path":"/metadata/files/75"},{"op":"remove","path":"/metadata/files/74"},{"op":"remove","path":"/metadata/files/73"},{"op":"remove","path":"/metadata/files/72"},{"op":"replace","path":"/metadata/files/71/note","value":"Plan command test orphaned path ownership"},{"op":"replace","path":"/metadata/files/71/path","value":"tests/unit/plan-command.spec.ts"},{"op":"replace","path":"/metadata/files/70/note","value":"validation orphaned tracked path backfill"},{"op":"replace","path":"/metadata/files/70/path","value":"tests/unit/migration-gates.spec.ts"},{"op":"replace","path":"/metadata/files/69/path","value":"tests/integration/claude-plugin-contract.spec.ts"},{"op":"replace","path":"/metadata/files/68/path","value":"src/cli/shared-parsers.ts"},{"op":"replace","path":"/metadata/files/67/path","value":"src/cli/migration-gates.ts"},{"op":"replace","path":"/metadata/files/66/path","value":"src/cli/extension-command-help.ts"},{"op":"replace","path":"/metadata/files/65/note","value":"Plan command implementation orphaned path ownership"},{"op":"replace","path":"/metadata/files/65/path","value":"src/cli/commands/lifecycle/plan.ts"},{"op":"replace","path":"/metadata/files/64/path","value":"scripts/release/utils.mjs"},{"op":"replace","path":"/metadata/files/63/path","value":"scripts/release/changelog-promote.mjs"},{"op":"replace","path":"/metadata/files/62/path","value":"plugins/pm-codex/skills/pm-release/SKILL.md"},{"op":"replace","path":"/metadata/files/61/path","value":"plugins/pm-codex/skills/pm-release/agents/openai.yaml"},{"op":"replace","path":"/metadata/files/60/path","value":"plugins/pm-codex/skills/pm-native/SKILL.md"},{"op":"replace","path":"/metadata/files/59/path","value":"plugins/pm-codex/skills/pm-native/agents/openai.yaml"},{"op":"replace","path":"/metadata/files/58/path","value":"plugins/pm-codex/skills/pm-auditor/SKILL.md"},{"op":"replace","path":"/metadata/files/57/path","value":"plugins/pm-codex/skills/pm-auditor/agents/openai.yaml"},{"op":"replace","path":"/metadata/files/56/path","value":"plugins/pm-codex/scripts/pm-mcp-server.mjs"},{"op":"replace","path":"/metadata/files/55/path","value":"plugins/pm-codex/README.md"},{"op":"replace","path":"/metadata/files/54/path","value":"plugins/pm-codex/commands/pm-start-task.md"},{"op":"replace","path":"/metadata/files/53/path","value":"plugins/pm-codex/commands/pm-close-task.md"},{"op":"replace","path":"/metadata/files/52/path","value":"plugins/pm-codex/commands/pm-audit.md"},{"op":"replace","path":"/metadata/files/51/path","value":"plugins/pm-codex/assets/pm-cli-small.svg"},{"op":"replace","path":"/metadata/files/50/path","value":"plugins/pm-codex/.mcp.json"},{"op":"replace","path":"/metadata/files/49/path","value":"plugins/pm-codex/.codex-plugin/plugin.json"},{"op":"replace","path":"/metadata/files/48/path","value":"plugins/pm-claude/skills/pm-workflow/SKILL.md"},{"op":"replace","path":"/metadata/files/47/path","value":"plugins/pm-claude/skills/pm-triage/SKILL.md"},{"op":"replace","path":"/metadata/files/46/path","value":"plugins/pm-claude/skills/pm-status/SKILL.md"},{"op":"replace","path":"/metadata/files/45/path","value":"plugins/pm-claude/skills/pm-start-task/SKILL.md"},{"op":"replace","path":"/metadata/files/44/path","value":"plugins/pm-claude/skills/pm-search/SKILL.md"},{"op":"replace","path":"/metadata/files/43/path","value":"plugins/pm-claude/skills/pm-release/SKILL.md"},{"op":"replace","path":"/metadata/files/42/path","value":"plugins/pm-claude/skills/pm-planner/SKILL.md"},{"op":"replace","path":"/metadata/files/41/path","value":"plugins/pm-claude/skills/pm-new/SKILL.md"},{"op":"replace","path":"/metadata/files/40/path","value":"plugins/pm-claude/skills/pm-list/SKILL.md"},{"op":"replace","path":"/metadata/files/39/path","value":"plugins/pm-claude/skills/pm-init/SKILL.md"},{"op":"replace","path":"/metadata/files/38/path","value":"plugins/pm-claude/skills/pm-developer/SKILL.md"},{"op":"replace","path":"/metadata/files/37/path","value":"plugins/pm-claude/skills/pm-close-task/SKILL.md"},{"op":"replace","path":"/metadata/files/36/path","value":"plugins/pm-claude/skills/pm-calendar/SKILL.md"},{"op":"replace","path":"/metadata/files/35/path","value":"plugins/pm-claude/skills/pm-audit/SKILL.md"},{"op":"replace","path":"/metadata/files/34/path","value":"plugins/pm-claude/scripts/pm-mcp-server.mjs"},{"op":"replace","path":"/metadata/files/33/path","value":"plugins/pm-claude/README.md"},{"op":"replace","path":"/metadata/files/32/path","value":"plugins/pm-claude/hooks/session-start.mjs"},{"op":"replace","path":"/metadata/files/31/path","value":"plugins/pm-claude/hooks/hooks.json"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:45:36.356Z"}],"before_hash":"1529330d688fa9e67923a7d6620bdb2eac426aafda582f61cd24d122f6384c8a","after_hash":"942cbe0c0d6e0c624370b365c1d311ad0b94e80e5a6b33b6d41af3731d26bb6d","item_hash_version":3,"message":"Claude plugin commands migrated to native skills; preserve historical linked evidence","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"2e9bd67754e774e28e31109979fc3d10f3d90fc3e800234c03c7e99e401d5ddc"} diff --git a/.agents/pm/history/pm-zqsrt5.jsonl b/.agents/pm/history/pm-zqsrt5.jsonl index 0faf1ef2a..e98c4e950 100644 --- a/.agents/pm/history/pm-zqsrt5.jsonl +++ b/.agents/pm/history/pm-zqsrt5.jsonl @@ -15,3 +15,4 @@ {"ts":"2026-07-25T20:06:51.301Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","op":"release","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-07-25T20:06:51.301Z"}],"before_hash":"df919e37f261b035b1cc0d74c2d13ad95737c3b50db59dbc7eafe172a516c7df","after_hash":"f6af2bcea8bf6bc64bcd13a7e8fabf25b110ce18ad3028fc2bc5dcbeca40097d"} {"ts":"2026-07-26T16:53:19.932Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T16:53:19.932Z"},{"op":"add","path":"/metadata/release","value":"v2026.7.26"}],"before_hash":"f6af2bcea8bf6bc64bcd13a7e8fabf25b110ce18ad3028fc2bc5dcbeca40097d","after_hash":"f846041824e8df47d8a19add518277e10c8464447784bdd0365a2ae848e7fb14","message":"Historical release attribution backfill (pm-3j6it6): stamp the release tag whose window contains this item close event, derived from its immutable history stream, so changelog attribution stops depending on updated_at"} {"ts":"2026-07-26T17:31:11.160Z","author":"harness:claude-code","author_source":"detected","agent_harness":"claude-code","agent_instance":"ad0de54baae9cc12afd5a5a6","op":"update","patch":[{"op":"add","path":"/metadata/dependencies/10","value":{"id":"pm-5k4v","kind":"implements","created_at":"2026-07-26T17:31:10.915Z"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-07-26T17:31:11.160Z"}],"before_hash":"f846041824e8df47d8a19add518277e10c8464447784bdd0365a2ae848e7fb14","after_hash":"83f712be9f63f35e8092e55e6d9379ad64994c152c23184750eafe5ac82cd8e1","message":"Terminal graph backfill (pm-lnrk / pm-3j6it6 lane): add 1 evidence-derived relationship edge(s). Evidence classes used: typed hierarchy mirror so semantic traversal reaches the owning lineage (parent alone is not a traversable semantic kind). Release attribution is stamped, so this metadata write cannot re-bucket the item in the generated changelog."} +{"hash_algorithm":"sha256","ts":"2026-09-27T07:58:09.612Z","author":"harness:codex","author_source":"detected","agent_harness":"codex","agent_model":"gpt-6-sol","agent_model_source":"probe","agent_instance":"d47f0e0d79925f50a0df2359","agent_provenance":{"model":{"value":"gpt-6-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]},"topic":{"value":"workset:pm-dudr+pm-erogk1","source":"inferred","confidence":"medium","rule_version":"v2","evidence":["claim:pm-dudr","claim:pm-erogk1","lineage:pm-dudr","lineage:pm-ugqx","lineage:pm-doxj"]}},"op":"files_add","patch":[{"op":"remove","path":"/metadata/files/6"},{"op":"replace","path":"/metadata/files/5/note","value":"initialize client identity scoping"},{"op":"replace","path":"/metadata/files/5/path","value":"src/mcp/server.ts"},{"op":"replace","path":"/metadata/files/4/note","value":"skills omit redundant author"},{"op":"replace","path":"/metadata/files/4/path","value":"plugins/pm-claude/skills"},{"op":"replace","path":"/metadata/files/3/note","value":"automatic identity guidance"},{"op":"replace","path":"/metadata/files/3/path","value":"plugins/pm-claude/README.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-27T07:58:09.612Z"}],"before_hash":"83f712be9f63f35e8092e55e6d9379ad64994c152c23184750eafe5ac82cd8e1","after_hash":"afe2980b75bb7cc62855e141c17a5a5f5ac4d52f9f9d419389ecec2f0a9ffc0c","item_hash_version":3,"message":"Claude plugin command directory removed after native skill migration; existing skills link preserves current evidence","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"0c23146e78812b194ea2d967fa61259aed60134bf63a82a3855a211122319bba"} diff --git a/.agents/pm/issues/pm-cg1sjb.toon b/.agents/pm/issues/pm-cg1sjb.toon index c7349f15b..caa051309 100644 --- a/.agents/pm/issues/pm-cg1sjb.toon +++ b/.agents/pm/issues/pm-cg1sjb.toon @@ -6,7 +6,7 @@ status: closed priority: 2 tags[4]: "area:ci",flake,gate-reliability,performance created_at: "2026-07-26T10:28:46.495Z" -updated_at: "2026-08-12T02:34:16.221Z" +updated_at: "2026-09-27T08:29:11.537Z" closed_at: "2026-08-12T02:34:15.523Z" completed_at: "2026-08-12T02:34:15.523Z" author: "harness:opencode" @@ -19,7 +19,7 @@ severity: low resolution: SDK entrypoint import cost admission is resilient to isolated scheduler or cache outliers while still failing a majority persistent slowdown against unchanged budgets. expected_result: A single noisy process cannot fail the gate; genuinely over-budget repeated samples still fail and RSS remains fail-closed. actual_result: The five-sample median policy and negative controls merged in 17b40763f; merged-head benchmark and CI workflows passed. -dependencies[9]: +dependencies[11]: - id: pm-ag9nka kind: related created_at: "2026-07-26T10:29:40.699Z" @@ -59,7 +59,19 @@ dependencies[9]: author: "harness:claude-code" source_kind: "cli:update:dep" author_source: detected -comments[7]{created_at,author,text}: + - id: pm-dudr + kind: discovered_from + created_at: "2026-09-27T08:29:11.162Z" + author: "harness:codex" + source_kind: "cli:update:dep" + author_source: detected + - id: pm-erogk1 + kind: discovered_from + created_at: "2026-09-27T08:29:11.162Z" + author: "harness:codex" + source_kind: "cli:update:dep" + author_source: detected +comments[8]{created_at,author,text}: "2026-08-04T09:18:04.437Z","harness:codex","Fresh audit evidence 2026-08-04: pnpm lint reached the SDK import-cost gate after ESLint, jscpd, static quality, package boundary, package-SDK parity, token budgets, context calibration, gate registry, and SDK surface checks passed. The first fresh-process sample failed governance 536ms>248ms, merge 258ms>195ms, and query 214ms>172ms. An immediate isolated rerun failed on bare node 117ms>95ms instead, demonstrating sample-to-sample and target-to-target instability rather than a stable entrypoint regression. The gate remains a real quality failure until its measurement contract is made robust." "2026-08-05T18:27:07.798Z","harness:claude-code","Fresh non-determinism sample, 2026-08-05, on an unchanged src tree (this session's diff touches only scripts/, tests/ and tracker data — zero files under src/). Three consecutive --check runs, back to back, warm cache:\n\n run 1: Verified SDK entrypoint import costs (10 entrypoints)\n run 2: FAILED — ./sdk/authoring 140ms > 133ms, ./sdk/query 203ms > 172ms\n run 3: Verified SDK entrypoint import costs (10 entrypoints)\n\nA prior run in the same session had failed on a different entrypoint again (./sdk 375ms > 367ms). So the gate does not merely false-fail on a cold filesystem cache as the title states — it false-fails on a warm one too, and the entrypoint that trips is not stable between runs. Two of five failures observed today were within 6 percent of the budget.\n\nThat widens the fix: a single-shot fresh-process sample cannot separate an 8ms regression from 8ms of scheduler noise at any cache temperature, so the remedy has to be a sampling and admission policy (best-of-N, or a distribution with a declared confidence), not a warm-up." "2026-08-11T14:34:47.393Z","harness:claude-code","Sibling instance observed 2026-08-11, cause not determined. token-budget-gate fails locally on health-default (167 estimated tokens against a 137 budget, baseline 496 bytes / 124 tokens) while the hosted Gates (static) job reports 'Token budget gate passed (29 surfaces checked)' on the identical commit 61d68bd7e. The gate measures an isolated PM_PATH fixture, not the real tracker, so no tracker state can explain it: pm health --check-only emits exactly 496 bytes here through both the global binary and node dist/cli.js, and is byte-identical against a copy of the pre-commit tracker. So the divergence is environmental and reproducible locally, not a flake, and it is not the cold-cache timing shape this item owns - nothing here is timed. Recorded as an adjacent instance rather than filed, because the cause was not isolated. Same class as the closed pm-fr4dg8, where a ratchet verdict turned out to be a property of the working copy rather than of the commit, extended to a gate that reads a synthetic fixture. Anyone re-running this locally should trust the hosted verdict and not update the baseline." @@ -67,6 +79,7 @@ comments[7]{created_at,author,text}: "2026-08-12T01:20:05.383Z","harness:codex",Implementation uses the existing five fresh measured processes after one discarded warm-up but admits the median rather than p95/max-of-five. One cold or descheduled outlier no longer false-fails; a majority persistent slowdown still exceeds the unchanged ratchet plus 30ms margin. p95 remains reported as diagnostic evidence and RSS remains max-observed/fail-closed. Focused regression and live ten-entrypoint check pass; budget JSON is unchanged. "2026-08-12T01:40:23.138Z","harness:codex","Implementation and verification evidence: SDK entrypoint admission now evaluates the median of five measured cold imports against the unchanged budget plus 30 ms tolerance, while retaining p95 as a diagnostic and maximum RSS as a strict limit. The focused benchmark contract passed 11 tests; repeated isolated gates passed; the aggregate tracker-context pnpm lint passed every static, graph, assurance, token, package, and performance gate; full coverage passed 486 files and 7,242 tests at exact 100/100/100/100." "2026-08-12T02:34:14.857Z","harness:codex","Merged-head evidence: PR #983 merged median-of-five import admission with discarded warm-up, unchanged budgets, diagnostic p95, and strict maximum RSS at 17b40763f. Main CodSpeed run 31556883858 and CI run 31556883969 passed, including static gate and the persistent-regression negative control." + "2026-09-27T08:27:18.288Z","harness:codex","2026-09-27 recurrence on unchanged SDK entrypoint bundles during pm-dudr/pm-erogk1 validation: aggregate quality:static failed ./sdk/merge median 233ms > 226ms; immediate isolated --check failed a different entrypoint, ./sdk/governance 330ms > 327ms; next unchanged isolated --check passed all 10 entrypoints. This is the prior warm-cache nondeterminism signature despite median-of-five, not evidence of an import regression in either changed work item. Follow-up should evaluate host-load-normalized admission without weakening persistent-regression controls." files[3]{path,scope,note}: scripts/bench/sdk-entrypoint-budgets.json,project,budget table measured against scripts/bench/sdk-entrypoint-costs.mjs,project,Five-sample median admission with discarded warm-up and unchanged budgets diff --git a/.agents/pm/issues/pm-erogk1.toon b/.agents/pm/issues/pm-erogk1.toon index 7250ef045..2b9a61e06 100644 --- a/.agents/pm/issues/pm-erogk1.toon +++ b/.agents/pm/issues/pm-erogk1.toon @@ -2,15 +2,75 @@ id: pm-erogk1 title: Refuse local package installation when source scan stops at entry limit description: "GitHub #1321: local package source inspection reaches max_entries=10000, reports copy.complete=false and stop_reason=entry_limit, yet dry-run and real install return ok=true, warnings=[] and exit 0; real path may activate a partial package. Fail closed before write/activation, give a packed-package recovery hint, and align dry-run readiness." type: Issue -status: open +status: closed priority: 1 tags: [] created_at: "2026-09-27T00:37:15.358Z" -updated_at: "2026-09-27T00:37:15.358Z" +updated_at: "2026-09-27T09:23:30.512Z" +closed_at: "2026-09-27T09:23:26.012Z" +completed_at: "2026-09-27T09:23:26.012Z" author: "harness:codex" parent: pm-x6jf -dependencies[1]{id,kind,created_at,author,source_kind,author_source}: +resolution: The SDK rejects incomplete local package scans before mutation and now formats packed-archive recovery with the caller-selected project or global scope. A global-scope regression test and documentation enforce the behavior. +expected_result: "Truncated project and global directory installs refuse safely, preserve their requested archive retry scope, and leave destinations untouched; packed archives install in that same scope." +actual_result: "The global regression failed before the scope fix and passed afterward; an isolated CLI project refused dry and real global installs without destination writes and activated a packed global archive. Linked test, docs-skills, ESLint and full 9,373-test coverage passed at 100/100/100/100; prior exact-head hosted checks were green before this correction, and new-head CI remains pending." +dependencies[2]{id,kind,created_at,author,source_kind,author_source}: pm-x6jf,discovered_from,"2026-09-27T00:37:15.358Z","harness:codex","cli:create:dep",detected -comments[1]{created_at,author,text}: + pm-5bsofk,discovered_from,"2026-09-27T07:08:20.071Z","harness:codex","cli:update:dep",detected +comments[10]{created_at,author,text}: "2026-09-27T00:37:15.358Z","harness:codex","Duplicate check across all PM statuses: searched GH #1321, entry_limit, incomplete source scan, partial package copy, and package install. Earlier lifecycle items cover different completed fixes; no existing item owns this limit-truncation defect. Source: https://github.com/unbraind/pm-cli/issues/1321. Intake only; item remains open and unclaimed." + "2026-09-27T07:08:21.032Z","harness:codex","Pre-fix regression: focused SDK test returned ok=true with copy.complete=false and stop_reason=entry_limit. The same test now passes after the SDK planner refuses incomplete local directory scans before dry-run or real installation, with a stable error code and archive recovery. Direct planner remains able to report lower-bound scans." + "2026-09-27T07:14:33.251Z","harness:codex",Generated the SDK public error-code catalog after adding extension_install_incomplete_source_scan; the generator rebalanced one existing entry across partitions without changing its contract. + "2026-09-27T07:16:17.412Z","harness:codex",Regenerated the exact public contracts fixture for the new refusal code after the static gate correctly detected catalog drift. + "2026-09-27T07:30:31.403Z","harness:codex","The generated refusal census now lists the new code as uncovered by its executable cross-command recovery probes, even though the focused SDK regression checks its structured code and recovery message. This is explicit scope evidence, not a claim of full recovery-census coverage." + "2026-09-27T07:50:25.287Z","harness:codex","Manual temporary-project proof (2026-09-27): initialized isolated PM_PATH/PM_GLOBAL_PATH; SDK maxEntries=1 and CLI default maxDepth=64 refused local source with extension_install_incomplete_source_scan in both dry-run and real modes; no destination created. npm pack --ignore-scripts --json then pm package install --project activated the package and installed index.js. First proof script only misparsed npm 11 object-shaped pack JSON; corrected parser and full proof passed." + "2026-09-27T08:36:11.973Z","harness:codex","Verification: linked focused test passed 2/2 in sandbox; full repository coverage passed 9,373 tests and exact 100/100/100/100; packed npm/npx and Bun/bunx smoke passed across nine packages; manual isolated project proved no partial destination and archive recovery. pnpm audit found zero advisories. Static aggregate advanced past contracts, docstrings, lint, duplicate checks, tracker gate and SDK surface before an unchanged-entrypoint timing overrun; its isolated import gate passed on retry. Graph, record-integrity and mutation gates passed separately. Hosted exact-head CI remains the release gate." + "2026-09-27T08:36:20.713Z","harness:codex","Correction to preceding verification note: the aggregate static script stopped at SDK import timing; a separate run of its subsequent CLI transport-floor gate also exceeded local host latency ceilings (context/next/create/claim), while host load average was about 7. Both timing gates await hosted CI verdict. All non-timing static stages reached so far passed." + "2026-09-27T09:07:24.110Z","harness:codex","Review finding on PR #1323 (CodeRabbit inline): packed-archive recovery text hardcoded --project even for a global install. Added a real global-scope SDK regression to the existing install-refusal test; it failed before the fix with nextSteps ending --project and passed after the SDK interpolated the requested scope. Build and linked focused test pass. Full coverage is running before reclosure." + "2026-09-27T09:22:00.077Z","harness:codex","Manual review-fix acceptance in a fresh temporary project: a 65-level local source refused both dry and real pm package install --global commands with a nonzero structured error whose archive retry uses --global; no global destination was written. npm pack --ignore-scripts --json followed by pm package install --global activated the package and installed index.js. Temporary PM_PATH/PM_GLOBAL_PATH were removed afterward." +files[6]{path,scope,note}: + sdk/public-surface.json,project,additive SDK refusal vocabulary snapshot + src/sdk/extension/install-plan.ts,project,SDK fail-closed local directory scan + src/sdk/generated/generated-error-code-catalog-part-1.ts,project,generated public refusal code contract + src/sdk/generated/generated-error-code-catalog-part-2.ts,project,partition moved by exhaustive catalog generation + tests/fixtures/contracts/full.json,project,generated public error-code contract snapshot + tests/unit/extensions/extension-install-dry-run.spec.ts,project,dry-run and real install regression with entry and depth limits +tests[1]{command,scope,timeout_seconds,provenance{author,created_at,source_kind,source_ref},note}: + node scripts/run-tests.mjs test -- tests/unit/extensions/extension-install-dry-run.spec.ts,project,240,"harness:codex","2026-09-27T07:08:19.397Z",local_mutation,fix/package-install-readiness-claude-plugin-contracts,SDK package install boundary regression +test_runs[2]: + - run_id: test-local-mujk8d3l-7msa2y + kind: test + status: passed + started_at: "2026-09-27T08:31:43.603Z" + finished_at: "2026-09-27T08:32:00.081Z" + recorded_at: "2026-09-27T08:32:00.081Z" + passed: 1 + failed: 0 + skipped: 0 + executions[1]{command,requested_pm_context_mode,pm_context_mode,workspace_context_mode,trust_reason}: + node scripts/run-tests.mjs test -- tests/unit/extensions/extension-install-dry-run.spec.ts,schema,schema,source,local_source_ref + - run_id: test-local-mujlgxsm-yxwm7r + kind: test + status: passed + started_at: "2026-09-27T09:06:23.528Z" + finished_at: "2026-09-27T09:06:39.766Z" + recorded_at: "2026-09-27T09:06:39.766Z" + passed: 1 + failed: 0 + skipped: 0 + executions[1]{command,requested_pm_context_mode,pm_context_mode,workspace_context_mode,trust_reason}: + node scripts/run-tests.mjs test -- tests/unit/extensions/extension-install-dry-run.spec.ts,schema,schema,source,local_source_ref +docs[3]{path,scope,note}: + CHANGELOG.md,project,Generated changelog entry for package install refusal + docs/generated/REFUSAL_CLOSURE_CENSUS.md,project,generated new refusal census row + docs/PACKAGE_EVIDENCE.md,project,installer refusal and recovery contract +close_reason: Fixed review-identified global archive recovery scope and verified both package scopes +escape_class: production_defect +gate_evidence: + disposition: gate_strengthened + owner: pm-erogk1 + gate_id: CI / Gates (coverage) + negative_control: "With the SDK incomplete-scan refusal removed, node scripts/run-tests.mjs test -- tests/unit/extensions/extension-install-dry-run.spec.ts fails because a truncated local source install resolves successfully." + local_checks[3]: node scripts/run-tests.mjs test -- tests/unit/extensions/extension-install-dry-run.spec.ts,node scripts/run-tests.mjs coverage -- --maxWorkers=4,"pnpm smoke:npx" + hosted_checks[2]: CI / Gates (coverage),CI / Gates (static) body: "" diff --git a/.agents/pm/issues/pm-xz1p.toon b/.agents/pm/issues/pm-xz1p.toon index 050e247a2..e20c82191 100644 --- a/.agents/pm/issues/pm-xz1p.toon +++ b/.agents/pm/issues/pm-xz1p.toon @@ -6,7 +6,7 @@ status: closed priority: 2 tags[4]: files,pm-cli,tracker-hygiene,validation created_at: "2026-05-03T13:55:10.634Z" -updated_at: "2026-09-22T05:12:09.453Z" +updated_at: "2026-09-27T07:45:36.356Z" closed_at: "2026-05-17T14:24:38.475Z" author: codex-audit acceptance_criteria: Missing linked paths from old src/*.ts locations are migrated or removed; orphaned tracked files are linked to relevant items or intentionally documented; pm validate --check-files --scan-mode tracked-all passes without file-link warnings. @@ -22,7 +22,7 @@ comments[4]{created_at,author,text}: "2026-05-16T16:48:30.998Z",codex-agent,"Audit update 2026-05-16: release gate and secret scan pass. pm validate --check-resolution is clean; linked-file hygiene remains separate open scope and was not expanded in this init/package setup fix." "2026-05-17T08:33:08.805Z",codex-agent,"Validation hygiene cleanup complete: removed 42 stale missing linked paths from historical files/docs metadata using pm files/docs mutations, linked all 75 tracked orphaned paths to pm-xz1p for explicit ownership, and re-ran 'pm validate --check-files --scan-mode tracked-all --json' to green (missing=0, orphaned=0)." "2026-05-17T14:24:36.888Z",codex-agent,"Verification evidence 2026-05-17: fresh tracked-all validation found only two new orphaned Plan paths (src/cli/commands/plan.ts and tests/unit/plan-command.spec.ts). Linked both to pm-xz1p with pm files, then reran pm validate --check-files --scan-mode tracked-all --json: status ok, missing_linked_paths_count=0, orphaned_paths_count=0. Acceptance criteria now satisfied again after the Plan feature landed." -files[77]{path,scope,note}: +files[72]{path,scope,note}: .claude-plugin/marketplace.json,project,validation orphaned tracked path backfill .mcp.json,project,validation orphaned tracked path backfill docs/examples/ci/gitlab-ci-pm-extension-gate.yml,project,validation orphaned tracked path backfill @@ -54,28 +54,23 @@ files[77]{path,scope,note}: plugins/pm-claude/agents/pm-delivery-chain.md,project,validation orphaned tracked path backfill plugins/pm-claude/agents/pm-triage-agent.md,project,validation orphaned tracked path backfill plugins/pm-claude/agents/pm-verification-agent.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-audit.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-calendar.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-close-task.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-developer.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-init.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-list.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-new.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-planner.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-release.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-search.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-start-task.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-status.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-triage.md,project,validation orphaned tracked path backfill - plugins/pm-claude/commands/pm-workflow.md,project,validation orphaned tracked path backfill plugins/pm-claude/hooks/hooks.json,project,validation orphaned tracked path backfill plugins/pm-claude/hooks/session-start.mjs,project,validation orphaned tracked path backfill plugins/pm-claude/README.md,project,validation orphaned tracked path backfill plugins/pm-claude/scripts/pm-mcp-server.mjs,project,validation orphaned tracked path backfill plugins/pm-claude/skills/pm-audit/SKILL.md,project,validation orphaned tracked path backfill + plugins/pm-claude/skills/pm-calendar/SKILL.md,project,validation orphaned tracked path backfill + plugins/pm-claude/skills/pm-close-task/SKILL.md,project,validation orphaned tracked path backfill plugins/pm-claude/skills/pm-developer/SKILL.md,project,validation orphaned tracked path backfill + plugins/pm-claude/skills/pm-init/SKILL.md,project,validation orphaned tracked path backfill + plugins/pm-claude/skills/pm-list/SKILL.md,project,validation orphaned tracked path backfill + plugins/pm-claude/skills/pm-new/SKILL.md,project,validation orphaned tracked path backfill plugins/pm-claude/skills/pm-planner/SKILL.md,project,validation orphaned tracked path backfill plugins/pm-claude/skills/pm-release/SKILL.md,project,validation orphaned tracked path backfill + plugins/pm-claude/skills/pm-search/SKILL.md,project,validation orphaned tracked path backfill + plugins/pm-claude/skills/pm-start-task/SKILL.md,project,validation orphaned tracked path backfill + plugins/pm-claude/skills/pm-status/SKILL.md,project,validation orphaned tracked path backfill + plugins/pm-claude/skills/pm-triage/SKILL.md,project,validation orphaned tracked path backfill plugins/pm-claude/skills/pm-workflow/SKILL.md,project,validation orphaned tracked path backfill plugins/pm-codex/.codex-plugin/plugin.json,project,validation orphaned tracked path backfill plugins/pm-codex/.mcp.json,project,validation orphaned tracked path backfill diff --git a/.agents/pm/issues/pm-zqsrt5.toon b/.agents/pm/issues/pm-zqsrt5.toon index 5a3616fb2..652924b32 100644 --- a/.agents/pm/issues/pm-zqsrt5.toon +++ b/.agents/pm/issues/pm-zqsrt5.toon @@ -6,7 +6,7 @@ status: closed priority: 1 tags[7]: agent-ux,"area:mcp",author,defect,docs,identity,plugins created_at: "2026-07-25T12:26:07.305Z" -updated_at: "2026-07-26T17:31:11.160Z" +updated_at: "2026-09-27T07:58:09.612Z" closed_at: "2026-07-25T20:06:50.186Z" author: "harness:claude-code" estimated_minutes: 150 @@ -23,28 +23,27 @@ release: v2026.7.26 resolution: Removed hard-wired PM_AUTHOR and agent payload authors from MCP/plugin configuration and propagated bounded initialize client identity. expected_result: Repository and bundled plugins rely on automatic attribution while keeping authenticated principal claims distinct. actual_result: "MCP integrations, 31-file Claude plugin smoke, full suite, packed acceptance, and hosted gates pass." -dependencies[11]{id,kind,created_at,author,source_kind}: - pm-03pq3o,related,"2026-07-25T12:26:07.305Z",null,null - pm-5k4v,related,"2026-07-25T12:26:07.305Z",null,null - pm-6uxhe0,related,"2026-07-25T12:26:07.305Z",null,null - pm-95d7,related,"2026-07-25T12:26:07.305Z",null,null - pm-z3ez,related,"2026-07-25T12:26:07.305Z",null,null - pm-9k90,related,"2026-07-25T12:35:02.847Z",null,null - pm-brxdct,related,"2026-07-25T12:35:02.847Z",null,null - pm-j82fd3,related,"2026-07-25T12:35:02.847Z",null,null - pm-l9wl,related,"2026-07-25T12:35:02.847Z",null,null - pm-sx52hr,related,"2026-07-25T12:35:02.847Z",null,null - pm-5k4v,implements,"2026-07-26T17:31:10.915Z",null,null +dependencies[11]{id,kind,created_at}: + pm-03pq3o,related,"2026-07-25T12:26:07.305Z" + pm-5k4v,related,"2026-07-25T12:26:07.305Z" + pm-6uxhe0,related,"2026-07-25T12:26:07.305Z" + pm-95d7,related,"2026-07-25T12:26:07.305Z" + pm-z3ez,related,"2026-07-25T12:26:07.305Z" + pm-9k90,related,"2026-07-25T12:35:02.847Z" + pm-brxdct,related,"2026-07-25T12:35:02.847Z" + pm-j82fd3,related,"2026-07-25T12:35:02.847Z" + pm-l9wl,related,"2026-07-25T12:35:02.847Z" + pm-sx52hr,related,"2026-07-25T12:35:02.847Z" + pm-5k4v,implements,"2026-07-26T17:31:10.915Z" comments[4]{created_at,author,text}: "2026-07-25T18:18:24.300Z","harness:codex","Implementation start: active in the cohesive automatic identity platform PR spanning the identity ADR, structured SDK provenance, precedence-safe observation, declarative harness registry, MCP/plugin configuration, and token-minimal help guidance. Duplicate check covered all 2,028 tracker items and live GitHub reports; no new item created." "2026-07-25T19:14:52.683Z","harness:claude-code","Implementation evidence: removed hard-wired PM_AUTHOR and claude-code-agent payloads from repository and bundled Claude MCP/plugin configuration, commands, agents, and skills. MCP now captures initialize clientInfo and scopes tools/call through automatic identity signals; instructions explicitly distinguish local harness provenance from authenticated principal claims. Plugin smoke passed with all 31 files and full flow; MCP integration, full suite, and 100% coverage passed." "2026-07-25T19:52:00.406Z","harness:codex","Review amendment: session identifiers are transient host context only and are no longer serialized to durable history or telemetry. Exact branch-local history streams were scrubbed of the mistakenly persisted top-level field. Additional review hardening covers bounded settings validation, executable-basename argv matching, inherited environment values, cached descriptor normalization, deterministic telemetry tests, and failure-safe registration cleanup." "2026-07-25T20:06:49.000Z","harness:codex","Final evidence: PR #713 exact head 446d00ae passed all 6,376 tests and 100/100/100/100 coverage (44,010 statements, 31,205 branches, 8,996 functions, 42,752 lines); strict 100% docstring/static/token/API gates; packed unrelated-directory SDK and CLI acceptance; CodeQL, DeepScan with zero findings, Semgrep, Trivy, TruffleHog, CodeFactor, Hound, Windows, compatibility, smokes, and benchmarks. All 13 CodeRabbit findings were individually fixed/dispositioned/reacted and every thread is resolved. Follow-up CodeRabbit and Greptile requests reached external free-review limits after the complete first review." -files[7]{path,scope,note}: +files[6]{path,scope,note}: .mcp.json,project,repo MCP automatic identity plugins/pm-claude/.mcp.json,project,plugin MCP automatic identity plugins/pm-claude/agents,project,agent prompts omit redundant author - plugins/pm-claude/commands,project,slash commands omit redundant author plugins/pm-claude/README.md,project,automatic identity guidance plugins/pm-claude/skills,project,skills omit redundant author src/mcp/server.ts,project,initialize client identity scoping diff --git a/.agents/pm/tasks/pm-1265.toon b/.agents/pm/tasks/pm-1265.toon index 58ff9deed..d5fcee983 100644 --- a/.agents/pm/tasks/pm-1265.toon +++ b/.agents/pm/tasks/pm-1265.toon @@ -6,7 +6,7 @@ status: closed priority: 2 tags[6]: agent-ux,docs,guide,init,plugins,pm-cli created_at: "2026-05-17T09:00:17.605Z" -updated_at: "2026-09-19T08:39:14.597Z" +updated_at: "2026-09-27T07:45:38.353Z" closed_at: "2026-05-17T10:10:58.420Z" author: codex-agent acceptance_criteria: "Quickstart, Agent Guide, Command Reference, help/guide surfaces, and relevant plugin guidance mention the agent-guidance init option and decline/add-later behavior; docs avoid stale copied flag lists where runtime contracts should be used; docs are linked to implementation items before closure." @@ -38,7 +38,7 @@ files[7]{path,scope,note}: docs/AGENT_GUIDE.md,project,Agent workflow bootstrap includes guidance checks docs/COMMANDS.md,project,Init command guidance mode reference docs/QUICKSTART.md,project,Init guidance mode usage and non-interactive behavior - plugins/pm-claude/commands/pm-init.md,project,Claude plugin init guidance + plugins/pm-claude/skills/pm-init/SKILL.md,project,Claude plugin init guidance plugins/pm-codex/README.md,project,Codex plugin guidance if applicable src/cli/guide-topics.ts,project,guide routing for agent workflows src/cli/help-content.ts,project,init help docs diff --git a/.agents/pm/tasks/pm-aqat.toon b/.agents/pm/tasks/pm-aqat.toon index 724b43482..2775ee759 100644 --- a/.agents/pm/tasks/pm-aqat.toon +++ b/.agents/pm/tasks/pm-aqat.toon @@ -6,7 +6,7 @@ status: closed priority: 2 tags[9]: agent-ux,docs,dogfood,mcp,plan,planning,plugins,pm-cli,sdk created_at: "2026-05-17T08:50:26.532Z" -updated_at: "2026-09-19T08:39:51.892Z" +updated_at: "2026-09-27T07:45:41.515Z" closed_at: "2026-05-17T13:46:45.696Z" author: codex-agent acceptance_criteria: "SDK contracts, MCP schemas, help/docs, Codex/Claude plugin assets, and dogfood all cover Plan and pm plan; examples map Codex/Claude/Cursor planning styles to pm-native Plan items; packed/dogfood validation proves discovery and readback." @@ -30,8 +30,7 @@ dependencies[3]: comments[2]{created_at,author,text}: "2026-05-17T08:50:26.532Z",codex-agent,Child task created from pm-v7dj. This slice follows the core Plan type and pm plan command implementation so external contracts do not get ahead of runtime behavior. "2026-05-17T08:52:39.728Z",codex-agent,"Research evidence: external surfaces must make Plan discoverable to agents through contracts, MCP, plugin commands/skills, docs, and dogfood. Linked SDK/MCP/plugin/docs files and focused regression command for future work." -files[10]{path,scope,note}: - plugins/pm-claude/commands/pm-planner.md,project,Claude planner command should adopt pm plan +files[9]{path,scope,note}: plugins/pm-claude/skills/pm-planner/SKILL.md,project,Claude planner skill should adopt pm plan plugins/pm-codex/README.md,project,Codex plugin Plan workflow docs plugins/pm-codex/skills/pm-native/SKILL.md,project,Codex native Plan workflow skill @@ -43,8 +42,7 @@ files[10]{path,scope,note}: tests/unit/sdk-index.spec.ts,project,Plan SDK action boundary regression tests[1]{command,scope,timeout_seconds,note}: node scripts/run-tests.mjs test -- tests/unit/sdk-index.spec.ts tests/integration/claude-plugin-contract.spec.ts tests/integration/release-readiness-runtime.spec.ts,project,600,focused Plan SDK/plugin/docs regression -docs[3]{path,scope,note}: - plugins/pm-claude/commands/pm-planner.md,project,existing planner command docs to migrate +docs[2]{path,scope,note}: plugins/pm-claude/skills/pm-planner/SKILL.md,project,existing planner skill docs to migrate plugins/pm-codex/README.md,project,Codex plugin Plan workflow docs target close_reason: "Plan workflow exposed in SDK cli-contracts (PLAN_FLAG_CONTRACTS + plan tool action schema), MCP server (pm_plan tool + plan action routing + instructions), Codex/Claude planner docs/skills, docs/COMMANDS.md + docs/AGENT_GUIDE.md, and dogfood-package-first.mjs (Plan lifecycle assertions). pm contracts --command plan --flags-only returns full flag list; pm plan registered as a top-level command; MCP pm_plan operational end-to-end." diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index aa07cc201..6de4bc5c8 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -4,15 +4,13 @@ "name": "unbrained", "url": "https://github.com/unbraind/pm-cli" }, - "metadata": { - "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.", - "version": "2026.9.27" - }, + "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.", + "version": "2026.9.27", "plugins": [ { "name": "pm-claude", "source": "./plugins/pm-claude", - "description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.", + "description": "Native pm CLI integration for Claude Code — 32 MCP tools, 14 workflow skills with slash invocations, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.", "version": "2026.9.27", "author": { "name": "unbrained", diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c3ced58f..189f7c5c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ - Allow self-isolating linked package tests without inherited PM_PATH ([pm-t05d8d](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-t05d8d.toon)) - Preserve every tracker merge fence during nested init and detect lost active mappings ([pm-kynkl8](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-kynkl8.toon)) +- Refuse local package installation when source scan stops at entry limit ([pm-erogk1](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/issues/pm-erogk1.toon)) + +### Other + +- Claude plugin spec-alignment hygiene vs 2026-07-11 official docs (minor, non-blocking) ([pm-dudr](https://github.com/unbraind/pm-cli/blob/main/.agents/pm/chores/pm-dudr.toon)) ## 2026.9.27 - 2026-09-27 diff --git a/docs/CLAUDE_CODE_PLUGIN.md b/docs/CLAUDE_CODE_PLUGIN.md index 12e410842..7bd56e8c5 100644 --- a/docs/CLAUDE_CODE_PLUGIN.md +++ b/docs/CLAUDE_CODE_PLUGIN.md @@ -17,8 +17,8 @@ pm-cli/ (repo root) │ │ ├── pm-developer/ # Developer execution loop with evidence requirements │ │ ├── pm-release/ # Release gate sequence and evidence linking │ │ ├── pm-audit/ # Comprehensive audit suite -│ │ └── pm-planner/ # Planning: decompose, prioritize, triage -│ ├── commands/ # Slash-command definitions (one .md per /pm-* command) +│ │ ├── pm-planner/ # Planning: decompose, prioritize, triage +│ │ └── pm-*/ # Nine focused skill invocations (all /pm-* names retained) │ ├── hooks/ │ │ ├── hooks.json # SessionStart hook definition │ │ └── session-start.mjs # Injects pm context at session start @@ -34,9 +34,14 @@ pm-cli/ (repo root) The MCP server itself lives at `src/mcp/server.ts` (compiled to `dist/mcp/server.js`) and is bundled with the npm package as the `pm-mcp` binary. +`.claude-plugin/marketplace.json` is the current Claude marketplace entrypoint. +The root `marketplace.json` remains for older marketplace consumers. Both files +must contain identical bytes after version stamping; the plugin contract test +checks this so the compatibility copy cannot silently drift. + ## Capability Inventory -The canonical user-facing inventory for MCP tools, slash commands, skills, subagents, and `pm_run` actions lives in [`plugins/pm-claude/README.md`](../plugins/pm-claude/README.md). This page focuses on architecture, launcher behavior, and smoke-test expectations so capability counts do not drift between docs. +The canonical user-facing inventory for MCP tools, skills, slash invocations, subagents, and `pm_run` actions lives in [`plugins/pm-claude/README.md`](../plugins/pm-claude/README.md). This page focuses on architecture, launcher behavior, and smoke-test expectations so capability counts do not drift between docs. ## Installation Methods @@ -49,7 +54,7 @@ Add the pm-cli GitHub repo as a marketplace source, then install: /plugin install pm-claude@pm ``` -This clones the repo, reads `.claude-plugin/marketplace.json` at the root, installs the plugin from `./plugins/pm-claude/`, and configures the MCP server, skills, slash commands, subagents, and the session hook automatically. +This clones the repo, reads `.claude-plugin/marketplace.json` at the root, installs the plugin from `./plugins/pm-claude/`, and configures the MCP server, skills with the same `/pm-*` names, subagents, and the session hook automatically. ### 2. Global MCP via Claude Code CLI (MCP tools only) @@ -57,7 +62,7 @@ This clones the repo, reads `.claude-plugin/marketplace.json` at the root, insta claude mcp add --transport stdio pm-mcp -- npx -y --package=@unbrained/pm-cli@latest pm-mcp ``` -Gives you the 32 MCP tools without skills or slash commands. +Gives you the 32 MCP tools without skills. ### 3. Direct project `.mcp.json` (project-scoped MCP only) @@ -171,8 +176,8 @@ For migration details and automation expectations, see: ### Validate manifests ```bash -claude plugin validate .claude-plugin/marketplace.json -claude plugin validate plugins/pm-claude/.claude-plugin/plugin.json +claude plugin validate . --strict +claude plugin validate plugins/pm-claude --strict ``` ### Manual verification diff --git a/docs/PACKAGE_EVIDENCE.md b/docs/PACKAGE_EVIDENCE.md index 17018689d..330efda5e 100644 --- a/docs/PACKAGE_EVIDENCE.md +++ b/docs/PACKAGE_EVIDENCE.md @@ -1,6 +1,7 @@ # Install Plans and Update Evidence -Tracked by [pm-5bsofk](../.agents/pm/issues/pm-5bsofk.toon) and +Tracked by [pm-erogk1](../.agents/pm/issues/pm-erogk1.toon), +[pm-5bsofk](../.agents/pm/issues/pm-5bsofk.toon) and [pm-gf5zw8](../.agents/pm/issues/pm-gf5zw8.toon), with claim controls tracked by [pm-eqdo85](../.agents/pm/issues/pm-eqdo85.toon). @@ -12,15 +13,21 @@ GitHub sources and reports logical file bytes, file/directory/link counts, and the copy policy. External local directories are directory snapshots, including development artifacts; nested destinations exclude `.agents`, `node_modules`, and installer backup directories at every depth using the installer's filter. -Counts are lower bounds when `complete` is false, with `stop_reason` -identifying the entry or depth limit. A source-directory alias resolves to its +The bounded planner can return lower-bound counts with `complete: false` and a +`stop_reason` when called directly. Installing a local directory now refuses +that incomplete scan in both dry-run and real modes before writing or +activating. SDK callers receive +`extension_install_incomplete_source_scan`; the CLI exits nonzero with the +entry or depth limit and a packed-archive recovery step. That recovery keeps +the requested `--project` or `--global` installation scope. A source-directory +alias resolves to its directory before copying; symlink entries inside the source remain links and their targets are never traversed. Planning writes no destination files, managed state, or activation settings; archive and remote source resolution can still prepare temporary source files and perform network or dependency-resolution work. -For development-heavy or incomplete local snapshots, `packed_alternative` +For development-heavy local snapshots, `packed_alternative` provides argument vectors for `npm pack --ignore-scripts --json` and archive installation. Run packing in its reported `cwd`, substitute the returned `pack_result[0].filename`, and install the resulting archive. Normal local diff --git a/docs/generated/REFUSAL_CLOSURE_CENSUS.md b/docs/generated/REFUSAL_CLOSURE_CENSUS.md index 8ca28955f..7601de258 100644 --- a/docs/generated/REFUSAL_CLOSURE_CENSUS.md +++ b/docs/generated/REFUSAL_CLOSURE_CENSUS.md @@ -4,12 +4,12 @@ Tracker: `pm-f05lsg`. Every catalog code is listed. An `uncovered` row is an explicit closure obligation, never an omission or implied approval. -- Catalog error codes: 387 +- Catalog error codes: 388 - Executable error codes: 19 - Executable-code ratchet floor: 18 - Required executable canonical codes: `bulk_ids_input_empty`, `bulk_ids_input_missing_path`, `bulk_ids_input_unreadable`, `invalid_argument_value`, `manifest_unknown_key`, `missing_lifecycle_target`, `missing_required_argument`, `no_version_bounds_declared`, `projection_options_mutually_exclusive`, `tracker_not_initialized`, `tracker_root_missing`, `tracker_root_not_directory`, `tracker_root_unreadable`, `unknown_context_intent`, `unknown_field_projection`, `unknown_option`, `unknown_subcommand` -- Uncovered error codes: 368 -- Coverage fraction: 0.049096 +- Uncovered error codes: 369 +- Coverage fraction: 0.048969 - Closed-domain probes: 19 - Grammar probes: 117 @@ -86,6 +86,7 @@ Every catalog code is listed. An `uncovered` row is an explicit closure obligati | `extension_dependency_name_unsafe` | `extension_dependency_name_unsafe` | uncovered | none | 0 | | `extension_dependency_spec_invalid` | `extension_dependency_spec_invalid` | uncovered | none | 0 | | `extension_dependency_version_unsafe` | `extension_dependency_version_unsafe` | uncovered | none | 0 | +| `extension_install_incomplete_source_scan` | `extension_install_incomplete_source_scan` | uncovered | none | 0 | | `extension_install_soft_failed` | `extension_install_soft_failed` | uncovered | none | 0 | | `extension_install_source_contains_destination` | `extension_install_source_contains_destination` | uncovered | none | 0 | | `extension_item_field_reserved` | `extension_item_field_reserved` | uncovered | none | 0 | diff --git a/marketplace.json b/marketplace.json index aa07cc201..6de4bc5c8 100644 --- a/marketplace.json +++ b/marketplace.json @@ -4,15 +4,13 @@ "name": "unbrained", "url": "https://github.com/unbraind/pm-cli" }, - "metadata": { - "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.", - "version": "2026.9.27" - }, + "description": "Official marketplace for pm CLI — native git-based project management for Claude Code and AI coding agents.", + "version": "2026.9.27", "plugins": [ { "name": "pm-claude", "source": "./plugins/pm-claude", - "description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.", + "description": "Native pm CLI integration for Claude Code — 32 MCP tools, 14 workflow skills with slash invocations, 4 subagents, hybrid TUI task tracking, session context injection, and coordination subagents for git-based project management without leaving Claude Code.", "version": "2026.9.27", "author": { "name": "unbrained", diff --git a/plugins/pm-claude/.claude-plugin/plugin.json b/plugins/pm-claude/.claude-plugin/plugin.json index ca2055f10..a816f78d1 100644 --- a/plugins/pm-claude/.claude-plugin/plugin.json +++ b/plugins/pm-claude/.claude-plugin/plugin.json @@ -1,6 +1,8 @@ { + "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "pm-claude", - "description": "Native pm CLI integration for Claude Code — 28 MCP tools, 5 workflow skills, 14 slash commands, 4 subagents (coordinator, delivery-chain, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.", + "displayName": "pm CLI", + "description": "Native pm CLI integration for Claude Code — 32 MCP tools, 14 skills with slash invocations, 4 subagents (coordinator, delivery-chain, triage, verification), hybrid TUI task tracking (pm as persistent store + Claude Code task panel as live view), session context injection, and full git-based project management without leaving Claude Code.", "version": "2026.9.27", "author": { "name": "unbrained", diff --git a/plugins/pm-claude/.mcp.json b/plugins/pm-claude/.mcp.json index 915e2a996..68ac218dd 100644 --- a/plugins/pm-claude/.mcp.json +++ b/plugins/pm-claude/.mcp.json @@ -2,8 +2,7 @@ "mcpServers": { "pm-mcp": { "command": "node", - "args": ["${CLAUDE_PLUGIN_ROOT}/scripts/pm-mcp-server.mjs"], - "note": "Native pm-cli MCP server with automatic client/harness identity. Imports pm command modules directly — no pm shell invocation needed." + "args": ["${CLAUDE_PLUGIN_ROOT}/scripts/pm-mcp-server.mjs"] } } } diff --git a/plugins/pm-claude/README.md b/plugins/pm-claude/README.md index 4fe656627..b126e17f2 100644 --- a/plugins/pm-claude/README.md +++ b/plugins/pm-claude/README.md @@ -7,15 +7,15 @@ Native pm CLI integration for Claude Code. Use pm project management tools direc | Component | What it provides | |-----------|----------------| | **32 MCP tools** | Full pm surface: discover, next, context, search, events, list, get, create, atomic mutate, copy, focus, update, claim, release, close, comments, files, docs, notes, learnings, deps, graph, test, validate, health, contracts, plan, append, schema, config, profile + `pm_run` for everything else | -| **5 skills** | `pm-workflow`, `pm-developer`, `pm-release`, `pm-audit`, `pm-planner` — auto-loaded as Claude Code skills | -| **14 slash commands** | Full lifecycle coverage — status, start, close, triage, audit, search, new, list, calendar, developer, planner, release, workflow, init | +| **14 skills and slash invocations** | Full lifecycle coverage — status, start, close, triage, audit, search, new, list, calendar, developer, planner, release, workflow, init | | **4 subagents** | `pm-coordinator` (batch/multi-item), `pm-triage-agent` (duplicate-safe item creation), `pm-verification-agent` (evidence + close readiness), and `pm-delivery-chain` (orchestrated delivery) | | **Hybrid TUI tracking** | pm items sync to Claude Code's task panel — pm is the persistent store, the task panel is the live session view | | **Session hook** | Injects active pm item summary at session start using the same pinned pm-cli runtime as the MCP server | -The five skills are generated from the shared portable source in +Five core workflow skills are generated from the shared portable source in `templates/agent-skills/`. Both plugin packages carry identical workflow guidance; the Claude task panel mapping is conditional on its tools. +The other nine skills provide Claude-specific, directly invocable workflows. ## Installation @@ -33,7 +33,7 @@ claude plugin marketplace add /path/to/pm-cli # claude plugin marketplace add unbraind/pm-cli ``` -This installs all 32 MCP tools, 5 skills, 14 slash commands, 4 subagents, hybrid TUI tracking, and the session hook in one step. (`pm-claude` is the plugin name; `pm` is the marketplace name from `marketplace.json`.) +This installs all 32 MCP tools, 14 skills available through `/pm-*`, 4 subagents, hybrid TUI tracking, and the session hook in one step. (`pm-claude` is the plugin name; `pm` is the marketplace name from `.claude-plugin/marketplace.json`.) ### Option B: Global MCP server via Claude Code CLI (MCP tools only) @@ -41,7 +41,7 @@ This installs all 32 MCP tools, 5 skills, 14 slash commands, 4 subagents, hybrid claude mcp add --transport stdio pm-mcp -- npx -y --package=@unbrained/pm-cli@latest pm-mcp ``` -This gives you the 32 MCP tools but not the skills, slash commands, or session hook. +This gives you the 32 MCP tools but not the skills or session hook. ### Option C: Direct `.mcp.json` (project-scoped MCP only) @@ -91,7 +91,7 @@ When you `/pm-start-task` or `/pm-developer`: This means you get full history in pm (survives restarts, visible in `pm list`) and live visual feedback in the Claude Code session. -## Slash Commands +## Skill Invocations | Command | What it does | |---------|-------------| @@ -110,7 +110,7 @@ This means you get full history in pm (survives restarts, visible in `pm list`) | `/pm-workflow [id or description]` | General pm workflow loop with TUI tracking | | `/pm-init [project name]` | Initialize pm in the current project | -## Skills +## Core Skills | Skill | When Claude uses it | |-------|-------------------| diff --git a/plugins/pm-claude/commands/pm-audit.md b/plugins/pm-claude/commands/pm-audit.md deleted file mode 100644 index 926accf43..000000000 --- a/plugins/pm-claude/commands/pm-audit.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -description: Run a comprehensive pm repository audit — health, validation, duplicates, aggregate counts, calendar, and activity. Produces a structured finding report with tracked pm items for actionable issues. ---- - -Use native pm MCP tools to audit the repository's pm tracker state. - -1. **Check for existing audit items** — `pm_search` with query "audit" to avoid duplicate tracking. -2. **Create an audit tracking item** if none exists (or reuse a recent one): - ```json - { "tool": "pm_create", "args": { "options": { "title": "pm tracker audit", "type": "Task", "status": "open", "priority": "1", "createMode": "progressive" } } } - ``` -3. **Claim** the audit item. -4. **Sync to Claude Code task panel**: - ``` - TaskCreate: - subject: "[pm-xxxx] Audit: pm tracker health" - description: "Full pm audit run — pm-xxxx" - activeForm: "Running pm audit" - ``` - Call `TaskUpdate(in_progress)`. Save the taskId. -5. **Run the audit suite** in order: - - `pm_health` — tracker diagnostics - - `pm_validate` with `checkResolution: true, checkHistoryDrift: true, checkFiles: true, scanMode: "tracked-all"` - - `pm_run` with `action: "aggregate", options: { groupBy: "status,type" }` — count breakdown - - `pm_run` with `action: "stats"` — storage metrics - - `pm_run` with `action: "calendar", options: { view: "week", include: "deadlines,reminders" }` — upcoming -6. **Classify findings** — create child pm items for any blocker or warning findings. -7. **Record evidence** with `pm_comments`: summary of all checks and findings. -8. **Close audit item** with `pm_close`, then `pm_release`, then `TaskUpdate(completed)`. -9. **Report** a structured audit summary: - - Health status - - Validation results (pass/warn/fail per check) - - Item counts by status - - Duplicate candidates found - - Overdue or upcoming deadlines - - Any created finding items - -Format the output as a markdown table for the validation results. diff --git a/plugins/pm-claude/commands/pm-developer.md b/plugins/pm-claude/commands/pm-developer.md deleted file mode 100644 index 97f59b64a..000000000 --- a/plugins/pm-claude/commands/pm-developer.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -description: Run the pm-cli developer execution loop — orient, claim, implement, link evidence, verify, and close — with native MCP tools and live TUI tracking. Accepts an optional item ID or keywords as argument. ---- - -Run the full pm developer loop using native MCP tools. Argument: `$ARGUMENTS` (item ID like `pm-xxxx`, keywords, or empty to orient from context). - -1. **Orient**: - ```json - { "tool": "pm_context", "args": { "options": { "limit": "10" } } } - { "tool": "pm_search", "args": { "query": "$ARGUMENTS", "options": { "limit": "10" } } } - ``` -2. **Find or create the item**: - - If `$ARGUMENTS` is a pm ID: `pm_get` it directly. - - If keywords: pick the best match from search or ask the user. - - If no match: `pm_create` with progressive mode. -3. **Claim** with `pm_claim`, then set `status: "in_progress"` with `pm_update`. -4. **Sync to Claude Code task panel**: - ``` - TaskCreate: - subject: "[pm-xxxx] " - description: "Developer loop — pm-xxxx. AC: " - activeForm: "Implementing pm-xxxx" - ``` - Call `TaskUpdate(in_progress)`. Save the taskId for the session. -5. **Implement** — make the changes. Link evidence as you go: - - `pm_files` for changed source files - - `pm_docs` for updated documentation - - `pm_test` for test commands -6. **Verify**: - - Run the project build and tests - - `pm_validate` with `checkResolution: true` -7. **Record evidence** with `pm_comments`: what changed, what was tested, results. -8. **Close**: - - `pm_close` with reason - - `pm_release` - - `TaskUpdate(completed)` using the saved taskId - -If `$ARGUMENTS` is empty, call `pm_list` to show active items and ask which to work on. diff --git a/plugins/pm-claude/commands/pm-planner.md b/plugins/pm-claude/commands/pm-planner.md deleted file mode 100644 index 31064a61e..000000000 --- a/plugins/pm-claude/commands/pm-planner.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -description: Plan and organize pm work — triage requests, break epics into tasks, prioritize the backlog, and keep the tracker clean. Accepts an optional scope description as argument. ---- - -Run the pm planning loop using native MCP tools. Argument: `$ARGUMENTS` (optional: feature/epic description to decompose, or empty to survey and prioritize the backlog). - -1. **Survey the backlog**: - ```json - { "tool": "pm_context", "args": { "options": { "depth": "standard", "limit": "20" } } } - { "tool": "pm_list", "args": { "options": { "limit": "50" } } } - ``` - -2. **If `$ARGUMENTS` describes new scope** — triage it: - - `pm_search` with the most distinctive keywords to check for duplicates. - - If no match, proceed to create. If match found, show it and ask: duplicate or related? - -3. **Decompose** (if creating new scope): - - Create Epic (if the scope spans multiple features) - - Create child Features/Tasks with `parent` links - - Use `pm_create` with `createMode: "progressive"` for each - -4. **Sync to Claude Code task panel** for any item you claim this session: - ``` - TaskCreate: - subject: "[pm-xxxx] Plan: " - description: "Planning scope for pm-xxxx" - activeForm: "Planning pm-xxxx" - ``` - Call `TaskUpdate(in_progress)`. Save taskId. - -5. **Prioritize** — review open items and update priorities with `pm_update`: - - `0` = critical, `1` = high, `2` = normal, `3` = low, `4` = minimal - -6. **Link parents** for all child items: - ```json - { "tool": "pm_update", "args": { "id": "pm-child", "options": { "parent": "pm-epic" } } } - ``` - -7. **Validate** after batch creates: - ```json - { "tool": "pm_validate", "args": { "options": { "checkResolution": true } } } - ``` - -8. **Dedupe check**: - ```json - ``` - -9. If you claimed a planning item: `pm_close` it, `pm_release`, then `TaskUpdate(completed)`. - -10. **Report** — list all created/updated items with their IDs, types, priorities, and parent links. - -## Living plan mode (`pm_plan`) - -If the user wants a Codex-style ExecPlan / Claude Plan Mode / Cursor plan-and-edit flow rather than a flat backlog, use the built-in `Plan` item type via the `pm_plan` MCP tool. The canonical lifecycle recipe lives in [Command Reference: Plan Workflow](../../../docs/COMMANDS.md#plan-workflow); this slash command should add only Claude-specific context such as `harness: "claude-code"` and concise `resumeContext` after compaction. diff --git a/plugins/pm-claude/commands/pm-release.md b/plugins/pm-claude/commands/pm-release.md deleted file mode 100644 index 97924c827..000000000 --- a/plugins/pm-claude/commands/pm-release.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -description: Run pm release-readiness — validation, coverage gate, changelog check, GitHub CI verification — with live TUI tracking. Accepts an optional version or release item ID as argument. ---- - -Run the full pm release workflow using native MCP tools. Argument: `$ARGUMENTS` (optional: version like `v1.2.3`, or pm item ID for an existing release item). - -1. **Find or create the release item**: - - `pm_search` with query "release" to find existing release items. - - If `$ARGUMENTS` is a pm ID: `pm_get` it directly. - - If no match: `pm_create` with `type: "Chore"`, `title: "Release <version>"`, `priority: "0"`. -2. **Claim** with `pm_claim`. -3. **Sync to Claude Code task panel**: - ``` - TaskCreate: - subject: "[pm-xxxx] Release: <version>" - description: "Release gate tracking — pm-xxxx" - activeForm: "Running release gates" - ``` - Call `TaskUpdate(in_progress)`. Save the taskId. -4. **Link release artifacts**: - - `pm_docs` — link `CHANGELOG.md` - - `pm_files` — link `package.json` -5. **Run gates** (all must pass before tagging): - - `pnpm build` - - `node scripts/run-tests.mjs coverage` - - `pm_validate` with `checkResolution: true, checkHistoryDrift: true, checkFiles: true` - - `pm_health` - - `node scripts/release/run-gates.mjs` (if present) -6. **Record gate results** with `pm_comments`: - ``` - "Release evidence: build ok. N tests pass. 100% coverage. pm validate ok. pm health ok." - ``` -7. **Tag and push** (if all gates pass): - ```bash - git tag v<version> && git push origin v<version> - ``` -8. **Verify CI** — `gh run list --limit 5` and confirm all checks are green. -9. **Post-CI evidence** — add a final `pm_comments` with CI run URL. -10. **Close** — `pm_close` with reason, `pm_release`, then `TaskUpdate(completed)`. - -Do not tag if any gate fails. Report the failing gate and what's needed to fix it. diff --git a/plugins/pm-claude/commands/pm-workflow.md b/plugins/pm-claude/commands/pm-workflow.md deleted file mode 100644 index 47f3d73f5..000000000 --- a/plugins/pm-claude/commands/pm-workflow.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -description: Run the pm workflow loop — orient, claim, track, and close a pm item — with full hybrid TUI display. Accepts an optional item ID or description as argument. ---- - -Run the pm workflow loop using native MCP tools. Argument: `$ARGUMENTS` (item ID, keywords, or description of new work). - -This is the general-purpose pm workflow command. For specialized loops use: -- `/pm-developer` — implementation/coding work -- `/pm-release` — release gates and publishing -- `/pm-planner` — backlog planning and decomposition -- `/pm-audit` — tracker health audit - -**Steps:** - -1. **Orient**: - ```json - { "tool": "pm_context", "args": { "options": { "limit": "10" } } } - ``` - -2. **Find or create the item** from `$ARGUMENTS`: - - pm ID → `pm_get` - - Keywords → `pm_search` then pick the best match - - Description of new work → `pm_search` first, then `pm_create` if no duplicate - -3. **Claim** with `pm_claim`, then `pm_update` to `in_progress`. - -4. **Sync to Claude Code task panel**: - ``` - TaskCreate: - subject: "[pm-xxxx] <item title>" - description: "Tracking pm-xxxx" - activeForm: "Working on pm-xxxx" - ``` - Call `TaskUpdate(in_progress)`. Save taskId for this session. - -5. **Do the work** — link evidence as you go: - - Changed files: `pm_files` - - Updated docs: `pm_docs` - - Test commands: `pm_test` - - Progress notes: `pm_comments` - -6. **Verify** — `pm_validate` before closing. - -7. **Close**: - - `pm_close` with reason addressing acceptance criteria - - `pm_release` - - `TaskUpdate(completed)` using saved taskId - -Report the item ID, title, and final status at the end. diff --git a/plugins/pm-claude/commands/pm-calendar.md b/plugins/pm-claude/skills/pm-calendar/SKILL.md similarity index 98% rename from plugins/pm-claude/commands/pm-calendar.md rename to plugins/pm-claude/skills/pm-calendar/SKILL.md index cdd2d08c7..0b780870c 100644 --- a/plugins/pm-claude/commands/pm-calendar.md +++ b/plugins/pm-claude/skills/pm-calendar/SKILL.md @@ -1,4 +1,5 @@ --- +name: pm-calendar description: Show the pm calendar — upcoming deadlines, reminders, and scheduled events. Optionally pass a view like "week", "month", or a date range. --- diff --git a/plugins/pm-claude/commands/pm-close-task.md b/plugins/pm-claude/skills/pm-close-task/SKILL.md similarity index 98% rename from plugins/pm-claude/commands/pm-close-task.md rename to plugins/pm-claude/skills/pm-close-task/SKILL.md index f1fb93b78..a87eccf19 100644 --- a/plugins/pm-claude/commands/pm-close-task.md +++ b/plugins/pm-claude/skills/pm-close-task/SKILL.md @@ -1,4 +1,5 @@ --- +name: pm-close-task description: Close a pm-tracked task with evidence — verify tests pass, link changed files, add closing comment, close and release in pm, then mark the Claude Code task panel entry as completed. Accepts an optional item ID as argument. --- diff --git a/plugins/pm-claude/commands/pm-init.md b/plugins/pm-claude/skills/pm-init/SKILL.md similarity index 84% rename from plugins/pm-claude/commands/pm-init.md rename to plugins/pm-claude/skills/pm-init/SKILL.md index c01f528cf..0de36a05c 100644 --- a/plugins/pm-claude/commands/pm-init.md +++ b/plugins/pm-claude/skills/pm-init/SKILL.md @@ -1,4 +1,5 @@ --- +name: pm-init description: Initialize pm in the current project — creates the .agents/pm/ tracker directory, sets up default settings, and shows a quick-start summary. Accepts an optional project name as argument. --- @@ -46,7 +47,7 @@ Initialize pm project tracking using native MCP tools. Argument: `$ARGUMENTS` (o - pm initialized at `.agents/pm/` - guidance mode defaults to `ask` (TTY prompt only); use `agentGuidance=add|skip|status` in `pm_run` options for deterministic behavior - Available slash commands: `/pm-status`, `/pm-new`, `/pm-start-task`, `/pm-close-task`, `/pm-list`, `/pm-search`, `/pm-triage`, `/pm-calendar`, `/pm-developer`, `/pm-planner`, `/pm-release`, `/pm-audit`, `/pm-workflow` - - All 30 MCP tools available: `pm_next`, `pm_context`, `pm_search`, `pm_list`, `pm_get`, `pm_create`, `pm_mutate`, `pm_copy`, `pm_focus`, `pm_update`, `pm_append`, `pm_claim`, `pm_release`, `pm_close`, `pm_comments`, `pm_files`, `pm_docs`, `pm_notes`, `pm_learnings`, `pm_deps`, `pm_graph`, `pm_test`, `pm_validate`, `pm_health`, `pm_contracts`, `pm_schema`, `pm_config`, `pm_profile`, `pm_plan`, `pm_run` + - Use `pm_discover` to inspect the current MCP tool catalog and `pm_contracts` for exact command flags. The catalog is currently 32 tools. - Next: use `/pm-new <title>` to create your first item, or `/pm-status` to see the tracker state If initialization fails, report the error and suggest running `pm init` manually in the terminal. diff --git a/plugins/pm-claude/commands/pm-list.md b/plugins/pm-claude/skills/pm-list/SKILL.md similarity index 92% rename from plugins/pm-claude/commands/pm-list.md rename to plugins/pm-claude/skills/pm-list/SKILL.md index 227638ae9..e1fafa62f 100644 --- a/plugins/pm-claude/commands/pm-list.md +++ b/plugins/pm-claude/skills/pm-list/SKILL.md @@ -1,4 +1,5 @@ --- +name: pm-list description: List pm items with optional status or type filter. Pass a filter like "open", "in_progress", "blocked", "bugs", or leave empty for active items. --- @@ -23,7 +24,7 @@ List pm items using native MCP tools. Filter: `$ARGUMENTS` } } ``` - For `all`, use `pm_list` with no status filter. + For `all`, use `pm_list` with `status: "all"` so closed and canceled items are included. 3. **If filter is empty** (active items) — also call `pm_context` for a richer summary: ```json diff --git a/plugins/pm-claude/commands/pm-new.md b/plugins/pm-claude/skills/pm-new/SKILL.md similarity index 99% rename from plugins/pm-claude/commands/pm-new.md rename to plugins/pm-claude/skills/pm-new/SKILL.md index f51d0d16f..354f76cc1 100644 --- a/plugins/pm-claude/commands/pm-new.md +++ b/plugins/pm-claude/skills/pm-new/SKILL.md @@ -1,4 +1,5 @@ --- +name: pm-new description: Quickly create a new pm item — duplicate-checks first, then creates with sensible defaults. Pass a title (or title + description) as argument. --- diff --git a/plugins/pm-claude/commands/pm-search.md b/plugins/pm-claude/skills/pm-search/SKILL.md similarity index 98% rename from plugins/pm-claude/commands/pm-search.md rename to plugins/pm-claude/skills/pm-search/SKILL.md index 59c0aa12a..bef678e2e 100644 --- a/plugins/pm-claude/commands/pm-search.md +++ b/plugins/pm-claude/skills/pm-search/SKILL.md @@ -1,4 +1,5 @@ --- +name: pm-search description: Search pm items by keywords, tags, status, or type — returns ranked results with context. Pass the search query as argument. --- diff --git a/plugins/pm-claude/commands/pm-start-task.md b/plugins/pm-claude/skills/pm-start-task/SKILL.md similarity index 98% rename from plugins/pm-claude/commands/pm-start-task.md rename to plugins/pm-claude/skills/pm-start-task/SKILL.md index 5daf31c37..c8059f0ba 100644 --- a/plugins/pm-claude/commands/pm-start-task.md +++ b/plugins/pm-claude/skills/pm-start-task/SKILL.md @@ -1,4 +1,5 @@ --- +name: pm-start-task description: Start a pm-tracked task — orient, find or create the right item, claim it, sync to TUI, and link initial scope. Accepts an optional item ID or keywords as argument. --- diff --git a/plugins/pm-claude/commands/pm-status.md b/plugins/pm-claude/skills/pm-status/SKILL.md similarity index 97% rename from plugins/pm-claude/commands/pm-status.md rename to plugins/pm-claude/skills/pm-status/SKILL.md index c70f91732..c261f9b7c 100644 --- a/plugins/pm-claude/commands/pm-status.md +++ b/plugins/pm-claude/skills/pm-status/SKILL.md @@ -1,4 +1,5 @@ --- +name: pm-status description: Show a compact pm project status snapshot — active items, blocked work, and upcoming deadlines. --- diff --git a/plugins/pm-claude/commands/pm-triage.md b/plugins/pm-claude/skills/pm-triage/SKILL.md similarity index 98% rename from plugins/pm-claude/commands/pm-triage.md rename to plugins/pm-claude/skills/pm-triage/SKILL.md index 359d828bd..5ae4e8c9f 100644 --- a/plugins/pm-claude/commands/pm-triage.md +++ b/plugins/pm-claude/skills/pm-triage/SKILL.md @@ -1,4 +1,5 @@ --- +name: pm-triage description: Triage a new request through pm — check for duplicates, create canonical parent lineage if needed, and produce a scoped child item with acceptance criteria. Pass the request description as argument. --- diff --git a/scripts/gen-agent-plugin-skills.mjs b/scripts/gen-agent-plugin-skills.mjs index 1d33edffe..8f3862ee9 100644 --- a/scripts/gen-agent-plugin-skills.mjs +++ b/scripts/gen-agent-plugin-skills.mjs @@ -9,12 +9,18 @@ const sourceRoot = path.join(repoRoot, "templates", "agent-skills"); const codexAliasRoot = path.join(sourceRoot, "codex-aliases"); const pluginNames = ["pm-claude", "pm-codex"]; const skillFiles = ["SKILL.md", "agents/openai.yaml"]; +// Claude-only invocation workflows are authored in the plugin beside generated portable skills. +const claudeOnlySkills = [ + "pm-calendar", "pm-close-task", "pm-init", "pm-list", "pm-new", + "pm-search", "pm-start-task", "pm-status", "pm-triage", +]; /** Check or update one standalone plugin without crossing its package boundary. */ -async function syncPluginSkills(pluginName, commonNames, aliasNames, check) { +async function syncPluginSkills(pluginName, commonNames, aliasNames, additionalNames, check) { const drift = []; const pluginRoot = path.join(repoRoot, "plugins", pluginName, "skills"); const skillNames = pluginName === "pm-codex" ? [...commonNames, ...aliasNames] : commonNames; + const allowedNames = [...skillNames, ...additionalNames]; const published = await readdir(pluginRoot).catch(async (error) => { if (error?.code !== "ENOENT") throw error; if (check) return null; @@ -22,7 +28,7 @@ async function syncPluginSkills(pluginName, commonNames, aliasNames, check) { return []; }); if (published === null) return [path.relative(repoRoot, pluginRoot)]; - const unexpected = published.filter((name) => !skillNames.includes(name)); + const unexpected = published.filter((name) => !allowedNames.includes(name)); if (unexpected.length > 0) { throw new Error( `${pluginName} has unowned skill directories: ${unexpected.join(", ")}`, @@ -55,7 +61,8 @@ export async function main() { if (commonNames.length === 0) throw new Error("Canonical Agent Skills tree is empty"); const drift = []; for (const pluginName of pluginNames) { - drift.push(...await syncPluginSkills(pluginName, commonNames, aliasNames, check)); + const additionalNames = pluginName === "pm-claude" ? claudeOnlySkills : []; + drift.push(...await syncPluginSkills(pluginName, commonNames, aliasNames, additionalNames, check)); } if (drift.length > 0) { throw new Error( diff --git a/scripts/smoke-claude-plugin.mjs b/scripts/smoke-claude-plugin.mjs index 5624ebdcc..4d36c662b 100644 --- a/scripts/smoke-claude-plugin.mjs +++ b/scripts/smoke-claude-plugin.mjs @@ -3,7 +3,7 @@ * Smoke test for the pm-cli Claude Code plugin. * * Tests: - * 1. Plugin file structure (marketplace + plugin manifests, skills, commands, agents, hooks) + * 1. Plugin file structure (marketplace + plugin manifests, skills, agents, hooks) * 2. MCP server launcher resolves the repo build * 3. MCP server discovers the current stateless protocol with instructions * 4. All 32 required tools are listed @@ -27,18 +27,6 @@ const repoRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url))); const launcherPath = path.join(repoRoot, "plugins", "pm-claude", "scripts", "pm-mcp-server.mjs"); const sessionStartPath = path.join(repoRoot, "plugins", "pm-claude", "hooks", "session-start.mjs"); -/** - * @internal Exported only for unit coverage of the (runtime-unreachable) mismatch - * branch. Throws when the marketplace plugin name disagrees with plugin.json. - */ -export function assertMarketplacePluginNameMatches(marketplacePluginName, pluginJsonName) { - if (marketplacePluginName !== pluginJsonName) { - throw new Error( - `marketplace plugin name "${marketplacePluginName}" does not match plugin.json name "${pluginJsonName}"`, - ); - } -} - // Verify plugin files exist const pluginFiles = [ // Root-level marketplace (required for /plugin marketplace add unbraind/pm-cli) @@ -47,27 +35,21 @@ const pluginFiles = [ "plugins/pm-claude/.claude-plugin/plugin.json", "plugins/pm-claude/.mcp.json", "plugins/pm-claude/package.json", - // Skills (5 total) + // Skills (14 total, including the former flat command invocations) "plugins/pm-claude/skills/pm-workflow/SKILL.md", "plugins/pm-claude/skills/pm-developer/SKILL.md", "plugins/pm-claude/skills/pm-release/SKILL.md", "plugins/pm-claude/skills/pm-audit/SKILL.md", "plugins/pm-claude/skills/pm-planner/SKILL.md", - // Commands (14 total) - "plugins/pm-claude/commands/pm-status.md", - "plugins/pm-claude/commands/pm-start-task.md", - "plugins/pm-claude/commands/pm-close-task.md", - "plugins/pm-claude/commands/pm-triage.md", - "plugins/pm-claude/commands/pm-audit.md", - "plugins/pm-claude/commands/pm-search.md", - "plugins/pm-claude/commands/pm-new.md", - "plugins/pm-claude/commands/pm-list.md", - "plugins/pm-claude/commands/pm-calendar.md", - "plugins/pm-claude/commands/pm-developer.md", - "plugins/pm-claude/commands/pm-init.md", - "plugins/pm-claude/commands/pm-planner.md", - "plugins/pm-claude/commands/pm-release.md", - "plugins/pm-claude/commands/pm-workflow.md", + "plugins/pm-claude/skills/pm-status/SKILL.md", + "plugins/pm-claude/skills/pm-start-task/SKILL.md", + "plugins/pm-claude/skills/pm-close-task/SKILL.md", + "plugins/pm-claude/skills/pm-triage/SKILL.md", + "plugins/pm-claude/skills/pm-search/SKILL.md", + "plugins/pm-claude/skills/pm-new/SKILL.md", + "plugins/pm-claude/skills/pm-list/SKILL.md", + "plugins/pm-claude/skills/pm-calendar/SKILL.md", + "plugins/pm-claude/skills/pm-init/SKILL.md", // Hooks "plugins/pm-claude/hooks/hooks.json", "plugins/pm-claude/hooks/session-start.mjs", @@ -104,10 +86,6 @@ const pluginJson = JSON.parse(readFileSync(path.join(repoRoot, "plugins", "pm-cl if (pluginJson.name !== "pm-claude") { throw new Error(`plugin.json name must be "pm-claude", got "${pluginJson.name}"`); } -// Both names are pinned to "pm-claude" by the guards above, so at runtime this -// consistency check can never fail. It is extracted into a `_testOnly` seam so -// the mismatch branch remains exercisable in isolation for coverage. -assertMarketplacePluginNameMatches(marketplacePluginName, pluginJson.name); console.log(`Manifest names: marketplace="${rootMarketplace.name}" plugin="${pluginJson.name}" (consistent)`); const { tmpRoot, request, callTool, dispose } = await startPluginMcpSmoke({ diff --git a/sdk/public-surface.json b/sdk/public-surface.json index ef122aea3..5957ea6f2 100644 --- a/sdk/public-surface.json +++ b/sdk/public-surface.json @@ -35239,6 +35239,7 @@ "extension_dependency_name_unsafe", "extension_dependency_spec_invalid", "extension_dependency_version_unsafe", + "extension_install_incomplete_source_scan", "extension_install_soft_failed", "extension_install_source_contains_destination", "extension_item_field_reserved", diff --git a/src/sdk/extension/install-plan.ts b/src/sdk/extension/install-plan.ts index acafc0efa..6958e4e19 100644 --- a/src/sdk/extension/install-plan.ts +++ b/src/sdk/extension/install-plan.ts @@ -96,6 +96,22 @@ export async function buildExtensionInstallPlan( archive_argument: "pack_result[0].filename", }; } + if (sourceMode === "directory" && !copy.complete) { + const limit = copy.stop_reason === "entry_limit" + ? `${copy.max_entries} entries` + : `${copy.max_depth} directory levels`; + throw new PmCliError( + `Local extension source scan stopped at ${limit}; the directory snapshot is incomplete and installation was refused. ${plan.packed_alternative ? "Pack the package with npm pack --ignore-scripts --json, then install its archive." : "Install a smaller source directory or a packed archive."}`, + EXIT_CODE.USAGE, + { + code: "extension_install_incomplete_source_scan", + reason: copy.stop_reason, + nextSteps: plan.packed_alternative + ? [`Run npm pack --ignore-scripts --json from the package root, then pm package install <archive-filename> --${scope}.`] + : ["Choose a smaller source directory or install a packed archive."], + }, + ); + } return plan; } diff --git a/src/sdk/generated/generated-error-code-catalog-part-1.ts b/src/sdk/generated/generated-error-code-catalog-part-1.ts index 67f68e9cb..e64cd0a9e 100644 --- a/src/sdk/generated/generated-error-code-catalog-part-1.ts +++ b/src/sdk/generated/generated-error-code-catalog-part-1.ts @@ -939,6 +939,19 @@ export const PM_ERROR_CODE_CATALOG_PART_1: PmErrorCodeContract[] = [ canonical_code: "extension_dependency_version_unsafe", aliases: [], }, + { + code: "extension_install_incomplete_source_scan", + meaning: "Extension install incomplete source scan condition.", + stability: "provisional", + exit_code: 2, + class: "usage", + recovery: + "Inspect the structured error guidance and retry the suggested command.", + sources: ["sdk/extension/install-plan.ts"], + emitting_commands: ["*"], + canonical_code: "extension_install_incomplete_source_scan", + aliases: [], + }, { code: "extension_install_soft_failed", meaning: "Extension install soft failed condition.", @@ -2539,17 +2552,4 @@ export const PM_ERROR_CODE_CATALOG_PART_1: PmErrorCodeContract[] = [ canonical_code: "merge_receipt_history_reference_missing", aliases: [], }, - { - code: "merge_receipts_pending", - meaning: "Merge receipts pending condition.", - stability: "provisional", - exit_code: 1, - class: "generic_failure", - recovery: - "Inspect the structured error guidance and retry the suggested command.", - sources: ["core/diagnostics/remediation.ts"], - emitting_commands: ["*"], - canonical_code: "merge_receipts_pending", - aliases: [], - }, ]; diff --git a/src/sdk/generated/generated-error-code-catalog-part-2.ts b/src/sdk/generated/generated-error-code-catalog-part-2.ts index a8ad54594..bd7605611 100644 --- a/src/sdk/generated/generated-error-code-catalog-part-2.ts +++ b/src/sdk/generated/generated-error-code-catalog-part-2.ts @@ -7,6 +7,19 @@ import type { PmErrorCodeContract } from "../error-code-catalog.js"; /** Generated partition 2 of the exhaustive error-code catalog. */ export const PM_ERROR_CODE_CATALOG_PART_2: PmErrorCodeContract[] = [ + { + code: "merge_receipts_pending", + meaning: "Merge receipts pending condition.", + stability: "provisional", + exit_code: 1, + class: "generic_failure", + recovery: + "Inspect the structured error guidance and retry the suggested command.", + sources: ["core/diagnostics/remediation.ts"], + emitting_commands: ["*"], + canonical_code: "merge_receipts_pending", + aliases: [], + }, { code: "merge_reconcile_receipt_evidence_untrusted", meaning: "Merge reconcile receipt evidence untrusted condition.", diff --git a/tests/fixtures/contracts/full.json b/tests/fixtures/contracts/full.json index 74e1d2bf0..a89c6cdd0 100644 --- a/tests/fixtures/contracts/full.json +++ b/tests/fixtures/contracts/full.json @@ -21135,6 +21135,23 @@ ], "stability": "stable" }, + { + "aliases": [], + "canonical_code": "extension_install_incomplete_source_scan", + "class": "usage", + "code": "extension_install_incomplete_source_scan", + "emitting_commands": [ + "*" + ], + "exit_code": 2, + "meaning": "Extension install incomplete source scan condition.", + "owned_states": [], + "recovery": "Inspect the structured error guidance and retry the suggested command.", + "sources": [ + "sdk/extension/install-plan.ts" + ], + "stability": "provisional" + }, { "aliases": [], "canonical_code": "extension_install_soft_failed", diff --git a/tests/integration/claude-plugin-contract.spec.ts b/tests/integration/claude-plugin-contract.spec.ts index b2d0ab0af..88892700d 100644 --- a/tests/integration/claude-plugin-contract.spec.ts +++ b/tests/integration/claude-plugin-contract.spec.ts @@ -1,4 +1,4 @@ -import { access, readFile } from "node:fs/promises"; +import { access, readFile, readdir } from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { describe, expect, it } from "vitest"; @@ -55,7 +55,7 @@ describe("Claude Code plugin contract", () => { } }); - it("has all required slash commands", async () => { + it("offers every slash invocation through one skill definition", async () => { const requiredCommands = [ "pm-status", "pm-start-task", @@ -73,13 +73,17 @@ describe("Claude Code plugin contract", () => { "pm-init", ]; for (const cmd of requiredCommands) { - const cmdPath = path.join(pluginRoot, "commands", `${cmd}.md`); + const cmdPath = path.join(pluginRoot, "skills", cmd, "SKILL.md"); const exists = await fileExists(cmdPath); expect(exists, `Missing command: ${cmd}`).toBe(true); const content = await readFile(cmdPath, "utf8"); expect(content, `Command ${cmd} missing description`).toContain("description:"); + expect(content, `Command ${cmd} changed its invocation name`).toContain(`name: ${cmd}`); } + expect(await fileExists(path.join(pluginRoot, "commands"))).toBe(false); + const skillEntries = await readdir(path.join(pluginRoot, "skills")); + expect(skillEntries.sort()).toEqual(requiredCommands.sort()); }); it("has all required agents including new subagents", async () => { @@ -103,6 +107,8 @@ describe("Claude Code plugin contract", () => { it("has valid plugin.json with correct version and metadata", async () => { const pluginJson = (await readJson(path.join(pluginRoot, ".claude-plugin", "plugin.json"))) as Record<string, unknown>; expect(pluginJson.name).toBe("pm-claude"); + expect(pluginJson.displayName).toBe("pm CLI"); + expect(pluginJson.$schema).toBe("https://json.schemastore.org/claude-code-plugin-manifest.json"); expect(typeof pluginJson.version).toBe("string"); // Date-based version policy (YYYY.M.D[-N]), kept in lockstep with the root // package by scripts/sync-versions.mjs — pm-cli artifacts do not use semver. @@ -129,12 +135,10 @@ describe("Claude Code plugin contract", () => { expect(pmClaudePlugin, "marketplace.json must contain pm-claude plugin").toBeTruthy(); expect(pmClaudePlugin?.source).toBe("./plugins/pm-claude"); - // Reconciled manifest fields (see pm-rjgh): root marketplace.json carries the - // same metadata/category surface as .claude-plugin/marketplace.json. - const metadata = marketplaceJson.metadata as Record<string, unknown>; - expect(metadata, "marketplace.json must carry a metadata block").toBeTruthy(); - expect(typeof metadata.description).toBe("string"); - expect(metadata.version).toBe(pmClaudePlugin?.version); + // Both marketplace paths carry the same current top-level catalog fields. + expect(typeof marketplaceJson.description).toBe("string"); + expect(marketplaceJson.version).toBe(pmClaudePlugin?.version); + expect(marketplaceJson).not.toHaveProperty("metadata"); expect(pmClaudePlugin?.category).toBe("productivity"); }); @@ -190,6 +194,7 @@ describe("Claude Code plugin contract", () => { expect(servers["pm-mcp"]).toBeDefined(); const server = servers["pm-mcp"] as Record<string, unknown>; + expect(server).not.toHaveProperty("note"); expect(server.command).toBe("node"); expect(Array.isArray(server.args)).toBe(true); const args = server.args as string[]; diff --git a/tests/unit/extensions/extension-install-dry-run.spec.ts b/tests/unit/extensions/extension-install-dry-run.spec.ts index 8647612e0..b05ad40a4 100644 --- a/tests/unit/extensions/extension-install-dry-run.spec.ts +++ b/tests/unit/extensions/extension-install-dry-run.spec.ts @@ -10,6 +10,50 @@ import { writeTestExtension } from "../../helpers/extensions.js"; import { withTempPmPath } from "../../helpers/withTempPmPath.js"; describe("package install dry run", () => { + it("refuses incomplete directory scans before dry runs or real installs can publish a package", async () => { + await withTempPmPath(async (context) => { + const source = path.join(context.tempRoot, "limited-source"); + await writeTestExtension({ root: source, name: "limited-package" }); + await fs.writeFile(path.join(source, "package.json"), JSON.stringify({ name: "limited-package", version: "1.0.0" })); + const destination = path.join(context.pmPath, "extensions", "limited-package"); + const client = new PmClient({ pmRoot: context.pmPath }); + + for (const dryRun of [true, false]) { + await expect(client.packageInstall(source, { + project: true, + dryRun, + copyPlan: { maxEntries: 1 }, + })).rejects.toMatchObject({ + code: "extension_install_incomplete_source_scan", + context: { reason: "entry_limit" }, + message: expect.stringContaining("npm pack --ignore-scripts --json"), + }); + await expect(fs.stat(destination)).rejects.toMatchObject({ code: "ENOENT" }); + } + await expect(client.packageInstall(source, { + global: true, + dryRun: true, + copyPlan: { maxEntries: 1 }, + })).rejects.toMatchObject({ + code: "extension_install_incomplete_source_scan", + context: { nextSteps: [expect.stringContaining("--global")] }, + }); + await expect(fs.stat(path.join(context.env.PM_GLOBAL_PATH, "extensions", "limited-package"))).rejects.toMatchObject({ code: "ENOENT" }); + await fs.rm(path.join(source, "package.json")); + await fs.mkdir(path.join(source, "nested")); + await expect(client.packageInstall(source, { + project: true, + dryRun: true, + copyPlan: { maxDepth: 1 }, + })).rejects.toMatchObject({ + code: "extension_install_incomplete_source_scan", + context: { reason: "depth_limit" }, + message: expect.stringContaining("smaller source directory"), + }); + await expect(fs.stat(destination)).rejects.toMatchObject({ code: "ENOENT" }); + }); + }); + it("plans through SDK and every CLI install spelling before any destination mutation", async () => { await withTempPmPath(async (context) => { const source = path.join(context.tempRoot, "source"); diff --git a/tests/unit/scripts/gen-agent-plugin-skills.spec.ts b/tests/unit/scripts/gen-agent-plugin-skills.spec.ts index d8eb07da8..07bb063d4 100644 --- a/tests/unit/scripts/gen-agent-plugin-skills.spec.ts +++ b/tests/unit/scripts/gen-agent-plugin-skills.spec.ts @@ -9,6 +9,10 @@ const root = process.cwd(); const sourceRoot = path.join(root, "templates", "agent-skills"); const skills = ["pm-audit", "pm-developer", "pm-planner", "pm-release", "pm-workflow"]; const aliases = ["pm-auditor", "pm-native"]; +const claudeOnly = [ + "pm-calendar", "pm-close-task", "pm-init", "pm-list", "pm-new", + "pm-search", "pm-start-task", "pm-status", "pm-triage", +]; const files = ["SKILL.md", "agents/openai.yaml"]; /** Model only the filesystem boundary, leaving the real projection algorithm under test. */ @@ -49,6 +53,7 @@ function mockSkillTree({ emptySource = false, unexpected = false, missingRoot = if (!pluginRootExists) throw Object.assign(new Error("missing skills root"), { code: "ENOENT" }); return unexpected ? [...skills, ...aliases, "unowned"] : [...skills, ...aliases]; } + if (target === path.join(root, "plugins", "pm-claude", "skills")) return [...skills, ...claudeOnly]; return skills; }), })); diff --git a/tests/unit/scripts/smoke-claude-plugin.spec.ts b/tests/unit/scripts/smoke-claude-plugin.spec.ts index 86f0e4654..67718cafb 100644 --- a/tests/unit/scripts/smoke-claude-plugin.spec.ts +++ b/tests/unit/scripts/smoke-claude-plugin.spec.ts @@ -1,12 +1,10 @@ import path from "node:path"; import { describe, expect, it, vi } from "vitest"; -import type * as claudePluginSmokeModule from "../../../scripts/smoke-claude-plugin.mjs"; import { createScriptHarness } from "../../helpers/scriptModule"; const harness = createScriptHarness(["../../../scripts/plugin-mcp-smoke-harness.mjs"]); const SCRIPT = "scripts/smoke-claude-plugin.mjs"; -type ClaudeModule = typeof claudePluginSmokeModule; const REQUIRED_TOOLS = [ "pm_run", @@ -261,17 +259,4 @@ describe("smoke-claude-plugin", () => { expect(dispose).toHaveBeenCalledTimes(1); }); - it("assertMarketplacePluginNameMatches throws on the runtime-unreachable mismatch branch", async () => { - // Drive the happy-path module body to completion so the exported `_testOnly` - // seam is reachable, then exercise its (otherwise dead) mismatch branch and - // its passing branch directly. The seam exists because the two pinned - // "pm-claude" guards make the inline check unreachable at runtime. - setupSmoke(); - vi.spyOn(console, "log").mockImplementation(() => {}); - const mod = await harness.importModule<ClaudeModule>(SCRIPT); - expect(() => mod.assertMarketplacePluginNameMatches("pm-claude", "other")).toThrow( - /does not match plugin.json name/, - ); - expect(() => mod.assertMarketplacePluginNameMatches("pm-claude", "pm-claude")).not.toThrow(); - }); });