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
9 changes: 9 additions & 0 deletions .agents/pm/history/pm-github-bi6l.jsonl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{"ts":"2026-09-05T18:45:11.664Z","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":{"value":"implementer","source":"argv"},"topic":null,"version":{"value":"2.1.261","source":"probe"}},"op":"create","patch":[{"op":"add","path":"/metadata/id","value":"pm-github-bi6l"},{"op":"add","path":"/metadata/title","value":"Match the release-date control heading as a grammar and escape the probe version"},{"op":"add","path":"/metadata/description","value":"Excluding only a trailing digit still admitted other versions and a date position holding a non-date, and the probe was interpolated into the pattern unescaped so its dots matched any character."},{"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-09-05T18:45:11.664Z"},{"op":"add","path":"/metadata/updated_at","value":"2026-09-05T18:45:11.664Z"},{"op":"add","path":"/metadata/author","value":"claude-orchestrator"}],"before_hash":"3cc22dff72be7b14824654a7a64ea62b04799939b2fee54c1b5f52ca60bf6df0","after_hash":"3abcf4827b9e77f9385274645df1df187ee800a3e16c66dead3156bf84975649","item_hash_version":3,"message":"","event_class":"substantive","record_hash_version":1,"record_hash":"3c49f36fb1781a2d7b6d4566f735bc99551914169e454a551e8ce175681f86da"}
{"ts":"2026-09-05T18:45:12.125Z","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":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:45:12.125Z"},{"op":"add","path":"/metadata/assignee","value":"claude-orchestrator"},{"op":"add","path":"/metadata/claim_principal","value":"claude-orchestrator"}],"before_hash":"3abcf4827b9e77f9385274645df1df187ee800a3e16c66dead3156bf84975649","after_hash":"0bc0bfe8beabf656dbb851b3047b2b13baa837291d054074d5dec4f634c3eed2","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"c033dafc13e6448e81dd5e137354e134605ef9c509e223dd211f61d97cdb8651"}
{"ts":"2026-09-05T18:45:12.166Z","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":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:45:12.166Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"0bc0bfe8beabf656dbb851b3047b2b13baa837291d054074d5dec4f634c3eed2","after_hash":"1fdc3bf20bb3c745e8a4275591787692f989735f51aca7273e17480218a0ad66","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"a360ee338bc6ea2e3108afd1276afaea38888ab2092276b7f4b6bb5eb5cb081e"}
{"ts":"2026-09-05T18:45:12.608Z","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":{"value":"implementer","source":"argv"},"topic":null,"version":{"value":"2.1.261","source":"probe"}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:45:12.608Z"},{"op":"add","path":"/metadata/files","value":[{"path":"scripts/verify-release-changelog-date.sh","scope":"project"}]}],"before_hash":"1fdc3bf20bb3c745e8a4275591787692f989735f51aca7273e17480218a0ad66","after_hash":"c420a7bde3984cfaa6cbf4fbbead5a0f4ed4b3942024bacd66227e6b6fb57011","item_hash_version":3,"event_class":"maintenance","record_hash_version":1,"record_hash":"615eeb411b8bf8182b72493cf1758e09f439c9c962fe719f9a8564b71d80ee46"}
{"ts":"2026-09-05T18:45:13.071Z","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":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:45:13.071Z"},{"op":"add","path":"/metadata/comments","value":[{"created_at":"2026-09-05T18:45:13.071Z","author":"claude-orchestrator","text":"Greptile raised a second P2 on the sibling pm-linear pull request against the boundary that was merged here earlier today, and it applies identically. Excluding only a digit immediately after the probe still accepted a heading for version 2026.1.2.3 and for 2026.1.2-rc1, which are other versions, and 2026.1.2 followed by a dash and garbage, which is a date position holding something that is not a date and is exactly the shape a broken date implementation would emit. The suffix is now matched as a grammar covering the bare version, an optional numeric duplicate-section suffix and an optional ISO date. Separately the probe was interpolated into the pattern unescaped, so its dots matched any character; it is now escaped before use."}]}],"before_hash":"c420a7bde3984cfaa6cbf4fbbead5a0f4ed4b3942024bacd66227e6b6fb57011","after_hash":"64dfd6a5e151aad5d2c0ef7bed999d7de06fa50256c40a4bde71efec66cd2f10","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"9810bc5f63b699a914c9a55d65664fc0b96fdb1667e99c416e113371543d31ac"}
{"ts":"2026-09-05T18:45:13.537Z","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":{"value":"implementer","source":"argv"},"topic":null,"version":{"value":"2.1.261","source":"probe"}},"op":"close","patch":[{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:45:13.537Z"},{"op":"replace","path":"/metadata/status","value":"closed"},{"op":"add","path":"/metadata/closed_at","value":"2026-09-05T18:45:13.525Z"},{"op":"add","path":"/metadata/completed_at","value":"2026-09-05T18:45:13.525Z"},{"op":"add","path":"/metadata/resolution","value":"Bounded the control by a grammar of recognised heading forms and escaped the probe version before interpolation."},{"op":"add","path":"/metadata/expected_result","value":"Other versions, prerelease suffixes and a non-date in the date position are all rejected; bare, suffixed, dated and suffixed-and-dated headings are accepted."},{"op":"add","path":"/metadata/actual_result","value":"All nine cases verified; release:check exits 0."},{"op":"add","path":"/metadata/close_reason","value":"Bounded the control by a grammar of recognised heading forms and escaped the probe version before interpolation."}],"before_hash":"64dfd6a5e151aad5d2c0ef7bed999d7de06fa50256c40a4bde71efec66cd2f10","after_hash":"d51d56dc660767a0172f959869cf0f09c0f6f6d898fc2d471b99edb30c4eb257","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"84d92ed584303d9dc1feb32a9c80d484770150ed512c7d824661e420e889ba2e"}
{"ts":"2026-09-05T18:55:35.554Z","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:55:35.554Z","author":"claude-orchestrator","text":"Greptile raised two further P2s on this pull request and both were right. First, matching the optional date by its digit widths accepts an impossible date such as a month of 13 and a day of 40, and a stale date from any past day, which are precisely the malformed date implementations this control exists to reject. The date is now bound to the actual clock date, because the only date an unflagged run may legitimately carry is today's: deriving the date from the clock is the defect the flag removes. Second, the grammar had no committed tests, and a normal run only ever sees the one heading this checkout's generator emits, so every accept and reject boundary was unexercised. The script now has a self-test mode that runs the matcher against a fixed fourteen case matrix and exits non-zero on disagreement, and the release workflow test invokes it so the pattern stays single sourced rather than being restated in the test and drifting. The test also asserts that specific matrix rows actually ran, so a self-test that silently checked nothing cannot pass. Confirmed non-vacuous by restoring the shape-only date match, which fails the test."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:55:35.554Z"}],"before_hash":"d51d56dc660767a0172f959869cf0f09c0f6f6d898fc2d471b99edb30c4eb257","after_hash":"19d640bf57ebfc634bffadc18f34fd706227f1a78fd7624a400414f678ece6bf","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"da754530c3e386299c5a925029d7381d2484ef16e09d9ba2704d91c3bb36a3e6"}
{"ts":"2026-09-05T18:55:36.196Z","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":{"value":"implementer","source":"argv"},"topic":null,"version":{"value":"2.1.261","source":"probe"}},"op":"update","patch":[{"op":"add","path":"/metadata/files/1","value":{"path":"test/release-workflow.test.ts","scope":"project"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:55:36.196Z"}],"before_hash":"19d640bf57ebfc634bffadc18f34fd706227f1a78fd7624a400414f678ece6bf","after_hash":"0ac1cf997e73e5e31a37a08ff5d51a4c1f4eb35599d03e6cbbc3986d3940e3c0","item_hash_version":3,"event_class":"maintenance","record_hash_version":1,"record_hash":"bceb0403622c61a8c908a356108e4341d0cddb733610f7c3f73c32e2a7f4aa7f"}
{"ts":"2026-09-05T18:55:36.700Z","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":{"value":"implementer","source":"argv"},"topic":null,"version":{"value":"2.1.261","source":"probe"}},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-05T18:55:36.700Z"},{"op":"add","path":"/metadata/tests","value":[{"command":"the changelog-date control's heading grammar accepts and rejects the matrix it claims to","scope":"project","provenance":{"author":"claude-orchestrator","created_at":"2026-09-05T18:55:36.672Z","source_kind":"local_mutation","source_ref":"fix/match-the-date-control-heading-as-a-grammar"}}]}],"before_hash":"0ac1cf997e73e5e31a37a08ff5d51a4c1f4eb35599d03e6cbbc3986d3940e3c0","after_hash":"1d58221a7941b97108ba9a0bc9fd295493521840b1ccc07c31133c75a9479784","item_hash_version":3,"event_class":"maintenance","record_hash_version":1,"record_hash":"e82e273f5a8c11a8da8605bd761e7ab3e2e5d3a25664b2c6d3cc05436c7ac7cf"}
26 changes: 26 additions & 0 deletions .agents/pm/issues/pm-github-bi6l.toon
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
id: pm-github-bi6l
title: Match the release-date control heading as a grammar and escape the probe version
description: "Excluding only a trailing digit still admitted other versions and a date position holding a non-date, and the probe was interpolated into the pattern unescaped so its dots matched any character."
type: Issue
status: closed
priority: 2
tags: []
created_at: "2026-09-05T18:45:11.664Z"
updated_at: "2026-09-05T18:55:36.700Z"
closed_at: "2026-09-05T18:45:13.525Z"
completed_at: "2026-09-05T18:45:13.525Z"
claim_principal: claude-orchestrator
author: claude-orchestrator
resolution: Bounded the control by a grammar of recognised heading forms and escaped the probe version before interpolation.
expected_result: "Other versions, prerelease suffixes and a non-date in the date position are all rejected; bare, suffixed, dated and suffixed-and-dated headings are accepted."
actual_result: "All nine cases verified; release:check exits 0."
comments[2]{created_at,author,text}:
"2026-09-05T18:45:13.071Z",claude-orchestrator,"Greptile raised a second P2 on the sibling pm-linear pull request against the boundary that was merged here earlier today, and it applies identically. Excluding only a digit immediately after the probe still accepted a heading for version 2026.1.2.3 and for 2026.1.2-rc1, which are other versions, and 2026.1.2 followed by a dash and garbage, which is a date position holding something that is not a date and is exactly the shape a broken date implementation would emit. The suffix is now matched as a grammar covering the bare version, an optional numeric duplicate-section suffix and an optional ISO date. Separately the probe was interpolated into the pattern unescaped, so its dots matched any character; it is now escaped before use."
"2026-09-05T18:55:35.554Z",claude-orchestrator,"Greptile raised two further P2s on this pull request and both were right. First, matching the optional date by its digit widths accepts an impossible date such as a month of 13 and a day of 40, and a stale date from any past day, which are precisely the malformed date implementations this control exists to reject. The date is now bound to the actual clock date, because the only date an unflagged run may legitimately carry is today's: deriving the date from the clock is the defect the flag removes. Second, the grammar had no committed tests, and a normal run only ever sees the one heading this checkout's generator emits, so every accept and reject boundary was unexercised. The script now has a self-test mode that runs the matcher against a fixed fourteen case matrix and exits non-zero on disagreement, and the release workflow test invokes it so the pattern stays single sourced rather than being restated in the test and drifting. The test also asserts that specific matrix rows actually ran, so a self-test that silently checked nothing cannot pass. Confirmed non-vacuous by restoring the shape-only date match, which fails the test."
files[2]{path,scope}:
scripts/verify-release-changelog-date.sh,project
test/release-workflow.test.ts,project
tests[1]{command,scope,provenance{author,created_at,source_kind,source_ref}}:
the changelog-date control's heading grammar accepts and rejects the matrix it claims to,project,claude-orchestrator,"2026-09-05T18:55:36.672Z",local_mutation,fix/match-the-date-control-heading-as-a-grammar
close_reason: Bounded the control by a grammar of recognised heading forms and escaped the probe version before interpolation.
body: ""
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## Unreleased

### Fixed

- Match the release-date control heading as a grammar and escape the probe version ([pm-github-bi6l](https://github.com/unbraind/pm-github/blob/main/.agents/pm/issues/pm-github-bi6l.toon))

### 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))
Expand Down
Loading