From 96515fffd118f8ed36c65a3b6454bb57c6fd4056 Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:19:06 +0200 Subject: [PATCH 1/3] Pin the pm toolchain and assert the changelog-date flag by difference pm-changelog 2026.9.2 stopped stamping the wall clock. An unflagged heading is now the bare `## ` instead of `## - `. This repo's control only noted that mismatch and still exited 0, so a no-op `--date-from-version` would have passed. The control now fails when the unflagged heading is missing or identical to the flagged version-dated heading, which is true of both generators. Pinned @unbrained/pm-cli 2026.9.5 (exact), pm-changelog 2026.9.2 (exact), and pm-ops ^2026.9.5 (caret preserved). $ ./scripts/verify-release-changelog-date.sh ok - with the flag the heading is version-derived: ## 2026.1.2 - 2026-01-02 ok - without the flag the heading is undated: ## 2026.1.2 # exit 0 # identical control (unflagged also passed --date-from-version): FAIL: without --date-from-version the heading is already '## 2026.1.2 - 2026-01-02', identical to the flagged run # exit 1 npm run release:check and pm health --strict-exit both exit 0. --- .agents/pm/chores/pm-github-c5i4.toon | 27 +++ .agents/pm/history/pm-github-c5i4.jsonl | 9 + CHANGELOG.md | 6 + package-lock.json | 247 ++++++----------------- package.json | 6 +- scripts/verify-release-changelog-date.sh | 16 +- 6 files changed, 115 insertions(+), 196 deletions(-) create mode 100644 .agents/pm/chores/pm-github-c5i4.toon create mode 100644 .agents/pm/history/pm-github-c5i4.jsonl diff --git a/.agents/pm/chores/pm-github-c5i4.toon b/.agents/pm/chores/pm-github-c5i4.toon new file mode 100644 index 0000000..00bbcf8 --- /dev/null +++ b/.agents/pm/chores/pm-github-c5i4.toon @@ -0,0 +1,27 @@ +id: pm-github-c5i4 +title: Pin the pm toolchain and assert the changelog-date flag by difference +description: "Pin @unbrained/pm-cli 2026.9.5, pm-changelog 2026.9.2, and pm-ops ^2026.9.5. pm-changelog 2026.9.2 stopped stamping the wall clock, so the unflagged control must prove --date-from-version is load-bearing by differing from the flagged heading rather than by matching a clock-derived string." +type: Chore +status: closed +priority: 2 +tags: [] +created_at: "2026-09-05T18:14:51.255Z" +updated_at: "2026-09-05T18:15:45.336Z" +closed_at: "2026-09-05T18:15:12.866Z" +completed_at: "2026-09-05T18:15:12.866Z" +claim_principal: pi-agent +author: pi-agent +resolution: Pinned the current pm toolchain and made the changelog-date control assert difference rather than a clock string. +expected_result: "release:check and pm health --strict-exit pass on pm-cli 2026.9.5, pm-changelog 2026.9.2, and pm-ops 2026.9.5; the unflagged heading control fails when identical to the flagged heading and passes when it differs." +actual_result: "release:check exit 0; pm health --strict-exit exit 0; identical-control script exit 1; restored script exit 0 with undated heading '## 2026.1.2'." +comments[1]{created_at,author,text}: + "2026-09-05T18:15:05.801Z",pi-agent,"Pinned @unbrained/pm-cli 2026.9.5 (exact), pm-changelog 2026.9.2 (exact), and pm-ops ^2026.9.5 (caret preserved).\n\npm-changelog 2026.9.2 no longer stamps the wall clock. An unflagged run now emits '## 2026.1.2' instead of '## 2026.1.2 - '. The previous control only noted that mismatch and still exited 0, so a no-op --date-from-version would have passed.\n\nThe control now fails only when the unflagged heading is missing or identical to the flagged '## 2026.1.2 - 2026-01-02'. That is true of both the old clock-stamping generator and 2026.9.2.\n\nRevert-proof: forcing the unflagged invocation to also pass --date-from-version made the script exit 1 (identical heading '## 2026.1.2 - 2026-01-02'). Restoring the unflagged invocation made it exit 0 (undated '## 2026.1.2').\n\nnpm run release:check and pm health --strict-exit both exit 0 on this tree." +files[6]{path,scope}: + package.json,project + package-lock.json,project + scripts/verify-release-changelog-date.sh,project + CHANGELOG.md,project + .agents/pm/chores/pm-github-c5i4.toon,project + .agents/pm/history/pm-github-c5i4.jsonl,project +close_reason: Pinned the current pm toolchain and made the changelog-date control assert difference rather than a clock string. +body: "" diff --git a/.agents/pm/history/pm-github-c5i4.jsonl b/.agents/pm/history/pm-github-c5i4.jsonl new file mode 100644 index 0000000..bac44da --- /dev/null +++ b/.agents/pm/history/pm-github-c5i4.jsonl @@ -0,0 +1,9 @@ +{"ts":"2026-09-05T18:14:51.255Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"create","patch":[{"op":"add","path":"/metadata/id","value":"pm-github-c5i4"},{"op":"add","path":"/metadata/title","value":"Pin the pm toolchain and assert the changelog-date flag by difference"},{"op":"add","path":"/metadata/description","value":"Pin @unbrained/pm-cli 2026.9.5, pm-changelog 2026.9.2, and pm-ops ^2026.9.5. pm-changelog 2026.9.2 stopped stamping the wall clock, so the unflagged control must prove --date-from-version is load-bearing by differing from the flagged heading rather than by matching a clock-derived string."},{"op":"add","path":"/metadata/type","value":"Chore"},{"op":"add","path":"/metadata/status","value":"open"},{"op":"add","path":"/metadata/priority","value":2},{"op":"add","path":"/metadata/tags","value":[]},{"op":"add","path":"/metadata/created_at","value":"2026-09-05T18:14:51.255Z"},{"op":"add","path":"/metadata/updated_at","value":"2026-09-05T18:14:51.255Z"},{"op":"add","path":"/metadata/author","value":"pi-agent"}],"before_hash":"3cc22dff72be7b14824654a7a64ea62b04799939b2fee54c1b5f52ca60bf6df0","after_hash":"e2dca00cb81e7c8797c2bd11c3ec79d2e658d421653025a03f29c303b8c3b570","item_hash_version":3,"message":"","event_class":"substantive","record_hash_version":1,"record_hash":"f1ee2582a3962cb52bf8ebb5d0e543a466e32fd2e44093e236d2b212ab60f317"} +{"ts":"2026-09-05T18:15:01.021Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":null,"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:01.021Z"},{"op":"add","path":"/metadata/assignee","value":"pi-agent"},{"op":"add","path":"/metadata/claim_principal","value":"pi-agent"}],"before_hash":"e2dca00cb81e7c8797c2bd11c3ec79d2e658d421653025a03f29c303b8c3b570","after_hash":"80e56cea20b97247358f0ad595d77c1cbe0bfc532989e7fed379ae3ddd87151a","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"c4624367875379eae4331805253599a6ea894bd359e9c9a45c86f780c9ac0f30"} +{"ts":"2026-09-05T18:15:01.111Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":null,"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:01.111Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"80e56cea20b97247358f0ad595d77c1cbe0bfc532989e7fed379ae3ddd87151a","after_hash":"d683f7232d596d8f93144b5c84a62997151893c731f37ca5e9b9e34a9e3bf6cf","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"7828414804f690a8febbd13f6bab33e8cfae33cb477e24441efe76133de8b711"} +{"ts":"2026-09-05T18:15:02.351Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:02.351Z"},{"op":"add","path":"/metadata/files","value":[{"path":"package.json","scope":"project"}]}],"before_hash":"d683f7232d596d8f93144b5c84a62997151893c731f37ca5e9b9e34a9e3bf6cf","after_hash":"3cdd01def0a730e0900c6882c025edb24c052cb1f8bd5ba606bd876d2efb21ad","item_hash_version":3,"event_class":"maintenance","record_hash_version":1,"record_hash":"a2dce44ecfa98037ff90ca843b60101ba8f52e26a60b9b6970afa883ce65ed11"} +{"ts":"2026-09-05T18:15:03.586Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"add","path":"/metadata/files/1","value":{"path":"package-lock.json","scope":"project"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:03.586Z"}],"before_hash":"3cdd01def0a730e0900c6882c025edb24c052cb1f8bd5ba606bd876d2efb21ad","after_hash":"513c2da2ff31ab6c968bb72bb7145af5785e6df913159516a8ff65ee8763aba5","item_hash_version":3,"event_class":"maintenance","record_hash_version":1,"record_hash":"dbd757ccc4f75829f83a32aec2dea244a253d22fef1f7f4e8e0d917bfe235033"} +{"ts":"2026-09-05T18:15:04.829Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"add","path":"/metadata/files/2","value":{"path":"scripts/verify-release-changelog-date.sh","scope":"project"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:04.829Z"}],"before_hash":"513c2da2ff31ab6c968bb72bb7145af5785e6df913159516a8ff65ee8763aba5","after_hash":"b9b50fad78ba59c3cb7b46cbd905bd3ce45925cb985e4199a1d603d4ab9d6b3e","item_hash_version":3,"event_class":"maintenance","record_hash_version":1,"record_hash":"c9bd1c1b031b3af46a42520c39a8fc5651117dbb0c797db676da02572cd16b4d"} +{"ts":"2026-09-05T18:15:05.802Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":null,"topic":null},"op":"comment_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:05.802Z"},{"op":"add","path":"/metadata/comments","value":[{"created_at":"2026-09-05T18:15:05.801Z","author":"pi-agent","text":"Pinned @unbrained/pm-cli 2026.9.5 (exact), pm-changelog 2026.9.2 (exact), and pm-ops ^2026.9.5 (caret preserved).\n\npm-changelog 2026.9.2 no longer stamps the wall clock. An unflagged run now emits '## 2026.1.2' instead of '## 2026.1.2 - '. The previous control only noted that mismatch and still exited 0, so a no-op --date-from-version would have passed.\n\nThe control now fails only when the unflagged heading is missing or identical to the flagged '## 2026.1.2 - 2026-01-02'. That is true of both the old clock-stamping generator and 2026.9.2.\n\nRevert-proof: forcing the unflagged invocation to also pass --date-from-version made the script exit 1 (identical heading '## 2026.1.2 - 2026-01-02'). Restoring the unflagged invocation made it exit 0 (undated '## 2026.1.2').\n\nnpm run release:check and pm health --strict-exit both exit 0 on this tree."}]}],"before_hash":"b9b50fad78ba59c3cb7b46cbd905bd3ce45925cb985e4199a1d603d4ab9d6b3e","after_hash":"84e6f1b500ecd01fd487d6683118290aa38d0d858d1050355984ac83f6295626","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"c0e3f4ea3be3578ce67cff486515ddda9cff5beac6e7fb5030c779b5b9aeb9c5"} +{"ts":"2026-09-05T18:15:12.874Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"close","patch":[{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:12.874Z"},{"op":"replace","path":"/metadata/status","value":"closed"},{"op":"add","path":"/metadata/closed_at","value":"2026-09-05T18:15:12.866Z"},{"op":"add","path":"/metadata/completed_at","value":"2026-09-05T18:15:12.866Z"},{"op":"add","path":"/metadata/resolution","value":"Pinned the current pm toolchain and made the changelog-date control assert difference rather than a clock string."},{"op":"add","path":"/metadata/expected_result","value":"release:check and pm health --strict-exit pass on pm-cli 2026.9.5, pm-changelog 2026.9.2, and pm-ops 2026.9.5; the unflagged heading control fails when identical to the flagged heading and passes when it differs."},{"op":"add","path":"/metadata/actual_result","value":"release:check exit 0; pm health --strict-exit exit 0; identical-control script exit 1; restored script exit 0 with undated heading '## 2026.1.2'."},{"op":"add","path":"/metadata/close_reason","value":"Pinned the current pm toolchain and made the changelog-date control assert difference rather than a clock string."}],"before_hash":"84e6f1b500ecd01fd487d6683118290aa38d0d858d1050355984ac83f6295626","after_hash":"c9fba13d525c4585d7d6b2bf05bc2c7182135402e549bcc9f0984c48eb81097a","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"3ce4329aaa1491ef60e861371aaa572bb5e74c76d6cf03b66db7571c3e1eb3b7"} +{"ts":"2026-09-05T18:15:45.336Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"add","path":"/metadata/files/3","value":{"path":"CHANGELOG.md","scope":"project"}},{"op":"add","path":"/metadata/files/4","value":{"path":".agents/pm/chores/pm-github-c5i4.toon","scope":"project"}},{"op":"add","path":"/metadata/files/5","value":{"path":".agents/pm/history/pm-github-c5i4.jsonl","scope":"project"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:45.336Z"}],"before_hash":"c9fba13d525c4585d7d6b2bf05bc2c7182135402e549bcc9f0984c48eb81097a","after_hash":"681d59aca80008156d9194d5407b4a6fdae632b372ca9b446e83025550b7bbfc","item_hash_version":3,"event_class":"maintenance","record_hash_version":1,"record_hash":"511ab76d88ee9b6c818e76f54192a9f2ab7483955ad4aa0a2b0aa549143c4033"} diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d1435a..201e514 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Other + +- Pin the pm toolchain and assert the changelog-date flag by difference ([pm-github-c5i4](https://github.com/unbraind/pm-github/blob/main/.agents/pm/chores/pm-github-c5i4.toon)) + ## 2026.9.4 - 2026-09-04 ### Security diff --git a/package-lock.json b/package-lock.json index 2dd349c..2c487a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "MIT", "devDependencies": { "@types/node": "^26.1.1", - "@unbrained/pm-cli": "2026.8.28", - "pm-changelog": "2026.8.30", - "pm-ops": "^2026.8.17", + "@unbrained/pm-cli": "2026.9.5", + "pm-changelog": "2026.9.2", + "pm-ops": "^2026.9.5", "typescript": "^7.0.2" }, "engines": { @@ -22,52 +22,6 @@ "@unbrained/pm-cli": ">=2026.8.20" } }, - "node_modules/@apm-js-collab/code-transformer": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@apm-js-collab/code-transformer/-/code-transformer-0.18.1.tgz", - "integrity": "sha512-u1Hb6bHjWtkSpiprwVP6YaHC1DTN4RAU3zYkUDUe7WMnJwdyU1pwTL9dFKiSJB9IiLue/EQovmyx6xhU7FFtAQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/estree": "^1.0.8", - "astring": "^1.9.0", - "esquery": "^1.7.0", - "meriyah": "^6.1.4", - "semifies": "^1.0.0", - "source-map": "^0.6.0" - }, - "bin": { - "code-transformer": "cli.js" - } - }, - "node_modules/@apm-js-collab/code-transformer-bundler-plugins": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@apm-js-collab/code-transformer-bundler-plugins/-/code-transformer-bundler-plugins-0.7.4.tgz", - "integrity": "sha512-nAfOeZPSUAQvJa1iFT/5oCrTm5YQhMMrfCNthNnaXHZiOQhu1KGuLoIx7HtbAi3wfwaBYLaICPIeenIaEwcXIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@apm-js-collab/code-transformer": "^0.18.1", - "es-module-lexer": "^2.1.0", - "magic-string": "^0.30.21", - "module-details-from-path": "^1.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@apm-js-collab/tracing-hooks": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@apm-js-collab/tracing-hooks/-/tracing-hooks-0.13.0.tgz", - "integrity": "sha512-mTvWz9rnQwx1U3h0XPTHaX7bgfkpipLLTQyjlC2cdhQpQEuoLT0AGzoydeoq2NxfEVv6fWOOETcSbb2nptleyw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@apm-js-collab/code-transformer": "^0.18.0", - "debug": "^4.4.1", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -81,13 +35,6 @@ "node": ">=18.0.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "dev": true, - "license": "MIT" - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -150,9 +97,9 @@ } }, "node_modules/@opentelemetry/core": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.10.0.tgz", - "integrity": "sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.11.0.tgz", + "integrity": "sha512-7YP44XH0tV6+Mb54x2YGf84i7yi+31MBZlE8JwvozkxyTvXbSp10X7cI7YE49ChJ3shMJoBmCJF3+1QFBJctGA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -184,13 +131,13 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.10.0.tgz", - "integrity": "sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.11.0.tgz", + "integrity": "sha512-Ie7+8q8MDF4FAEQCKVMTx3ReUvxiIAgIiiW3c9JdmP8+HMcDy20puT+AHjexnExgnbvBxjQ9fjkFDWrikJ2jQA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.10.0", + "@opentelemetry/core": "2.11.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -201,14 +148,14 @@ } }, "node_modules/@opentelemetry/sdk-trace": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.10.0.tgz", - "integrity": "sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.11.0.tgz", + "integrity": "sha512-fFnTqGm8/G73GQVnxYi7LXa1ZVYEUvgL6XI1LpvV0bPC7WQ/ZGgKxCSl8FnlZBKto9JHHEFTO6s6CUpvvtwFrA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.10.0", - "@opentelemetry/resources": "2.10.0", + "@opentelemetry/core": "2.11.0", + "@opentelemetry/resources": "2.11.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -219,15 +166,15 @@ } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.10.0.tgz", - "integrity": "sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.11.0.tgz", + "integrity": "sha512-H19x/TX/LZdqiYOjM7fqtSxwlplC5pgelavqbQdHbhdq0q/AI/TGkM2dfGuuynTXmJPeF2HoZVoPDu+TGoW78A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.10.0", - "@opentelemetry/resources": "2.10.0", - "@opentelemetry/sdk-trace": "2.10.0", + "@opentelemetry/core": "2.11.0", + "@opentelemetry/resources": "2.11.0", + "@opentelemetry/sdk-trace": "2.11.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -258,9 +205,9 @@ } }, "node_modules/@sentry/core": { - "version": "10.71.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.71.0.tgz", - "integrity": "sha512-OIjT7rzcWJjUC6r3eBT3Td1j0afDBMkbbx9jTocSD+ZSfc25eEU7hoIPS0WvfeIOTIN3y8bfQnXavwMReaNVHQ==", + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.73.0.tgz", + "integrity": "sha512-FLO1UgH19RyasVpofu612WCOgb2nEH0dZy+R72d7p65XU9i0wxlMKm3+sgfwKmiSJp1Qhilaaxs4Jg6BbiM5HA==", "dev": true, "license": "MIT", "dependencies": { @@ -271,9 +218,9 @@ } }, "node_modules/@sentry/node": { - "version": "10.71.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.71.0.tgz", - "integrity": "sha512-bw2M/xkMu2+ATo6QWFmtTZTYp5LV1krt9/DTtYqtt4GmhXmXgdFPXCv6783AJI3HUoEMx2BcehhNbKzGrFXo/g==", + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.73.0.tgz", + "integrity": "sha512-jiMJ6GgXDw6UMGzJY+o0c8OoeA9OfHqZ/xEpHfDqy75hn+9CEkRkbNGCIdMvsc7wW/Se1Os394hHfTpU+YEskg==", "dev": true, "license": "MIT", "dependencies": { @@ -281,10 +228,10 @@ "@opentelemetry/instrumentation": "^0.220.0", "@opentelemetry/sdk-trace-base": "^2.9.0", "@sentry/conventions": "^0.16.0", - "@sentry/core": "10.71.0", - "@sentry/node-core": "10.71.0", - "@sentry/opentelemetry": "10.71.0", - "@sentry/server-utils": "10.71.0", + "@sentry/core": "10.73.0", + "@sentry/node-core": "10.73.0", + "@sentry/opentelemetry": "10.73.0", + "@sentry/server-utils": "10.73.0", "import-in-the-middle": "^3.0.0" }, "engines": { @@ -292,15 +239,15 @@ } }, "node_modules/@sentry/node-core": { - "version": "10.71.0", - "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.71.0.tgz", - "integrity": "sha512-sxd0/ZW+Uda/17H0R7lB2Othm37VYcdwKdWdyHRizg872TfCX4UwTTPaoS2tMJAUjV2tVh83ZA0fsoC2q9SpjA==", + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.73.0.tgz", + "integrity": "sha512-GHAGUmZPmm6FKfxfv2maVVJ/A99YAmd7oFOuKMDmITI6O/Msl6JB3vPTEpopVAHLW0LYJQBOjddL9C7o+Jt44g==", "dev": true, "license": "MIT", "dependencies": { "@sentry/conventions": "^0.16.0", - "@sentry/core": "10.71.0", - "@sentry/opentelemetry": "10.71.0", + "@sentry/core": "10.73.0", + "@sentry/opentelemetry": "10.73.0", "import-in-the-middle": "^3.0.0" }, "engines": { @@ -332,14 +279,14 @@ } }, "node_modules/@sentry/opentelemetry": { - "version": "10.71.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.71.0.tgz", - "integrity": "sha512-YgeL0xTObKma3MuOrt+/6M/f6mo/Z08LHh3OxPomzQpgpCgCLGyJ/739cDSSH1LRjqWdPQtoia5asl5ZRdhWmw==", + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.73.0.tgz", + "integrity": "sha512-fQouPQKsH0CQrw6oAn1k0Z2I+tgyochCovifr5qNS69i0OzjknLa03WJyiZ/IuzXc4AVa5jAKfOeE9slABz8Qw==", "dev": true, "license": "MIT", "dependencies": { "@sentry/conventions": "^0.16.0", - "@sentry/core": "10.71.0" + "@sentry/core": "10.73.0" }, "engines": { "node": ">=18" @@ -351,17 +298,14 @@ } }, "node_modules/@sentry/server-utils": { - "version": "10.71.0", - "resolved": "https://registry.npmjs.org/@sentry/server-utils/-/server-utils-10.71.0.tgz", - "integrity": "sha512-zdyShKNsghzPGVWVRzc7oybYTsRZdKgdPtq+dsksImo1b6n7ILlD7eYx1Q0eAOZoWkDqDmm+Ml6MQb76IT1eTA==", + "version": "10.73.0", + "resolved": "https://registry.npmjs.org/@sentry/server-utils/-/server-utils-10.73.0.tgz", + "integrity": "sha512-QskripdKFbM/+gipC6mpa2crLwL7+VbkX84IpHg2z9UlYQ1kNKd3aMT+Qk9NLRSw/zu1rSIAvlbWfx4D3rgNAA==", "dev": true, "license": "MIT", "dependencies": { - "@apm-js-collab/code-transformer-bundler-plugins": "^0.7.3", - "@apm-js-collab/tracing-hooks": "^0.13.0", "@sentry/conventions": "^0.16.0", - "@sentry/core": "10.71.0", - "meriyah": "^6.1.4" + "@sentry/core": "10.73.0" }, "engines": { "node": ">=18" @@ -374,13 +318,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/node": { "version": "26.4.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.4.0.tgz", @@ -732,13 +669,13 @@ } }, "node_modules/@unbrained/pm-cli": { - "version": "2026.8.28", - "resolved": "https://registry.npmjs.org/@unbrained/pm-cli/-/pm-cli-2026.8.28.tgz", - "integrity": "sha512-iYzhgwgYDVn/4GybW/CBT4lls/ik6FdviEpnklPl3G0iqFefEZhAQkGfW7VddJl27+3TnZKpKyHBBf1AYinhfQ==", + "version": "2026.9.5", + "resolved": "https://registry.npmjs.org/@unbrained/pm-cli/-/pm-cli-2026.9.5.tgz", + "integrity": "sha512-JrOBWBaKBmUATW921AsLL8qmxo9oOFrJp7lIkvOdND47U6v7ifkiWxosdzkY3payog+NIc9jKMNeXurWuzuZqA==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/node": "10.71.0", + "@sentry/node": "10.73.0", "@toon-format/toon": "^4.1.1", "@types/node": ">=22", "commander": "^15.0.0", @@ -758,16 +695,6 @@ "node": ">=22.18.0" } }, - "node_modules/astring": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", - "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", - "dev": true, - "license": "MIT", - "bin": { - "astring": "bin/astring" - } - }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -833,29 +760,6 @@ "dev": true, "license": "MIT" }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -930,9 +834,9 @@ } }, "node_modules/import-in-the-middle": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.3.3.tgz", - "integrity": "sha512-AiohS3H80sXO6owEltjGX+glb7qXaDhBoJb9XcQVH4UI207xu/bDLUcadVKp7Qe576reg9yr/PXZjV5qx8gfbA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.4.0.tgz", + "integrity": "sha512-Xfjwfarhe+LGmoaof+sexeNo3sGRysb5x56WrZLwHtmqT0OilSKtVWkv0lrCcMgSKyKP9oBogBAisHZvtJH0aw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -987,16 +891,6 @@ "node": "20 || >=22" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -1007,16 +901,6 @@ "node": ">= 8" } }, - "node_modules/meriyah": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-6.1.4.tgz", - "integrity": "sha512-Sz8FzjzI0kN13GK/6MVEsVzMZEPvOhnmmI1lU5+/1cGOiK3QUahntrNNtdVeihrO7t9JpoH75iMNXg6R6uWflQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -1098,9 +982,9 @@ } }, "node_modules/pm-changelog": { - "version": "2026.8.30", - "resolved": "https://registry.npmjs.org/pm-changelog/-/pm-changelog-2026.8.30.tgz", - "integrity": "sha512-dB99FXI9P/pREst3EGMRATLEVw2dfcEoZCLzj19Sv9U5k5VEx/m+IHKJrDI6YhY1v+uzmJyHKtIeQ7U+S5hRNw==", + "version": "2026.9.2", + "resolved": "https://registry.npmjs.org/pm-changelog/-/pm-changelog-2026.9.2.tgz", + "integrity": "sha512-pP8lEl5fCg8OKVok2PDw2440msMSX7XQGOL8hZhc0mJKkXuhYuPKP3rFl1h5OpvszqLAN/SX0b0ApYPoRlo2Kw==", "dev": true, "license": "MIT", "bin": { @@ -1114,9 +998,9 @@ } }, "node_modules/pm-ops": { - "version": "2026.8.31", - "resolved": "https://registry.npmjs.org/pm-ops/-/pm-ops-2026.8.31.tgz", - "integrity": "sha512-RLBjUBi1rnaLu/0Zw1SAqmNR6/E269xUxUXKHje1feou1vVs5xYUPG40fUFhA1HDoIQSzN3QcFBjT1hbead5Xg==", + "version": "2026.9.5", + "resolved": "https://registry.npmjs.org/pm-ops/-/pm-ops-2026.9.5.tgz", + "integrity": "sha512-+x6p+Byx22NqwIhWp9ThZ+N0dv12yJQDtdooiEh0k/uFrAhV/uHkGSCXMqXUK03XCDhxrgXDbLoBOVWwMzN4bg==", "dev": true, "license": "MIT", "dependencies": { @@ -1210,13 +1094,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/semifies": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semifies/-/semifies-1.0.0.tgz", - "integrity": "sha512-xXR3KGeoxTNWPD4aBvL5NUpMTT7WMANr3EWnaS190QVkY52lqqcVRD7Q05UVbBhiWDGWMlJEUam9m7uFFGVScw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -1230,16 +1107,6 @@ "node": ">=10" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/tar": { "version": "7.5.22", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", diff --git a/package.json b/package.json index f7cc54b..dccaa61 100644 --- a/package.json +++ b/package.json @@ -45,9 +45,9 @@ }, "devDependencies": { "@types/node": "^26.1.1", - "@unbrained/pm-cli": "2026.8.28", - "pm-changelog": "2026.8.30", - "pm-ops": "^2026.8.17", + "@unbrained/pm-cli": "2026.9.5", + "pm-changelog": "2026.9.2", + "pm-ops": "^2026.9.5", "typescript": "^7.0.2" }, "keywords": [ diff --git a/scripts/verify-release-changelog-date.sh b/scripts/verify-release-changelog-date.sh index e776951..0ba6eb4 100755 --- a/scripts/verify-release-changelog-date.sh +++ b/scripts/verify-release-changelog-date.sh @@ -60,9 +60,19 @@ if [ "$with" != "$expected" ]; then else echo "ok - with the flag the heading is version-derived: $with" fi -if [ "$without" != "$today_heading" ]; then - echo "note - without the flag the heading was '$without' (expected the clock-derived '$today_heading'); the flag's effect is still asserted above" -else +# The unflagged run is the control: it proves the flag is doing the work. +# Assert only that it DIFFERS from the flagged heading. Pinning the control to +# the clock form (`## - `) fails against pm-changelog 2026.9.2, +# which stopped stamping the wall clock and emits the bare `## ` instead. +# Both generators still differ from the version-dated heading; a control identical +# to the flagged run still fails, because then the flag discriminates nothing. +if [ -z "$without" ]; then + echo "FAIL: without --date-from-version produced no heading, so the comparison proves nothing" >&2; status=1 +elif [ "$without" = "$with" ]; then + echo "FAIL: without --date-from-version the heading is already '$without', identical to the flagged run" >&2; status=1 +elif [ "$without" = "$today_heading" ]; then echo "ok - without the flag the heading is clock-derived: $without (this is the defect the flag removes)" +else + echo "ok - without the flag the heading is undated: $without (this is the defect the flag removes)" fi exit $status From f292df1c36e69d26b7393178ec908ba9d33fd279 Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:24:45 +0200 Subject: [PATCH 2/3] fix(release): let the date control vouch only for headings it recognises Greptile raised a valid P2 against the loosened control: asserting only that the unflagged heading DIFFERS from the flagged one means a generator emitting a malformed heading, or a heading for the wrong version, is reported as "undated" and passes. The control then proves the flag changed something, but not that it changed the right thing -- and a control that vouches for output it cannot recognise is exactly the failure the flagged half is there to prevent. The open-ended else is replaced by an explicit allow-list of the two shapes a correct generator can produce for the probe version: ## 2026.1.2 (undated; pm-changelog 2026.9.2 and later) ## 2026.1.2 - (clock-derived; earlier releases) Anything else fails and names both accepted forms next to what was received. This keeps the property that made the loosening necessary -- the control is not pinned to the clock form, so it still passes against the generator that fixed the clock dependence -- while refusing to certify a heading it does not know. Every branch verified to fire: a wrong-version heading fails as unrecognised, undated and clock-derived both pass, a heading identical to the flagged run fails, and an empty heading fails. Tracked as pm-github-c5i4. --- .agents/pm/chores/pm-github-c5i4.toon | 5 +++-- .agents/pm/history/pm-github-c5i4.jsonl | 1 + scripts/verify-release-changelog-date.sh | 17 +++++++++++------ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.agents/pm/chores/pm-github-c5i4.toon b/.agents/pm/chores/pm-github-c5i4.toon index 00bbcf8..6238a99 100644 --- a/.agents/pm/chores/pm-github-c5i4.toon +++ b/.agents/pm/chores/pm-github-c5i4.toon @@ -6,7 +6,7 @@ status: closed priority: 2 tags: [] created_at: "2026-09-05T18:14:51.255Z" -updated_at: "2026-09-05T18:15:45.336Z" +updated_at: "2026-09-05T18:24:31.473Z" closed_at: "2026-09-05T18:15:12.866Z" completed_at: "2026-09-05T18:15:12.866Z" claim_principal: pi-agent @@ -14,8 +14,9 @@ author: pi-agent resolution: Pinned the current pm toolchain and made the changelog-date control assert difference rather than a clock string. expected_result: "release:check and pm health --strict-exit pass on pm-cli 2026.9.5, pm-changelog 2026.9.2, and pm-ops 2026.9.5; the unflagged heading control fails when identical to the flagged heading and passes when it differs." actual_result: "release:check exit 0; pm health --strict-exit exit 0; identical-control script exit 1; restored script exit 0 with undated heading '## 2026.1.2'." -comments[1]{created_at,author,text}: +comments[2]{created_at,author,text}: "2026-09-05T18:15:05.801Z",pi-agent,"Pinned @unbrained/pm-cli 2026.9.5 (exact), pm-changelog 2026.9.2 (exact), and pm-ops ^2026.9.5 (caret preserved).\n\npm-changelog 2026.9.2 no longer stamps the wall clock. An unflagged run now emits '## 2026.1.2' instead of '## 2026.1.2 - '. The previous control only noted that mismatch and still exited 0, so a no-op --date-from-version would have passed.\n\nThe control now fails only when the unflagged heading is missing or identical to the flagged '## 2026.1.2 - 2026-01-02'. That is true of both the old clock-stamping generator and 2026.9.2.\n\nRevert-proof: forcing the unflagged invocation to also pass --date-from-version made the script exit 1 (identical heading '## 2026.1.2 - 2026-01-02'). Restoring the unflagged invocation made it exit 0 (undated '## 2026.1.2').\n\nnpm run release:check and pm health --strict-exit both exit 0 on this tree." + "2026-09-05T18:24:31.473Z",claude-orchestrator,"Greptile raised a valid P2 on the loosened control: asserting only that the unflagged heading differs from the flagged one means a generator emitting a malformed heading, or a heading for the wrong version, is reported as undated and passes. The control then proves the flag changed something, but not that it changed the right thing. Replaced the open-ended else with an explicit allow-list of the two shapes a correct generator can produce for the probe version: the clock-derived heading and the bare undated heading. Anything else fails and names both accepted forms alongside what was received. Verified every branch fires: a wrong-version heading fails as unrecognised, undated and clock-derived both pass, a heading identical to the flagged run fails, and an empty heading fails." files[6]{path,scope}: package.json,project package-lock.json,project diff --git a/.agents/pm/history/pm-github-c5i4.jsonl b/.agents/pm/history/pm-github-c5i4.jsonl index bac44da..8959c93 100644 --- a/.agents/pm/history/pm-github-c5i4.jsonl +++ b/.agents/pm/history/pm-github-c5i4.jsonl @@ -7,3 +7,4 @@ {"ts":"2026-09-05T18:15:05.802Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":null,"topic":null},"op":"comment_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:05.802Z"},{"op":"add","path":"/metadata/comments","value":[{"created_at":"2026-09-05T18:15:05.801Z","author":"pi-agent","text":"Pinned @unbrained/pm-cli 2026.9.5 (exact), pm-changelog 2026.9.2 (exact), and pm-ops ^2026.9.5 (caret preserved).\n\npm-changelog 2026.9.2 no longer stamps the wall clock. An unflagged run now emits '## 2026.1.2' instead of '## 2026.1.2 - '. The previous control only noted that mismatch and still exited 0, so a no-op --date-from-version would have passed.\n\nThe control now fails only when the unflagged heading is missing or identical to the flagged '## 2026.1.2 - 2026-01-02'. That is true of both the old clock-stamping generator and 2026.9.2.\n\nRevert-proof: forcing the unflagged invocation to also pass --date-from-version made the script exit 1 (identical heading '## 2026.1.2 - 2026-01-02'). Restoring the unflagged invocation made it exit 0 (undated '## 2026.1.2').\n\nnpm run release:check and pm health --strict-exit both exit 0 on this tree."}]}],"before_hash":"b9b50fad78ba59c3cb7b46cbd905bd3ce45925cb985e4199a1d603d4ab9d6b3e","after_hash":"84e6f1b500ecd01fd487d6683118290aa38d0d858d1050355984ac83f6295626","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"c0e3f4ea3be3578ce67cff486515ddda9cff5beac6e7fb5030c779b5b9aeb9c5"} {"ts":"2026-09-05T18:15:12.874Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"close","patch":[{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:12.874Z"},{"op":"replace","path":"/metadata/status","value":"closed"},{"op":"add","path":"/metadata/closed_at","value":"2026-09-05T18:15:12.866Z"},{"op":"add","path":"/metadata/completed_at","value":"2026-09-05T18:15:12.866Z"},{"op":"add","path":"/metadata/resolution","value":"Pinned the current pm toolchain and made the changelog-date control assert difference rather than a clock string."},{"op":"add","path":"/metadata/expected_result","value":"release:check and pm health --strict-exit pass on pm-cli 2026.9.5, pm-changelog 2026.9.2, and pm-ops 2026.9.5; the unflagged heading control fails when identical to the flagged heading and passes when it differs."},{"op":"add","path":"/metadata/actual_result","value":"release:check exit 0; pm health --strict-exit exit 0; identical-control script exit 1; restored script exit 0 with undated heading '## 2026.1.2'."},{"op":"add","path":"/metadata/close_reason","value":"Pinned the current pm toolchain and made the changelog-date control assert difference rather than a clock string."}],"before_hash":"84e6f1b500ecd01fd487d6683118290aa38d0d858d1050355984ac83f6295626","after_hash":"c9fba13d525c4585d7d6b2bf05bc2c7182135402e549bcc9f0984c48eb81097a","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"3ce4329aaa1491ef60e861371aaa572bb5e74c76d6cf03b66db7571c3e1eb3b7"} {"ts":"2026-09-05T18:15:45.336Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.6","agent_model_source":"environment","agent_instance":"4667fc6dfa36cfcbf86244bd","agent_provenance":{"model":{"value":"grok-4.6","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"add","path":"/metadata/files/3","value":{"path":"CHANGELOG.md","scope":"project"}},{"op":"add","path":"/metadata/files/4","value":{"path":".agents/pm/chores/pm-github-c5i4.toon","scope":"project"}},{"op":"add","path":"/metadata/files/5","value":{"path":".agents/pm/history/pm-github-c5i4.jsonl","scope":"project"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:15:45.336Z"}],"before_hash":"c9fba13d525c4585d7d6b2bf05bc2c7182135402e549bcc9f0984c48eb81097a","after_hash":"681d59aca80008156d9194d5407b4a6fdae632b372ca9b446e83025550b7bbfc","item_hash_version":3,"event_class":"maintenance","record_hash_version":1,"record_hash":"511ab76d88ee9b6c818e76f54192a9f2ab7483955ad4aa0a2b0aa549143c4033"} +{"ts":"2026-09-05T18:24:31.473Z","author":"claude-orchestrator","author_source":"asserted","agent_harness":"claude-code","agent_model":"claude-opus-5","agent_model_source":"probe","agent_instance":"d8dbc6c3b8a673148b5c3e78","agent_provenance":{"model":{"value":"claude-opus-5","source":"probe"},"effort":{"value":"xhigh","source":"environment"},"role":null,"topic":null,"version":{"value":"2.1.261","source":"probe"}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/1","value":{"created_at":"2026-09-05T18:24:31.473Z","author":"claude-orchestrator","text":"Greptile raised a valid P2 on the loosened control: asserting only that the unflagged heading differs from the flagged one means a generator emitting a malformed heading, or a heading for the wrong version, is reported as undated and passes. The control then proves the flag changed something, but not that it changed the right thing. Replaced the open-ended else with an explicit allow-list of the two shapes a correct generator can produce for the probe version: the clock-derived heading and the bare undated heading. Anything else fails and names both accepted forms alongside what was received. Verified every branch fires: a wrong-version heading fails as unrecognised, undated and clock-derived both pass, a heading identical to the flagged run fails, and an empty heading fails."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:24:31.473Z"}],"before_hash":"681d59aca80008156d9194d5407b4a6fdae632b372ca9b446e83025550b7bbfc","after_hash":"7289bbf0e96ed4295cff8440c09735f06f50e03cf998a34849b1ee2115a95179","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"95b7fe6ff657437657cbe3bbe2e4c79852033ce46b4f8aff91bbcda580d35446"} diff --git a/scripts/verify-release-changelog-date.sh b/scripts/verify-release-changelog-date.sh index 0ba6eb4..04c33e4 100755 --- a/scripts/verify-release-changelog-date.sh +++ b/scripts/verify-release-changelog-date.sh @@ -61,18 +61,23 @@ else echo "ok - with the flag the heading is version-derived: $with" fi # The unflagged run is the control: it proves the flag is doing the work. -# Assert only that it DIFFERS from the flagged heading. Pinning the control to -# the clock form (`## - `) fails against pm-changelog 2026.9.2, -# which stopped stamping the wall clock and emits the bare `## ` instead. -# Both generators still differ from the version-dated heading; a control identical -# to the flagged run still fails, because then the flag discriminates nothing. +# It must not be pinned to the clock form (`## - `), which fails +# against pm-changelog 2026.9.2 -- that release stopped stamping the wall clock +# and emits the bare `## ` instead. But it must not accept ANY differing +# heading either: a generator emitting a malformed heading, or one for the wrong +# version, would then be reported as "undated" and pass while proving nothing +# about the flag. So the control is an explicit allow-list of the two shapes a +# correct generator can produce for THIS probe version, and anything else fails. +bare_heading="## ${probe}" if [ -z "$without" ]; then echo "FAIL: without --date-from-version produced no heading, so the comparison proves nothing" >&2; status=1 elif [ "$without" = "$with" ]; then echo "FAIL: without --date-from-version the heading is already '$without', identical to the flagged run" >&2; status=1 elif [ "$without" = "$today_heading" ]; then echo "ok - without the flag the heading is clock-derived: $without (this is the defect the flag removes)" -else +elif [ "$without" = "$bare_heading" ]; then echo "ok - without the flag the heading is undated: $without (this is the defect the flag removes)" +else + echo "FAIL: without --date-from-version expected the clock-derived '$today_heading' or the undated '$bare_heading', got '$without' - the control cannot vouch for a heading it does not recognise" >&2; status=1 fi exit $status From 808d51bdce5fecc279a802d37378c4a352ee5cdd Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:26:44 +0200 Subject: [PATCH 3/3] fix(release): bound the date control by version rather than by enumerated spellings The allow-list of two spellings was too brittle. A sibling package's generator also emits a disambiguated `## -2` heading when a section for that version already exists, which is legitimate output the enumeration would have failed on -- turning Greptile's correctness fix into a false build stop. The bound is now the property rather than the spellings: the unflagged heading must be a heading FOR THE PROBE VERSION, in some form other than the version-derived one. That still rejects the case Greptile raised (a malformed heading, or one for a different version, can no longer be certified as undated), while accepting any legitimate non-version-derived spelling. The trailing `[^0-9]` guard stops probe `2026.1.2` matching a heading for `2026.1.20`. Verified: wrong-version, false-prefix, identical-to-flagged and empty all fail; bare, disambiguated and clock-derived all pass. --- scripts/verify-release-changelog-date.sh | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/scripts/verify-release-changelog-date.sh b/scripts/verify-release-changelog-date.sh index 04c33e4..05896d9 100755 --- a/scripts/verify-release-changelog-date.sh +++ b/scripts/verify-release-changelog-date.sh @@ -68,16 +68,21 @@ fi # version, would then be reported as "undated" and pass while proving nothing # about the flag. So the control is an explicit allow-list of the two shapes a # correct generator can produce for THIS probe version, and anything else fails. -bare_heading="## ${probe}" +# The bound is "a heading for THIS probe version, in some form other than the +# version-derived one" rather than an enumerated list of spellings. Enumerating +# is too brittle: the generator also emits a disambiguated `## -2` when a +# section for that version already exists, which is legitimate output that an +# allow-list of the bare and clock forms would reject. The trailing `[^0-9]` +# guard stops `2026.1.2` matching a heading for `2026.1.20`. if [ -z "$without" ]; then echo "FAIL: without --date-from-version produced no heading, so the comparison proves nothing" >&2; status=1 elif [ "$without" = "$with" ]; then echo "FAIL: without --date-from-version the heading is already '$without', identical to the flagged run" >&2; status=1 +elif ! printf '%s' "$without" | grep -qE "^## ${probe}([^0-9].*)?$"; then + echo "FAIL: without --date-from-version expected a heading for ${probe} in a non-version-derived form, got '$without' - the control cannot vouch for a heading that is not even for the probe version" >&2; status=1 elif [ "$without" = "$today_heading" ]; then echo "ok - without the flag the heading is clock-derived: $without (this is the defect the flag removes)" -elif [ "$without" = "$bare_heading" ]; then - echo "ok - without the flag the heading is undated: $without (this is the defect the flag removes)" else - echo "FAIL: without --date-from-version expected the clock-derived '$today_heading' or the undated '$bare_heading', got '$without' - the control cannot vouch for a heading it does not recognise" >&2; status=1 + echo "ok - without the flag the heading is not version-derived: $without (this is the defect the flag removes)" fi exit $status