Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
9337693
fix(changelog): derive the no-tag release date from the version, not …
unbraind Aug 24, 2026
6348f66
test(changelog): prove the release-workflow path, which changelog:che…
unbraind Aug 24, 2026
ebdfcd6
test(changelog): prove the release-workflow path, which changelog:che…
unbraind Aug 24, 2026
c133cf1
fix(ci): check each generator invocation on its own, and fail when th…
unbraind Aug 27, 2026
07c0f0f
chore(pm): drop a comment that a retried add had duplicated
unbraind Aug 27, 2026
dfeccd6
chore(git): ignore SDK workspace-transaction journals
unbraind Aug 27, 2026
8b26a0a
ci: run the changelog-date verifier instead of only shipping it
unbraind Aug 27, 2026
4ad4e9c
docs(pm): record the gate wiring and the review findings applied to t…
unbraind Aug 27, 2026
0718e35
fix(ci): find the release-time generator invocations the shell verifi…
unbraind Aug 27, 2026
2ddd311
test: execute the verifier's rules against fixtures, and close three …
unbraind Aug 27, 2026
1ee663a
fix(ci): stop three guards failing open, and stop one gate measuring …
unbraind Aug 27, 2026
d86ef02
test: follow the verifier's own contract change, and drop a duplicate…
unbraind Aug 27, 2026
fa11fd0
fix: close a continuation bypass, stop a comment satisfying a flag check
unbraind Aug 27, 2026
dd0d006
fix: split on unspaced shell separators, and stop two guards at the r…
unbraind Aug 27, 2026
77db09d
fix(changelog): cover suffixed CalVer releases
unbraind Aug 29, 2026
6b0ed0f
fix(changelog): preserve single-quoted backslashes
unbraind Aug 29, 2026
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
11 changes: 11 additions & 0 deletions .agents/pm/history/pm-graph-4glq.jsonl

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions .agents/pm/history/pm-graph-gjpd.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{"ts":"2026-08-29T04:58:36.090Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"gpt-5.6-sol","agent_model_source":"environment","agent_instance":"3b80ec0e6cc69afd5cadb09e","agent_provenance":{"model":{"value":"gpt-5.6-sol","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"create","patch":[{"op":"add","path":"/metadata/id","value":"pm-graph-gjpd"},{"op":"add","path":"/metadata/title","value":"Unblock PR 70 suffixed CalVer changelog gate"},{"op":"add","path":"/metadata/description","value":"Rebase PR 70 after PR 79, adopt the published suffix-safe pm-changelog release, and execute a same-day suffixed-version regression."},{"op":"add","path":"/metadata/type","value":"Issue"},{"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-08-29T04:58:36.090Z"},{"op":"add","path":"/metadata/updated_at","value":"2026-08-29T04:58:36.090Z"},{"op":"add","path":"/metadata/author","value":"pi-agent"}],"before_hash":"3cc22dff72be7b14824654a7a64ea62b04799939b2fee54c1b5f52ca60bf6df0","after_hash":"9726954f68f1b235f9e4b962d9fe21c3b3424525a1458cde41e84e00d410c5b4","item_hash_version":2,"message":""}
{"ts":"2026-08-29T04:58:36.574Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"gpt-5.6-sol","agent_model_source":"environment","agent_instance":"3b80ec0e6cc69afd5cadb09e","agent_provenance":{"model":{"value":"gpt-5.6-sol","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-08-29T04:58:36.574Z"},{"op":"add","path":"/metadata/assignee","value":"pi-agent"},{"op":"add","path":"/metadata/claim_principal","value":"pi-agent"}],"before_hash":"9726954f68f1b235f9e4b962d9fe21c3b3424525a1458cde41e84e00d410c5b4","after_hash":"dcd9a4b38b34d247753444d159b4f69f47454573cd0d69f3d8d1d92eb14bfdb1","item_hash_version":2}
{"ts":"2026-08-29T04:58:37.062Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"gpt-5.6-sol","agent_model_source":"environment","agent_instance":"3b80ec0e6cc69afd5cadb09e","agent_provenance":{"model":{"value":"gpt-5.6-sol","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-08-29T04:58:37.062Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"dcd9a4b38b34d247753444d159b4f69f47454573cd0d69f3d8d1d92eb14bfdb1","after_hash":"eec28beaf45a6f874220bb9ac6a2d483f05c6bdd5b61b0343572a1f2207d7dbd","item_hash_version":2}
{"ts":"2026-08-29T04:58:37.797Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"gpt-5.6-sol","agent_model_source":"environment","agent_instance":"3b80ec0e6cc69afd5cadb09e","agent_provenance":{"model":{"value":"gpt-5.6-sol","source":"environment"},"effort":null,"role":null,"topic":null},"op":"files_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-08-29T04:58:37.797Z"},{"op":"add","path":"/metadata/files","value":[{"path":"package-lock.json","scope":"project"},{"path":"package.json","scope":"project"},{"path":"scripts/verify-release-changelog-date.ts","scope":"project"},{"path":"test/verify-release-changelog-date.test.ts","scope":"project"}]}],"before_hash":"eec28beaf45a6f874220bb9ac6a2d483f05c6bdd5b61b0343572a1f2207d7dbd","after_hash":"5da91d771e93ba2d02b1692d8028cc2ba7264da5d041569b5076237e8f6c957a","item_hash_version":2}
{"ts":"2026-08-29T04:58:38.384Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"gpt-5.6-sol","agent_model_source":"environment","agent_instance":"3b80ec0e6cc69afd5cadb09e","agent_provenance":{"model":{"value":"gpt-5.6-sol","source":"environment"},"effort":null,"role":null,"topic":null},"op":"comment_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-08-29T04:58:38.384Z"},{"op":"add","path":"/metadata/comments","value":[{"created_at":"2026-08-29T04:58:38.384Z","author":"pi-agent","text":"Updated pm-changelog from 2026.8.17 to published 2026.8.22 and changed the behavioural gate to probe 2026.1.2-1, preserving the suffix while expecting date 2026-01-02."}]}],"before_hash":"5da91d771e93ba2d02b1692d8028cc2ba7264da5d041569b5076237e8f6c957a","after_hash":"0303b972bbcf421e10c9c16842dc044cc4153e205f32f822e507bb5c5e76e5d0","item_hash_version":2}
{"ts":"2026-08-29T04:58:39.086Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"gpt-5.6-sol","agent_model_source":"environment","agent_instance":"3b80ec0e6cc69afd5cadb09e","agent_provenance":{"model":{"value":"gpt-5.6-sol","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-08-29T04:58:39.086Z"},{"op":"replace","path":"/metadata/status","value":"closed"},{"op":"add","path":"/metadata/closed_at","value":"2026-08-29T04:58:39.070Z"},{"op":"add","path":"/metadata/completed_at","value":"2026-08-29T04:58:39.070Z"},{"op":"add","path":"/metadata/close_reason","value":"Suffixed CalVer release path now executable and covered"}],"before_hash":"0303b972bbcf421e10c9c16842dc044cc4153e205f32f822e507bb5c5e76e5d0","after_hash":"8e522465a1ff24de60806c6d587fc87febff4be1f35181d4bb9bd412c0dd8926","item_hash_version":2}
{"ts":"2026-08-29T04:58:39.701Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"gpt-5.6-sol","agent_model_source":"environment","agent_instance":"3b80ec0e6cc69afd5cadb09e","agent_provenance":{"model":{"value":"gpt-5.6-sol","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"replace","path":"/metadata/updated_at","value":"2026-08-29T04:58:39.701Z"}],"before_hash":"8e522465a1ff24de60806c6d587fc87febff4be1f35181d4bb9bd412c0dd8926","after_hash":"54604f9217fef400e847b350cbaa89377110ca4c0d848e75b685eb76222e7225","item_hash_version":2}
{"ts":"2026-08-29T05:19:01.093Z","author":"pi-agent","author_source":"asserted","agent_harness":"pi","agent_model":"gpt-5.6-sol","agent_model_source":"environment","agent_instance":"3b80ec0e6cc69afd5cadb09e","agent_provenance":{"model":{"value":"gpt-5.6-sol","source":"environment"},"effort":null,"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/1","value":{"created_at":"2026-08-29T05:19:01.093Z","author":"pi-agent","text":"Follow-up CodeRabbit round: stripComment now treats backslashes as escapes only outside single quotes; added a regression where a literal trailing backslash precedes the closing quote and a commented date flag."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-08-29T05:19:01.093Z"}],"before_hash":"54604f9217fef400e847b350cbaa89377110ca4c0d848e75b685eb76222e7225","after_hash":"7b1ff2e700c1866caa750e5ccaa07668a67343ecb44179684632ee0e019732c6","item_hash_version":2}
22 changes: 22 additions & 0 deletions .agents/pm/issues/pm-graph-4glq.toon
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
id: pm-graph-4glq
title: "The changelog gate stamps an untagged version with the current date, so its verdict flips every midnight with no commit"
description: "pm-changelog synthesises a pending release window for a version that has no matching git tag and stamps it with the current UTC date rather than anything derived from the input. The release workflow tags only after npm publish succeeds, and publish has been failing fleet wide since 2026-08-21, so this package currently carries an untagged version and is on that clock dependent path. The exposure is masked today only by a coincidence, because the package version and today's date are the same calendar day, and it fails on any later day with no commit having changed. Verified on pm-ops where the version date and today's date differ, which makes the comparison decisive: an untagged 2026.8.22 generates heading 2026.8.22 - 2026-08-24 without the flag and 2026.8.22 - 2026-08-22 with it. The remedy needs no new code because pm-changelog 2026.8.17 already ships --date-from-version, and zero of twenty packages passed it. Applied to every invocation of the generator in this package rather than only to the scripts whose names begin with changelog, because the release workflow invokes it directly and generation and check must not disagree. Site audit: package.json sites 4 flagged 4; .github/workflows/release.yml sites 1 flagged 1;"
type: Issue
status: open
priority: 1
tags[3]: changelog,gates,release
created_at: "2026-08-24T09:40:05.637Z"
updated_at: "2026-08-27T17:18:40.005Z"
author: "harness:claude-code"
comments[2]{created_at,author,text}:
"2026-08-24T10:03:39.234Z","harness:claude-code","CodeRabbit was right that the linked test only covered the package.json invocation and never reached the direct pm-changelog commands in the release workflow. Added an executable check that does both halves. The static half enumerates every tracked file containing a generator invocation and asserts each file's flagged count is not below its site count, which fails when any single site loses the flag; verified by removing the flag from one of two release.yml sites and watching it report one of two and exit non-zero. The behavioural half runs the generator twice on the same probe version 2026.1.2, deliberately chosen so its calendar date cannot coincide with today, and asserts the heading is 2026.1.2 - 2026-01-02 with the flag and 2026.1.2 - 2026-08-24 without it, so the test states the defect rather than merely asserting the fix."
"2026-08-27T17:18:39.579Z",claude-agent,"The verifier this issue added was a file the repository shipped and nothing executed. It was absent from release:check and from every CI step, in thirteen of the fifteen repositories that carry it, so a later edit could have removed --date-from-version from the workflow and both generation and --check would have agreed on a clock-derived date without anything failing. It is now a named script, the last step of release:check, and its own CI step. Reported by CodeRabbit on unbraind/pm-graph#70.\n\nThe verifier itself gained two fixes in the same pass, also from CodeRabbit. Its static section now balances flags per line rather than per file, which closes two hiding places at once: a single line carrying several invocations where only one is flagged, and an unflagged invocation hiding behind a mention of the flag on a line that invokes nothing. Its behavioural section no longer runs the unflagged control under || true, so a control that fails to produce a heading now fails the gate instead of printing a note while the script exits zero. Both were confirmed by executing the old script against the defect and watching it exit zero."
files[4]{path,scope,note}:
.github/workflows/ci.yml,project,runs the changelog-date verifier as its own step
.github/workflows/release.yml,project,every pm-changelog invocation here now derives the no-tag release date from the calendar version
package.json,project,every pm-changelog invocation here now derives the no-tag release date from the calendar version
Comment thread
unbraind marked this conversation as resolved.
scripts/verify-release-changelog-date.sh,project,"executable proof for the release workflow invocations, which the package.json changelog check never reaches"
tests[2]{command,path,scope,note}:
"npm run changelog:check",package.json,project,regenerates the changelog and compares it; without the flag the heading date is stamped from the clock and the comparison fails on any day after generation
bash scripts/verify-release-changelog-date.sh,scripts/verify-release-changelog-date.sh,project,"exercises the release workflow path that npm run changelog:check does not: asserts every generator invocation in every tracked file carries the flag, and shows the same probe version yielding its own calendar date with the flag and today's date without it"
body: ""
22 changes: 22 additions & 0 deletions .agents/pm/issues/pm-graph-gjpd.toon
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
id: pm-graph-gjpd
title: Unblock PR 70 suffixed CalVer changelog gate
description: "Rebase PR 70 after PR 79, adopt the published suffix-safe pm-changelog release, and execute a same-day suffixed-version regression."
type: Issue
status: closed
priority: 2
tags: []
created_at: "2026-08-29T04:58:36.090Z"
updated_at: "2026-08-29T05:19:01.093Z"
closed_at: "2026-08-29T04:58:39.070Z"
completed_at: "2026-08-29T04:58:39.070Z"
author: pi-agent
comments[2]{created_at,author,text}:
"2026-08-29T04:58:38.384Z",pi-agent,"Updated pm-changelog from 2026.8.17 to published 2026.8.22 and changed the behavioural gate to probe 2026.1.2-1, preserving the suffix while expecting date 2026-01-02."
"2026-08-29T05:19:01.093Z",pi-agent,"Follow-up CodeRabbit round: stripComment now treats backslashes as escapes only outside single quotes; added a regression where a literal trailing backslash precedes the closing quote and a commented date flag."
files[4]{path,scope}:
package-lock.json,project
package.json,project
scripts/verify-release-changelog-date.ts,project
test/verify-release-changelog-date.test.ts,project
close_reason: Suffixed CalVer release path now executable and covered
body: ""
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,9 @@ jobs:
- name: Verify every publish invocation is attested
run: npm run verify:release-publish-attestation

- name: Verify the changelog date is derived from the version
run: npm run verify:release-changelog-date

- name: Verify Bun can install the package graph
run: bun install --no-save

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ jobs:
common=(
--pm-root .agents/pm
--all-release-tags
--release-version-from-package
--release-version-from-package --date-from-version
Comment thread
unbraind marked this conversation as resolved.
--item-url-base https://github.com/unbraind/pm-graph/blob/main/.agents/pm
--respect-item-release
--pm-bin ./node_modules/.bin/pm
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,9 @@ RELEASE_NOTES.md
.env.*
!.env.example
coverage/

# SDK workspace-transaction journals are runtime state, not tracked data.
# pm health fails closed on these (tracked_runtime_cache_files), so committing
# one turns the health gate red; the journal has no value once the transaction
# has landed. Deliberately outside any `pm-cli:` fence, which the CLI rewrites.
.agents/pm/transactions/
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### Fixed

- Unblock PR 70 suffixed CalVer changelog gate ([pm-graph-gjpd](https://github.com/unbraind/pm-graph/blob/main/.agents/pm/issues/pm-graph-gjpd.toon))
- Close PR 79 scalar escape review findings ([pm-graph-ewxc](https://github.com/unbraind/pm-graph/blob/main/.agents/pm/issues/pm-graph-ewxc.toon))

### Other
Expand Down
10 changes: 5 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading