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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .agents/pm/extensions/.managed-extensions.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"version": 1,
"updated_at": "2026-09-28T23:41:46.999Z",
"updated_at": "2026-09-29T06:51:40.338Z",
"entries": [
{
"name": "pm-changelog",
Expand Down
21 changes: 21 additions & 0 deletions .agents/pm/history/pm-2589e6.jsonl

Large diffs are not rendered by default.

17 changes: 17 additions & 0 deletions .agents/pm/history/pm-vks66s.jsonl

Large diffs are not rendered by default.

22 changes: 22 additions & 0 deletions .agents/pm/history/pm-wtqltn.jsonl

Large diffs are not rendered by default.

92 changes: 87 additions & 5 deletions .agents/pm/issues/pm-2589e6.toon
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,107 @@ id: pm-2589e6
title: Full-item stdin JSON update silently ignores edited notes
description: Published 2026.9.28 returns changed_field_count=0 for a changed notes array while preserving the old note; successful no-op conceals stale evidence.
type: Issue
status: open
status: closed
priority: 2
tags: []
created_at: "2026-09-29T00:19:58.543Z"
updated_at: "2026-09-29T00:31:43.731Z"
updated_at: "2026-09-29T08:09:24.273Z"
closed_at: "2026-09-29T06:50:53.619Z"
completed_at: "2026-09-29T06:50:53.619Z"
author: "harness:codex"
estimated_minutes: 180
acceptance_criteria: Changed notes are atomically audited or rejected with a field-specific error; Disposable get-modify-update regression proves no false successful no-op
parent: pm-mpbb
risk: medium
confidence: 85
severity: medium
expected_result: Changed notes are applied with history or explicitly rejected.
actual_result: Update succeeds with changed_field_count=0 and retains the original note.
resolution: "Full-item JSON updates now compare persisted comments, notes, and learnings under the item lock and return a stable actionable refusal for edits or removals; new entries still append."
expected_result: Edited existing notes cannot silently succeed or change item state.
actual_result: "Disposable structured-mutation regression rejects edited note with unchanged verified history; linked test, full suite, exact coverage, and static quality pass."
affected_version: 2026.9.28
component: CLI structured mutations
dependencies[2]{id,kind,created_at,author,source_kind,author_source}:
pm-a2h3,related,"2026-09-29T00:19:58.543Z","harness:codex","cli:create:dep",detected
pm-kipd,discovered_from,"2026-09-29T00:19:58.543Z","harness:codex","cli:create:dep",detected
comments[1]{created_at,author,text}:
comments[6]{created_at,author,text}:
"2026-09-29T00:19:58.543Z","harness:codex","Duplicate check: searched all-status PM items for stdin-json and notes; closed pm-kipd delivered the original round-trip feature and pm-a2h3 delivered direct note editing, but neither tracks this new silent no-op defect. GitHub issue #1343 has no prior PM link."
"2026-09-29T04:56:30.520Z","harness:codex","Test-audit contract: a changed persisted note in get->modify->update --stdin-json must never return a successful no-op. Existing structured round-trip test only appends a new note and does not detect edits to a persisted annotation. Primary proof will use a disposable tracker and history verification; no test-only production seam."
"2026-09-29T06:50:36.685Z","harness:codex","Acceptance evidence: full-item get to update --stdin-json now preserves persisted comments, notes, and learnings as immutable snapshots and rejects edited or removed entries under the item lock with stdin_json_persisted_annotation_changed. The structured-mutation integration test proves the formerly silent edited-note no-op fails without changing item or history, while legitimate new annotations still append. Linked test passed; full suite 9414 passed; exact V8 coverage 100/100/100/100; pnpm quality:static passed. Manual correction remains pm notes/comments/learnings --edit with audit history."
"2026-09-29T07:17:18.050Z","harness:codex","PR #1348 review follow-up: malformed full-item annotation arrays now return a PM usage error instead of an unhandled TypeError. Focused parser tests cover all three annotation fields with user-visible diagnostics; these exercise an independent invalid-input boundary rather than mirroring the implementation."
"2026-09-29T07:42:04.396Z","harness:codex","Correction to prior review note: the existing appendFacetOptions -> serializeObjectArray path already refuses null comments/notes/learnings with a field-specific PmCliError before the persisted-snapshot filter. The suggested extra guard was unreachable and failed the exact 100% coverage gate, so it was removed. New regression assertions verify the existing usage code and field guidance on all three inputs; no production behavior change was needed for this bot finding."
"2026-09-29T08:09:24.273Z","harness:codex","Final PR #1348 review verification: all 9414 tests passed, exact V8 coverage is 100/100/100/100, pnpm quality:static and pnpm security:scan passed, and both linked structured-mutation integration and parser unit tests passed through pm test in an isolated schema tracker. Null annotation arrays produce the existing typed usage refusal; the extra guard suggested in review was removed as unreachable."
learnings[1]{created_at,author,text}:
"2026-09-29T06:50:37.375Z","harness:codex","A full-item JSON round trip must distinguish new annotation entries from persisted audit entries and verify the persisted snapshot inside the locked mutation, including annotation-only updates."
files[6]:
- path: src/sdk/generated/generated-error-code-catalog-part-2.ts
scope: project
note: stable annotation refusal catalog
- path: src/sdk/lifecycle/update.ts
scope: project
note: locked annotation integrity
- path: src/sdk/structured-mutations.ts
scope: project
note: full-item annotation snapshot
- path: tests/fixtures/contracts/full.json
scope: project
note: generated command contract snapshot
- path: tests/integration/structured-mutation-io.integration.spec.ts
scope: project
note: regression acceptance
- path: tests/unit/sdk/structured-mutations.spec.ts
scope: project
tests[2]:
- command: node scripts/run-tests.mjs test -- tests/integration/structured-mutation-io.integration.spec.ts
scope: project
timeout_seconds: 600
provenance:
author: "harness:codex"
created_at: "2026-09-29T05:13:55.996Z"
source_kind: local_mutation
source_ref: fix/audited-workspace-mutations-bun-merge
- command: node scripts/run-tests.mjs test -- tests/unit/sdk/structured-mutations.spec.ts
scope: project
provenance:
author: "harness:codex"
created_at: "2026-09-29T07:17:48.246Z"
source_kind: local_mutation
source_ref: fix/audited-workspace-mutations-bun-merge
test_runs[2]:
- run_id: test-local-mumbe394-q4gosn
kind: test
status: passed
started_at: "2026-09-29T06:47:32.094Z"
finished_at: "2026-09-29T06:47:49.240Z"
recorded_at: "2026-09-29T06:47:49.240Z"
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/integration/structured-mutation-io.integration.spec.ts,schema,schema,source,local_source_ref
- run_id: test-local-mume762d-n9s2b9
kind: test
status: passed
started_at: "2026-09-29T08:05:55.987Z"
finished_at: "2026-09-29T08:06:25.141Z"
recorded_at: "2026-09-29T08:06:25.141Z"
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/structured-mutation-io.integration.spec.ts,schema,schema,source,local_source_ref
node scripts/run-tests.mjs test -- tests/unit/sdk/structured-mutations.spec.ts,schema,schema,source,local_source_ref
docs[4]{path,scope,note}:
CHANGELOG.md,project,generated release entry
docs/generated/REFUSAL_CLOSURE_CENSUS.md,project,generated refusal recovery contract
docs/README.md,project,documentation index
docs/SDK_AUDITED_MUTATIONS.md,project,full-item JSON correction contract
close_reason: Reject persisted annotation edits in full-item JSON updates
escape_class: production_defect
gate_evidence:
disposition: gate_strengthened
gate_id: Gates (static)
negative_control: node scripts/run-tests.mjs test -- tests/unit/sdk/structured-mutations.spec.ts
local_checks[2]: node scripts/run-tests.mjs test -- tests/unit/sdk/structured-mutations.spec.ts,node scripts/run-tests.mjs coverage
hosted_checks[2]: Gates (static),Gates (typecheck)
owner: pm-2589e6
body: "GitHub: https://github.com/unbraind/pm-cli/issues/1343\n\nReproduce with a disposable tracker: create an item with a note, get the full JSON item, edit notes[0].text, and pipe it to update --stdin-json. Require either an atomic audited note correction or a nonzero field-specific rejection with pm notes --edit guidance."
49 changes: 44 additions & 5 deletions .agents/pm/issues/pm-vks66s.toon
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,63 @@ id: pm-vks66s
title: Bun merge-driver installation disagrees with strict health
description: "Published 2026.9.28 bunx --bun init and merge install configure merge drivers that strict health immediately reports drifted, even after reinstall."
type: Issue
status: open
status: closed
priority: 2
tags: []
created_at: "2026-09-29T00:20:04.660Z"
updated_at: "2026-09-29T00:31:44.903Z"
updated_at: "2026-09-29T08:09:24.178Z"
closed_at: "2026-09-29T06:50:57.064Z"
completed_at: "2026-09-29T06:50:57.064Z"
author: "harness:codex"
estimated_minutes: 240
acceptance_criteria: Bun init and merge install pass strict health on a fresh Git workspace; Repeated install is idempotent and a real two-branch merge executes the driver
parent: pm-u9d0
risk: high
confidence: 85
severity: high
expected_result: "Bun init registers stable, executable merge drivers accepted by strict health."
actual_result: All five driver keys are reported drifted after init and merge install.
resolution: Merge installation now selects a version-matched stable absolute Bun launcher and driver audit accepts valid Node or Bun identities.
expected_result: bunx-installed pm passes strict merge-driver health and performs semantic Git merges.
actual_result: "Disposable packed Bun consumer passed strict health twice and real item/history Git merge with verified chain; npx and bunx executable checks, linked test, full suite, exact coverage, and static quality pass."
affected_version: 2026.9.28
component: Bun merge driver
dependencies[1]{id,kind,created_at,author,source_kind,author_source}:
pm-rnl3sa,related,"2026-09-29T00:20:04.660Z","harness:codex","cli:create:dep",detected
comments[1]{created_at,author,text}:
comments[6]{created_at,author,text}:
"2026-09-29T00:20:04.660Z","harness:codex","Duplicate check: all-status PM search for Bun merge-driver drift found the closed package-runner dispatch issue pm-rnl3sa and other merge work, but no owner for this Bun-specific install/health mismatch."
"2026-09-29T04:56:31.027Z","harness:codex","Test-audit contract: Bun-installed merge drivers must pass strict health, remain idempotent, and execute a real merge. Existing merge safety tests cover Node driver syntax and worktree identity, not Bun's executable name or bunx runtime path. Primary proof will use a disposable Git/Bun workspace."
"2026-09-29T06:50:40.724Z","harness:codex","Acceptance evidence: actual Bun 1.4.2 in a disposable npm-packed consumer installed an absolute /usr/bin/bun merge driver; bunx --bun init and repeated merge install both passed strict health with zero findings. A real Git branch merge invoked item and history drivers, retained the left note and right description, and pm history --verify returned three valid entries. npx --no-install pm and bunx --no-install pm both returned the packed CLI version. Linked regression test passed; full suite 9414 passed; exact V8 coverage 100/100/100/100; pnpm quality:static passed. Repository source npm audit found zero advisories and GitHub open Dependabot, code, and secret scanning alerts were empty."
"2026-09-29T06:58:37.384Z","harness:codex","Post-rebase packed acceptance on v2026.9.29: fresh tarball installed with Bun in a disposable Git project, bunx --bun pm init succeeded, bunx --bun pm health --strict-exit reported ok with zero findings, and both npx --no-install pm --version and bunx --no-install pm --version returned 2026.9.29. The earlier disposable project also completed a real semantic item/history Git merge with a verified chain."
"2026-09-29T07:17:18.123Z","harness:codex","PR #1348 static gate follow-up: added structured production-defect escape and executable Bun merge-launcher regression evidence; corrected the linked gate path to the committed spec. Repository defect-evidence gate passes with zero findings across 262 governed terminal defects."
"2026-09-29T08:09:24.177Z","harness:codex","Final PR #1348 review verification: full suite 9414 passed, exact V8 coverage 100/100/100/100, static and security gates passed. Fresh npm-packed CLI installed under /tmp/pm-1348-packed-aE4P4Y; npx and bunx both reported 2026.9.29, and Bun strict health returned zero findings. Earlier temporary Git merge acceptance proved the Bun item/history drivers preserve both sides and verify history."
learnings[1]{created_at,author,text}:
"2026-09-29T06:50:41.415Z","harness:codex",Bun can report a versioned executable path while Git later needs a durable absolute launcher; resolve and validate bun from absolute PATH entries at install time and audit both Node and Bun driver identities.
files[2]{path,scope,note}:
src/sdk/merge/install.ts,project,Bun launcher selection and audit
tests/unit/sdk/merge/worktree-config.spec.ts,project,launcher regression
tests[1]{command,scope,timeout_seconds,provenance{author,created_at,source_kind,source_ref}}:
node scripts/run-tests.mjs test -- tests/unit/sdk/merge/worktree-config.spec.ts,project,600,"harness:codex","2026-09-29T05:14:02.131Z",local_mutation,fix/audited-workspace-mutations-bun-merge
test_runs[1]:
- run_id: test-local-mumbfe6g-zm3zsz
kind: test
status: passed
started_at: "2026-09-29T06:48:31.465Z"
finished_at: "2026-09-29T06:48:50.056Z"
recorded_at: "2026-09-29T06:48:50.056Z"
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/sdk/merge/worktree-config.spec.ts,schema,schema,source,local_source_ref
docs[2]{path,scope,note}:
CHANGELOG.md,project,generated release entry
docs/MERGE_SAFETY.md,project,Bun merge-driver contract
close_reason: Repair Bun merge-driver launcher identity
escape_class: production_defect
gate_evidence:
disposition: gate_strengthened
gate_id: Gates (static)
negative_control: node scripts/run-tests.mjs test -- tests/unit/sdk/merge/runtime-launcher.spec.ts
local_checks[2]: node scripts/run-tests.mjs test -- tests/unit/sdk/merge/runtime-launcher.spec.ts,node scripts/run-tests.mjs coverage
hosted_checks[2]: Gates (static),Gates (typecheck)
owner: pm-vks66s
body: "GitHub: https://github.com/unbraind/pm-cli/issues/1346\n\nReproduce in a disposable Bun Git project; compare installed Git driver commands against strict health expectation, prove idempotent reinstall, and execute a real two-branch item merge using the registered driver."
Loading
Loading