diff --git a/.agents/pm/history/ops-0c8k.jsonl b/.agents/pm/history/ops-0c8k.jsonl new file mode 100644 index 0000000..6ceb110 --- /dev/null +++ b/.agents/pm/history/ops-0c8k.jsonl @@ -0,0 +1,5 @@ +{"hash_algorithm":"sha256","ts":"2026-09-29T20:07:47.887Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"create","patch":[{"op":"add","path":"/metadata/id","value":"ops-0c8k"},{"op":"add","path":"/metadata/title","value":"Enforce documentation for all runtime modules and internal declarations"},{"op":"add","path":"/metadata/description","value":"The existing selected-surface docstring gate passes 221 declarations across 23 runtime/tooling/template files. A separate read-only TypeScript AST presence census finds 580 documented declarations of 1879 and module docblocks on 22 of 23 files. The denominator includes named functions, classes, interfaces, type aliases, methods and signatures, properties and signatures, constructors, accessors and variable statements. Imports, parameters, tests, dependencies and generated output are excluded. Presence alone does not establish documentation quality. The public and large-body policy introduced by closed ops-073p does not enforce the full internal declaration requirement."},{"op":"add","path":"/metadata/type","value":"Issue"},{"op":"add","path":"/metadata/status","value":"open"},{"op":"add","path":"/metadata/priority","value":1},{"op":"add","path":"/metadata/tags","value":[]},{"op":"add","path":"/metadata/created_at","value":"2026-09-29T20:07:47.887Z"},{"op":"add","path":"/metadata/updated_at","value":"2026-09-29T20:07:47.887Z"},{"op":"add","path":"/metadata/author","value":"codex-coverage-inventory"},{"op":"add","path":"/metadata/estimated_minutes","value":480},{"op":"add","path":"/metadata/acceptance_criteria","value":"Define and enforce the full source module and documentable-declaration denominator; document contracts, invariants, side effects and failures for every declaration including internal APIs; prove missing internal docs fail local and CI checks without exclusions or lowered thresholds; retain explicit compatibility for the existing selected-surface analyzer"},{"op":"add","path":"/metadata/risk","value":"medium"},{"op":"add","path":"/metadata/repro_steps","value":"Run npm run docstring, then compare all authored runtime and tooling declarations against JSDoc presence using an installed TypeScript AST reader."},{"op":"add","path":"/metadata/expected_result","value":"The mandatory gate measures and enforces all authored runtime modules and internal documentable declarations."},{"op":"add","path":"/metadata/actual_result","value":"The selected-surface gate passes 221 declarations while the full presence census finds 580 of 1879 documented declarations and 22 of 23 module docblocks."},{"op":"add","path":"/metadata/component","value":"docstrings"}],"before_hash":"3cc22dff72be7b14824654a7a64ea62b04799939b2fee54c1b5f52ca60bf6df0","after_hash":"d4f4b3d9d4ffb0f257875f86b9763b01e683c3906436d738ed807b4f769bcfc9","item_hash_version":3,"message":"","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"4eba89d2b52b54c1d3aa75975abba6cd4e70822c209bb37f484ca1c7a0134f09"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:36:20.238Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"note_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:36:20.238Z"},{"op":"add","path":"/metadata/notes","value":[{"created_at":"2026-09-29T20:36:20.238Z","author":"codex-coverage-inventory","text":"Coverage review changes add two documented internal functions. Updated independent TypeScript AST presence census over the same 23 runtime/tooling/template modules is 582/1883 declarations and 22/23 module docblocks. The denominator includes named functions, classes, interfaces, aliases, methods/signatures, properties/signatures, constructors/accessors and variable statements. Presence is not semantic documentation quality. Required full coverage remains unmet."}]}],"before_hash":"d4f4b3d9d4ffb0f257875f86b9763b01e683c3906436d738ed807b4f769bcfc9","after_hash":"4a18a749684d2d76a49397549cf600c3beec68f55ba1ca8dbe181b6e02e37e2c","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"f601c02a4b6d4255aa4c41c630b8a6d2bac894ff64e3e55e28d801b10145641f"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:40:19.566Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/actual_result","value":"The selected-surface gate passes 221 declarations while the current full presence census finds 582 of 1883 documented declarations and 22 of 23 module docblocks"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:40:19.566Z"}],"before_hash":"4a18a749684d2d76a49397549cf600c3beec68f55ba1ca8dbe181b6e02e37e2c","after_hash":"206d366b621de119c5742dce5de1c5b4583d54d7d99ce35986ea69e89e5a390e","item_hash_version":3,"message":"Refresh current documentation gap while preserving earlier measurement notes","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"eed0c5b18304f36b5859304df992dcf17497d38595b449471563e351518647e4"} +{"hash_algorithm":"sha256","ts":"2026-09-29T21:00:58.487Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"add","path":"/metadata/notes/1","value":{"created_at":"2026-09-29T21:00:58.468Z","author":"codex-coverage-inventory","text":"Fail-closed coverage evidence adds three documented internal declarations. Current full AST presence denominator: 585/1887 declarations, 22/23 module docblocks over 23 runtime/tooling/template files. Selected 221-declaration gate remains narrower than the required complete scope. No threshold or denominator waiver."}},{"op":"replace","path":"/metadata/actual_result","value":"The selected-surface gate passes 221 declarations while the full presence census finds 585 of 1887 documented declarations and 22 of 23 module docblocks"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T21:00:58.487Z"}],"before_hash":"206d366b621de119c5742dce5de1c5b4583d54d7d99ce35986ea69e89e5a390e","after_hash":"8ad484c5388071c7c779bbcc70405e4a8937a930af0b02b3629e893e30d9bbda","item_hash_version":3,"message":"Refresh independent full documentation denominator","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"1ca819cef0d5d9d8a9e2eb0429cecea05e5a5062f74bb1d52a8e184cdce1ab12"} +{"hash_algorithm":"sha256","ts":"2026-09-29T21:10:47.707Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"add","path":"/metadata/notes/2","value":{"created_at":"2026-09-29T21:10:47.687Z","author":"codex-coverage-inventory","text":"Final assurance boundaries and generated-path/state declarations all have source documentation. Current measured presence is 590/1887 declarations and 22/23 module docblocks. Tests and additional authored documentation obligations still require separate denominator verification; this source census does not establish complete repository documentation compliance."}},{"op":"replace","path":"/metadata/actual_result","value":"The selected-surface gate passes 221 declarations while the complete runtime/tooling/template presence census finds 590 of 1887 documented declarations and 22 of 23 module docblocks"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T21:10:47.707Z"}],"before_hash":"8ad484c5388071c7c779bbcc70405e4a8937a930af0b02b3629e893e30d9bbda","after_hash":"b5f03c0f8fb5e7e95d2142de2c202ec0d0f0f068a9ea991abc914bd1dac398c6","item_hash_version":3,"message":"Record final denominator and preserve full documentation blocker","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"7b2021e4c74c6406af4b97af18f4fe323d5d9850caef3787893fa7433bb2cca9"} diff --git a/.agents/pm/history/ops-cl0o.jsonl b/.agents/pm/history/ops-cl0o.jsonl index 2434156..cd420c7 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -1 +1,57 @@ {"ts":"2026-08-28T14:25:04.891Z","author":"claude","author_source":"asserted","agent_harness":"claude-code","agent_instance":"7405dc9b453c8154184ac8fe","agent_provenance":{"model":null,"effort":{"value":"xhigh","source":"environment"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"create","patch":[{"op":"add","path":"/metadata/id","value":"ops-cl0o"},{"op":"add","path":"/metadata/title","value":"Adding a source file breaks the coverage gate in three places, and none of them says so"},{"op":"add","path":"/metadata/description","value":"The coverage gate enumerates every source file so that a file added without tests cannot pass by being absent from the report. That enumeration is duplicated by hand in three fixture lists inside test/coverage-gate.test.ts (a POSIX stub, a Windows stub, and an explicit array) plus the include list in the package coverage script. Adding one source file therefore requires four coordinated edits, and omitting any of them fails the gate with a coverage threshold error that names a percentage rather than the missing file. Two source files added in this session each hit it."},{"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":["area:release","area:testing","type:defect"]},{"op":"add","path":"/metadata/created_at","value":"2026-08-28T14:25:04.891Z"},{"op":"add","path":"/metadata/updated_at","value":"2026-08-28T14:25:04.891Z"},{"op":"add","path":"/metadata/author","value":"claude"}],"before_hash":"3cc22dff72be7b14824654a7a64ea62b04799939b2fee54c1b5f52ca60bf6df0","after_hash":"2a37bb587f9deba104f7118d6d16a7bd062cdb6c2ef2177adaf163c0df0f6fe6","item_hash_version":2,"message":"","context":{"agent_provenance_outcomes":{"model":{"status":"failed","reason":"resolver_failed","resolver":"claude_session_file","rule_version":"v1"},"version":{"status":"failed","reason":"resolver_failed","resolver":"claude_session_file","rule_version":"v1"}}}} +{"hash_algorithm":"sha256","ts":"2026-09-29T19:54:10.980Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T19:54:10.980Z"},{"op":"add","path":"/metadata/estimated_minutes","value":90},{"op":"add","path":"/metadata/acceptance_criteria","value":"New TypeScript modules require no edits to hard-coded coverage fixture lists; overlapping source roots produce a sorted unique required-file denominator; real c8 accepts a newly tested module and rejects an unimported module by filename at unchanged per-file 100/100/100/100 thresholds; CLI/SDK 2026.9.29 and the lockfile pass package release checks; required exact-head reviews complete before merge"},{"op":"add","path":"/metadata/definition_of_ready","value":"Canonical pm-ops checkout and tracker verified; no other claim or active checkout process; stacked on the existing TSX gate candidate"},{"op":"add","path":"/metadata/risk","value":"low"}],"before_hash":"2a37bb587f9deba104f7118d6d16a7bd062cdb6c2ef2177adaf163c0df0f6fe6","after_hash":"36dfbd7419e855293b36003496a81cb8d6bf2cf6e1046044d01cb2b51d13087f","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"db9e6c0006b11a87f37c13a09e5ac211022857c354077e1e396920be068c0ec4"} +{"hash_algorithm":"sha256","ts":"2026-09-29T19:54:12.169Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"note_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T19:54:12.169Z"},{"op":"add","path":"/metadata/notes","value":[{"created_at":"2026-09-29T19:54:12.169Z","author":"codex-coverage-inventory","text":"Scope: consolidate fixture source reports around the gates emitted include arguments while retaining independent real-c8 pass/fail fixtures. Deduplicate and sort overlapping source roots. Update exact published CLI/SDK pin to 2026.9.29. Depends on parent TSX-gate candidate PR132. Rollout: reviewed source PR only, no publication/deployment. Rollback: revert this change; thresholds/exemptions remain unchanged."}]}],"before_hash":"36dfbd7419e855293b36003496a81cb8d6bf2cf6e1046044d01cb2b51d13087f","after_hash":"67c44fc13916454b334465757b1e30a0f32fa21bcc9978ae8d84b5baaa203fa9","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"c0981827a452bfd31d933296189ef9acf9b9d9064e3ed1483221af107c88270c"} +{"hash_algorithm":"sha256","ts":"2026-09-29T19:54:38.228Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T19:54:38.228Z"},{"op":"add","path":"/metadata/assignee","value":"codex-coverage-inventory"},{"op":"add","path":"/metadata/claim_principal","value":"codex-coverage-inventory"}],"before_hash":"67c44fc13916454b334465757b1e30a0f32fa21bcc9978ae8d84b5baaa203fa9","after_hash":"8f206576bbd7821d6b8329082a179ffeeabac28afec2eeea8fb1926b2995d114","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"8b2accef766ff4125b709037c28d7cb6bbb48d0a5d49b88c3413c44704953506"} +{"hash_algorithm":"sha256","ts":"2026-09-29T19:54:38.291Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T19:54:38.291Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"8f206576bbd7821d6b8329082a179ffeeabac28afec2eeea8fb1926b2995d114","after_hash":"98787fe596d128bde1b300014b946086fab263c62347e97541b71f49aec088a6","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"db0f27e91f80ffd33e6851f2e572c0ebd77f676d3391b078ed6ec8256b2db6f5"} +{"hash_algorithm":"sha256","ts":"2026-09-29T19:58:08.358Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"files_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T19:58:08.358Z"},{"op":"add","path":"/metadata/files","value":[{"path":"package.json","scope":"project","note":"Exact CLI and SDK compatibility pin"},{"path":"scripts/coverage-gate.ts","scope":"project","note":"Deterministic unique source denominator"},{"path":"test/coverage-gate.test.ts","scope":"project","note":"Dynamic runner fixtures and independent real c8 regression"}]}],"before_hash":"98787fe596d128bde1b300014b946086fab263c62347e97541b71f49aec088a6","after_hash":"f3a629f3f87616fbc005713985c9eda721e34be4da86ced754d65cdb7922c69c","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"42dc9884b65c95ece7ed160fd9bac2269c4abf629f09dbba71b611806b171cd2"} +{"hash_algorithm":"sha256","ts":"2026-09-29T19:58:08.974Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"docs_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T19:58:08.974Z"},{"op":"add","path":"/metadata/docs","value":[{"path":"README.md","scope":"project","note":"Coverage denominator and controlled boundary contract"}]}],"before_hash":"f3a629f3f87616fbc005713985c9eda721e34be4da86ced754d65cdb7922c69c","after_hash":"981bf0138cb73cd57371e006c1dc47eafab3ef88a63931a82a6f5f6421df4174","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"2b4a6abe8ad9e028a4d2616ede858f1c040f6329a5683444137759d611476632"} +{"hash_algorithm":"sha256","ts":"2026-09-29T19:58:09.609Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"tests_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T19:58:09.609Z"},{"op":"add","path":"/metadata/tests","value":[{"command":"node --test test/coverage-gate.test.ts","scope":"project","timeout_seconds":120,"pm_context_mode":"none","provenance":{"author":"codex-coverage-inventory","created_at":"2026-09-29T19:58:09.585Z","source_kind":"local_mutation","source_ref":"fix/pm-ops-coverage-source-inventory-2026-09-29"}}]}],"before_hash":"981bf0138cb73cd57371e006c1dc47eafab3ef88a63931a82a6f5f6421df4174","after_hash":"099e5d7dfd74dd30d2147601f7edf86fb075be9f30639907b0d1b9f75bda8618","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"1fe75dc76ecb168f0f812fc0497c9581f13a039aa23be548e1055d83002fcc17"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:01:47.874Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/acceptance_criteria","value":"New TypeScript modules require no edits to hard-coded coverage fixture lists; overlapping source roots produce a sorted unique required-file denominator; real c8 accepts a newly tested module and rejects an unimported module by filename at unchanged per-file 100/100/100/100 thresholds; CLI/SDK 2026.9.29 and the lockfile pass package release checks; required exact-head reviews complete before merge; Every c8 invocation uses the measured repositorys coverage/tmp directory and preserves an enclosing coverage run"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:01:47.874Z"}],"before_hash":"099e5d7dfd74dd30d2147601f7edf86fb075be9f30639907b0d1b9f75bda8618","after_hash":"62c2b7a58b341127edd8593b16a4cddaba491729b47ab342a1ae53a8bb024695","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"4fecac88b9eaba85b13a7ed3f26e75a7934b45fb559988964c5958f6097dc3fb"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:01:48.519Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/2/note","value":"Approved exact CLI SDK development version assertion"},{"op":"replace","path":"/metadata/files/2/path","value":"test/compatibility-floor.test.ts"},{"op":"add","path":"/metadata/files/3","value":{"path":"test/coverage-gate.test.ts","scope":"project","note":"Dynamic runner fixtures and independent real c8 regression"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:01:48.519Z"}],"before_hash":"62c2b7a58b341127edd8593b16a4cddaba491729b47ab342a1ae53a8bb024695","after_hash":"8df090b68334d7ecc6d52722dd9ed1158e46d0351b5a8871982a1a8cc8fc2603","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"746ce6ae09a44cde5605c20426473838ce205e88ad44b1eb2acddbb1687c4583"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:01:49.136Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"note_add","patch":[{"op":"add","path":"/metadata/notes/1","value":{"created_at":"2026-09-29T20:01:49.136Z","author":"codex-coverage-inventory","text":"Red-green evidence: duplicate-root regression failed with four include entries instead of two. Real child c8 initially inherited Node test-worker context and skipped execution; standalone child environment now executes its real assertions. Full release gate then exposed c8 inheriting and cleaning parent NODE_V8_COVERAGE counters, yielding incomplete aggregate coverage. Added a red runner-argument regression and pinned each gate to its repository-owned coverage/tmp. Exact development-version assertion updated alongside the published CLI pin; thresholds unchanged."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:01:49.136Z"}],"before_hash":"8df090b68334d7ecc6d52722dd9ed1158e46d0351b5a8871982a1a8cc8fc2603","after_hash":"75b5ff9dd4e5389e866a2575fdd5d880f9dd440e9eec58976ffb1c73d4d46d93","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"86d74f36f530015289bfecbafd497c4d883382f3a99bed61dd38b3f9561a1012"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:12:55.278Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"note_add","patch":[{"op":"add","path":"/metadata/notes/2","value":{"created_at":"2026-09-29T20:12:55.278Z","author":"codex-coverage-inventory","text":"Validated source candidate: npm ci and exact CLI/SDK 2026.9.29 pin pass. Full release:check with real pm-slack and pm-csv selections passes 456/456 tests, zero skips/TODOs, c8 per-file 100 statements/branches/functions/lines across 23 runtime/tooling/template files, 221 selected documented declarations, zero duplication across 43 sources and zero full/production dependency audit findings. PM-linked none/snapshot acceptance passes 11 tests. The default suite still skips two opt-in live-fleet checks. Independent full documentation presence census is 580/1879 declarations and 22/23 module docblocks, tracked by ops-0c8k. Selected docstring gate success is not full documentation coverage. No publication or deployment is authorized by these measurements."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:12:55.278Z"}],"before_hash":"75b5ff9dd4e5389e866a2575fdd5d880f9dd440e9eec58976ffb1c73d4d46d93","after_hash":"205eb0f7f17f41f74247fa8caca94beaf0cd79082626cdcb604aa685408f9576","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"7f14dd4175b061d0029f0ea5f274bf5b702b3452f0c04fa107345b831e8a633b"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:12:55.962Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:12:55.962Z"},{"op":"replace","path":"/metadata/status","value":"blocked"},{"op":"add","path":"/metadata/blocked_by","value":"ops-0c8k"},{"op":"add","path":"/metadata/blocked_reason","value":"Full internal documentation gate remains incomplete under ops-0c8k. Parent PR132 and new exact-head substantive reviews remain required. Default CI omits two opt-in real-fleet checks; Trivy and ShellCheck are unavailable locally."},{"op":"add","path":"/metadata/repro_steps","value":"Configure overlapping coverageGate.sources entries and run node --test test/coverage-gate.test.ts. A nested c8 invocation previously inherited and cleaned the enclosing raw-counter directory."},{"op":"add","path":"/metadata/expected_result","value":"New source modules are discovered once in deterministic order without fixture list edits, while nested coverage invocations preserve parent data and all required measured gates remain enforced."},{"op":"add","path":"/metadata/actual_result","value":"Source roots are deduplicated and sorted, controlled reports follow include arguments, real c8 rejects unimported modules by filename, and repository-owned counter directories preserve parent data."},{"op":"add","path":"/metadata/dependencies","value":[{"id":"ops-0c8k","kind":"blocked_by","created_at":"2026-09-29T20:12:55.918Z","author":"codex-coverage-inventory","source_kind":"cli:update:blocked_by","author_source":"detected"}]}],"before_hash":"205eb0f7f17f41f74247fa8caca94beaf0cd79082626cdcb604aa685408f9576","after_hash":"daf61ed9214c530d2b70bf201ea363334b93d8fbbe7b12675287c14cb3550192","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"9843e82a48c19168f93b439fcd17b4a7099e436ff8cf2575e62ae40fb5614618"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:12:56.601Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:12:56.601Z"}],"before_hash":"daf61ed9214c530d2b70bf201ea363334b93d8fbbe7b12675287c14cb3550192","after_hash":"384efe5dccb490cda81ca02b6fe43757afcc84206dec82fe044e36fc2b7ebe5c","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"d67b928d2d58aafe7fe9a7d01330f30bc8ef23899c75bf255888efc9190a4341"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:22:04.301Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:22:04.301Z"},{"op":"add","path":"/metadata/assignee","value":"codex-coverage-inventory"},{"op":"add","path":"/metadata/claim_principal","value":"codex-coverage-inventory"}],"before_hash":"384efe5dccb490cda81ca02b6fe43757afcc84206dec82fe044e36fc2b7ebe5c","after_hash":"5535d587fa2d0c50304f66c40f307329c58a69debd9ee186b4ea36ccf7b4fe42","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"c8c7a7350ba812a22fb95eebf5e574999fe967227bb1c14d28e02bd63c524f6a"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:22:04.365Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:22:04.365Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"5535d587fa2d0c50304f66c40f307329c58a69debd9ee186b4ea36ccf7b4fe42","after_hash":"ea2513ac0f2181f7a49764331b9ff341ca32efdee0bb0e39c520be64044fb121","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"a7cf78150c1714b4411254dd85c01d2657f625512ddab4449f01669bffbe596c"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:22:05.110Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"note_add","patch":[{"op":"add","path":"/metadata/notes/3","value":{"created_at":"2026-09-29T20:22:05.110Z","author":"codex-coverage-inventory","text":"Review round at dbb0265: Sourcery inline 4137899586 correctly identified collisions for concurrent or nested invocations within one repository. Upvoted and replied with the disposition. Reclaimed this owner for the fix: per-invocation report/counter directories, successful atomic LCOV publication, cleanup and real concurrent process acceptance. Full documentation and broader gate blockers remain."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:22:05.110Z"}],"before_hash":"ea2513ac0f2181f7a49764331b9ff341ca32efdee0bb0e39c520be64044fb121","after_hash":"951ab866c2fc03eee7dd3cc91b6ba4e84b95517d4d627844853a253973c5b5b8","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"bac2073c78878e723d8f0debd525a8919239d7b3449335ff6290b4a40c0fbe39"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:31:48.367Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/docs/0/note","value":"Stacked coverage source inventory and isolated c8 report candidate"},{"op":"replace","path":"/metadata/docs/0/scope","value":"global"},{"op":"replace","path":"/metadata/docs/0/path","value":"https://github.com/unbraind/pm-ops/pull/134"},{"op":"add","path":"/metadata/docs/1","value":{"path":"README.md","scope":"project","note":"Coverage denominator and controlled boundary contract"}},{"op":"replace","path":"/metadata/actual_result","value":"Source discovery is sorted and unique, package includes match an independent glob inventory, and real c8 rejects unimported modules while unique per-invocation reports and counters preserve parent and peer data"},{"op":"replace","path":"/metadata/acceptance_criteria","value":"New TypeScript modules require no edits to hard-coded coverage fixture lists; overlapping source roots produce a sorted unique required-file denominator; real c8 accepts a newly tested module and rejects an unimported module by filename at unchanged per-file 100/100/100/100 thresholds; CLI/SDK 2026.9.29 and the lockfile pass package release checks; required exact-head reviews complete before merge; Each c8 invocation owns unique reports and raw counters, preserves an enclosing default coverage/tmp, rejects stale reports, and passes two real concurrent processes in the same repository"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:31:48.367Z"}],"before_hash":"951ab866c2fc03eee7dd3cc91b6ba4e84b95517d4d627844853a253973c5b5b8","after_hash":"494a797bd3c2b895108f45e25fe3c714786bae619ede299497ed1c59e2d45d59","item_hash_version":3,"message":"Reconcile source inventory and concurrency acceptance with valid bot findings","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"cfc18f73e28dde6229a2b015e9aefede226e5911a3b6541ebb4fe50f0d655a7b"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:36:19.483Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"add","path":"/metadata/files/4","value":{"path":"CHANGELOG.md","scope":"project","note":"Generated release heading after refreshing existing published tags"}},{"op":"add","path":"/metadata/notes/4","value":{"created_at":"2026-09-29T20:36:19.460Z","author":"codex-coverage-inventory","text":"CI round at dbb0265 ran its coverage jobs successfully but failed changelog:check: a fresh checkout sees the already published v2026.09.29 tag while the local clone had stale tags. Fetching writable pm-ops refs reproduced the failure locally. Regenerated CHANGELOG.md with pm-changelog, changing only the existing Unreleased heading to 2026.9.29 - 2026-09-29. No release or publication is being created. Independent inventory omission proof fails on index.ts. New broader documentation census: 582/1883 declarations and 22/23 module docblocks, still incomplete."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:36:19.483Z"}],"before_hash":"494a797bd3c2b895108f45e25fe3c714786bae619ede299497ed1c59e2d45d59","after_hash":"2ef37f03685f4d7e4226824a3592eab62a242d29440264895ef78c913c5325c6","item_hash_version":3,"message":"Record exact CI failure reproduction and generated changelog repair","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"2ad9092feeefffe93b10637275314a65bd49b4284092d8bd7ac244d572833172"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:38:33.655Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"note_add","patch":[{"op":"add","path":"/metadata/notes/5","value":{"created_at":"2026-09-29T20:38:33.655Z","author":"codex-coverage-inventory","text":"Review fixes validated: each gate owns coverage/run-* reports and raw counters, publishes the last successful LCOV atomically, and removes its own temporary artifacts on success or handled failure. Real c8 passes two concurrent same-repository processes and preserves the default parent coverage/tmp sentinel across successful and failing runs. Independent fast-glob inventory covers the actual package; deliberately omitting index.ts fails its assertion. Full release:check passes 456 tests with zero failures/skips/TODOs and all four c8 columns at 100 per-file across 23 files. PM-linked none/snapshot acceptance passes 11 tests. Full/production audits have zero findings, strict health/validate/history pass. Generated changelog is current after writable tag refresh. All four valid inline findings have been upvoted and acknowledged; exact-head review of the fix remains pending."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:38:33.655Z"}],"before_hash":"2ef37f03685f4d7e4226824a3592eab62a242d29440264895ef78c913c5325c6","after_hash":"ec5229c366c9803415345dbf0fd671cb2038fb662bb1e4e45f70849baca69f2f","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"b90eab4a2700b51a7df1e751cd72c54a8de17104c3833d77ffb66d051b11f28f"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:38:34.433Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/blocked_reason","value":"Required full internal documentation under ops-0c8k remains incomplete at 582/1883 declarations and 22/23 modules. Parent PR132 and exact-head reviews are required. Default CI skips two opt-in real-fleet tests. Local Trivy and ShellCheck remain unavailable. Candidate has not been published or deployed."},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:38:34.433Z"},{"op":"replace","path":"/metadata/status","value":"blocked"}],"before_hash":"ec5229c366c9803415345dbf0fd671cb2038fb662bb1e4e45f70849baca69f2f","after_hash":"9361d526585c97ae31e135387844b2f3c6e6cb24d2c130eeb1704fe52531093a","item_hash_version":3,"message":"Checkpoint validated implementation while mandatory merge blockers remain","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"446b1c40b73370e13e50d1697ab39d226648ec1f293fa46a43abc759aa1622e1"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:38:35.168Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:38:35.168Z"}],"before_hash":"9361d526585c97ae31e135387844b2f3c6e6cb24d2c130eeb1704fe52531093a","after_hash":"4d42abf9c699f51e391018bb6cfb1dae39d957505c1a827d3f3b1a80322fcff4","item_hash_version":3,"message":"Release inactive implementation claim pending independent gates and reviews","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"e2abe396aaa2aea8fcff2821b89d758f73de2bb9406596795241b03e15cb90ef"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:52:11.835Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:52:11.835Z"},{"op":"add","path":"/metadata/assignee","value":"codex-coverage-inventory"},{"op":"add","path":"/metadata/claim_principal","value":"codex-coverage-inventory"}],"before_hash":"4d42abf9c699f51e391018bb6cfb1dae39d957505c1a827d3f3b1a80322fcff4","after_hash":"2c2f2ce3a9c7147b6497675debf53250d77a314e76d6fd79b785c32200140239","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"21ea4593f213d4923c3e58275fbf5c8cc372146786d28ac60b58cdd0e3f58f98"} +{"hash_algorithm":"sha256","ts":"2026-09-29T20:52:11.893Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T20:52:11.893Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"2c2f2ce3a9c7147b6497675debf53250d77a314e76d6fd79b785c32200140239","after_hash":"3da30a890b93148f3d089b41f6e0904f4df328c1c929f1905716fec094bdd001","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"75b1d84fe6cbea45bf31c5735b0482759b804d945ee9ee5dbac2a28e5fd01d26"} +{"hash_algorithm":"sha256","ts":"2026-09-29T21:00:57.731Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/docs/1/note","value":"Stacked coverage source inventory and isolated c8 report candidate"},{"op":"replace","path":"/metadata/docs/1/scope","value":"global"},{"op":"replace","path":"/metadata/docs/1/path","value":"https://github.com/unbraind/pm-ops/pull/134"},{"op":"replace","path":"/metadata/docs/0/note","value":"Published core Bun merge-driver strict-health blocker independently reproduced without extensions"},{"op":"replace","path":"/metadata/docs/0/path","value":"https://github.com/unbraind/pm-cli/issues/1349"},{"op":"add","path":"/metadata/docs/2","value":{"path":"README.md","scope":"project","note":"Coverage denominator and controlled boundary contract"}},{"op":"add","path":"/metadata/notes/6","value":{"created_at":"2026-09-29T21:00:57.706Z","author":"codex-coverage-inventory","text":"Greptile round 2 finding 4138181201 at f801740 is valid: retaining earlier canonical LCOV after a failed run lets the real assurance provider report an old pass after only tests change. Reclaimed for a fail-closed report fix. New real-provider regression resolves 100 from a successful c8 report, changes only a test, observes gate exit 1, then requires the provider to refuse the absent report. It fails against f801740 with Missing expected exception. Focused and PM-linked acceptance now pass 11 tests without skips. Every start and every exit, including preflight, invalidates the canonical report; unexpected failures invalidate through finally. Successful peers retain isolated counters and publish atomically. Full gate validation is running."}},{"op":"replace","path":"/metadata/acceptance_criteria","value":"New TypeScript modules require no edits to hard-coded coverage fixture lists; overlapping source roots produce a sorted unique required-file denominator; real c8 accepts a newly tested module and rejects an unimported module by filename at unchanged per-file 100/100/100/100 thresholds; CLI/SDK 2026.9.29 and the lockfile pass package release checks; required exact-head reviews complete before merge; Each c8 invocation owns unique reports and raw counters, preserves an enclosing default coverage/tmp, rejects stale reports, and passes two real concurrent processes in the same repository; Starting or failing a coverage gate invalidates the shared LCOV so the real assurance provider refuses earlier passing measurements after a test-only failure"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T21:00:57.731Z"}],"before_hash":"3da30a890b93148f3d089b41f6e0904f4df328c1c929f1905716fec094bdd001","after_hash":"1610b82c7d913dfe90844a98334ede0e155d15f0a57de9d8fc26338d70bd43ba","item_hash_version":3,"message":"Define and implement fail-closed assurance evidence after valid review finding","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"a01e8b1019caeeef7cc26dde70ce9c9c2f7bd7c84a70ec43f5b1dd7934bb4026"} +{"hash_algorithm":"sha256","ts":"2026-09-29T21:10:45.798Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":null,"topic":null},"op":"note_add","patch":[{"op":"add","path":"/metadata/notes/7","value":{"created_at":"2026-09-29T21:10:45.798Z","author":"codex-coverage-inventory","text":"Final assurance source passes full release:check: 456 tests, zero failures/skips/TODOs, all four c8 columns at 100 per-file over 23 runtime/tooling/template files. PM-linked none/snapshot acceptance passes 11 tests. The real provider reads 100 from a successful report, then refuses it after only the tests change and fail. Pre-fix f801740 fails this assertion. Broader documentation presence is now 590/1887 declarations and 22/23 modules after documenting every newly introduced internal boundary/path/state declaration. Selected docstrings still checks 221 declarations, not the complete scope. npm packed strict health passes; Bun imports, extension copy/execution and all five adapter configurations pass but strict health reproduces upstream1349 without extensions. No duplicate upstream write or workaround. Exact-head new checks and reviews remain necessary after this final fix."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T21:10:45.798Z"}],"before_hash":"1610b82c7d913dfe90844a98334ede0e155d15f0a57de9d8fc26338d70bd43ba","after_hash":"33630191704a423249edc73d275f701e09c6011d9f442acc34593ebc0bc53f6e","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"3499bb0ccab4f663e783244c98dfacd79698d8dbd16826f7c99107ee17c5abaa"} +{"hash_algorithm":"sha256","ts":"2026-09-29T21:10:46.417Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/actual_result","value":"Sorted unique source scope is independently verified; isolated c8 reports and counters preserve parent/peer data; shared LCOV invalidates on pending or failing runs so actual assurance consumers refuse earlier passing reports"},{"op":"replace","path":"/metadata/blocked_reason","value":"Full documentation under ops-0c8k remains incomplete at 590/1887 declarations and 22/23 modules. Parent PR132 and complete exact-head reviews remain required. Bun strict health fails in the released core under upstream1349. Default CI skips two opt-in fleet checks, and local Trivy/ShellCheck are unavailable. No publication or deployment."},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T21:10:46.417Z"},{"op":"replace","path":"/metadata/status","value":"blocked"}],"before_hash":"33630191704a423249edc73d275f701e09c6011d9f442acc34593ebc0bc53f6e","after_hash":"1adf6ffc8dc6178421a17d219969c8b89ee038671fa4a72f4d67364d9a51b5a3","item_hash_version":3,"message":"Checkpoint verified fail-closed assurance behavior with independent blockers","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"d4023375acb4a7fd0e6b409078d06c4b425f9834b9de59eafb42651073b8b7e2"} +{"hash_algorithm":"sha256","ts":"2026-09-29T21:10:47.067Z","author":"codex-coverage-inventory","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9d2669fa650245f45ec88b84","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"xhigh","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-09-29T21:10:47.067Z"}],"before_hash":"1adf6ffc8dc6178421a17d219969c8b89ee038671fa4a72f4d67364d9a51b5a3","after_hash":"96714333ee8d4e62a6541b478c25e39c94cc1efd5877c86fd4b2e39077f96b48","item_hash_version":3,"message":"Release inactive claim after final implementation verification","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"d0a4c2bd7dffb3bb63215caa8be7d9cf49a85113d48d996da35ce55bbf2b3f7a"} +{"hash_algorithm":"sha256","ts":"2026-10-02T18:30:48.281Z","author":"pi-glm","author_source":"asserted","agent_harness":"pi","agent_model":"glm-5.3:cloud","agent_model_source":"environment","agent_instance":"40ed70d22eaf6c89f6cbbe67","agent_provenance":{"model":{"value":"glm-5.3:cloud","source":"environment"},"effort":null,"role":null,"topic":null},"op":"comment_add","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T18:30:48.281Z"},{"op":"add","path":"/metadata/comments","value":[{"created_at":"2026-10-02T18:30:48.281Z","author":"pi-glm","text":"Land-pass update (pi-glm, orchestrator): PR #134's last open reviewer finding (CodeRabbit 4138483396, readdirSync order nondeterminism in the coverage-gate test assertions) is valid and fixed in b5463c8 - all three directory listings are sorted before deepStrictEqual. Thread resolved. Head rebased onto the pm-ops#132 head f3e66c3 (current main 2026.9.29) and re-verified: focused 11-test coverage suite passes; full npm run release:check passes 456 tests, 0 failures, 2 existing opt-in real-data skips, coverage-gate 23 sources at 100/100/100/100. All bot review bodies and comments now carry reactions; re-review requested from CodeRabbit/Greptile/Gemini on the new head."}]}],"before_hash":"96714333ee8d4e62a6541b478c25e39c94cc1efd5877c86fd4b2e39077f96b48","after_hash":"024e48386fd1a2bf21e0484523c7c90ac7348bdaf3b265db11618ee3a39ab1e0","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"c2573b6647db5b13e8c7f77c923007c087a54cdb49084e3a7365a1a41815d267"} +{"hash_algorithm":"sha256","ts":"2026-10-02T18:30:48.814Z","author":"pi-glm","author_source":"asserted","agent_harness":"pi","agent_model":"glm-5.3:cloud","agent_model_source":"environment","agent_instance":"40ed70d22eaf6c89f6cbbe67","agent_provenance":{"model":{"value":"glm-5.3:cloud","source":"environment"},"effort":null,"role":null,"topic":null},"op":"tests_add","patch":[{"op":"add","path":"/metadata/tests/1","value":{"command":"npm run release:check","scope":"project","provenance":{"author":"pi-glm","created_at":"2026-10-02T18:30:48.783Z","source_kind":"local_mutation","source_ref":"land/pm-ops-134"}}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T18:30:48.814Z"}],"before_hash":"024e48386fd1a2bf21e0484523c7c90ac7348bdaf3b265db11618ee3a39ab1e0","after_hash":"a49a58f5a8bef801fb2d26c5b55e5d232222ed570e25fb847a0c8835718bbef0","item_hash_version":3,"event_class":"maintenance","record_hash_version":1,"record_hash":"85b61b35d642d5243a3aea2afacd495b4c092a4fe26ba643152e99e38b40b5f3"} +{"hash_algorithm":"sha256","ts":"2026-10-02T18:30:49.494Z","author":"pi-glm","author_source":"asserted","agent_harness":"pi","agent_model":"glm-5.3:cloud","agent_model_source":"environment","agent_instance":"40ed70d22eaf6c89f6cbbe67","agent_provenance":{"model":{"value":"glm-5.3:cloud","source":"environment"},"effort":null,"role":null,"topic":null},"op":"tests_add","patch":[{"op":"add","path":"/metadata/tests/2","value":{"command":"node --test test/coverage-gate.test.ts","scope":"project","provenance":{"author":"pi-glm","created_at":"2026-10-02T18:30:49.450Z","source_kind":"local_mutation","source_ref":"land/pm-ops-134"}}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T18:30:49.494Z"}],"before_hash":"a49a58f5a8bef801fb2d26c5b55e5d232222ed570e25fb847a0c8835718bbef0","after_hash":"8f41245e632cfca3ee60af4887c362fb8557f9254ecf37099113f8d1f75b55fb","item_hash_version":3,"event_class":"maintenance","record_hash_version":1,"record_hash":"d897911736cb75d9c726aa519b27093b2c9a264214718c6d1b8cc149698bbdfa"} +{"hash_algorithm":"sha256","ts":"2026-10-02T18:35:24.315Z","author":"pi-glm","author_source":"asserted","agent_harness":"pi","agent_model":"glm-5.3:cloud","agent_model_source":"environment","agent_instance":"40ed70d22eaf6c89f6cbbe67","agent_provenance":{"model":{"value":"glm-5.3:cloud","source":"environment"},"effort":null,"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/1","value":{"created_at":"2026-10-02T18:35:24.315Z","author":"pi-glm","text":"Evidence clarification: the pm test --run wrapper was interrupted by its own execution timeout mid-suite (node --test reports ops.test.ts interrupted at ~89s into that file, trust_refusal on one sub-command), not by a gate failure. Direct verification on the same head: full 'npm run release:check' completed with exit 0 (456 tests, 0 failures, 2 existing opt-in real-data skips; coverage-gate 23 sources at 100/100/100/100), and the focused 'node --test test/coverage-gate.test.ts' passed 11/11."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T18:35:24.315Z"}],"before_hash":"8f41245e632cfca3ee60af4887c362fb8557f9254ecf37099113f8d1f75b55fb","after_hash":"f64c652e1b76980ffa0ff0dceb9b1c56e0618befe34903e60f5d0af420c55f0d","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"f6c0006278460cf7da4bc94181b065cb73ce135df18597825830118c2e34b900"} +{"hash_algorithm":"sha256","ts":"2026-10-02T21:00:56.067Z","author":"pi-grok","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.7","agent_model_source":"environment","agent_instance":"b2e29b56b4df792499683ec2","agent_provenance":{"model":{"value":"grok-4.7","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T21:00:56.067Z"},{"op":"add","path":"/metadata/assignee","value":"pi-grok"},{"op":"add","path":"/metadata/claim_principal","value":"pi-grok"}],"before_hash":"f64c652e1b76980ffa0ff0dceb9b1c56e0618befe34903e60f5d0af420c55f0d","after_hash":"1285dc67cb76498bbf1862a5eee9c97bddada01c62f774f8bccf577c4aedc63e","item_hash_version":3,"message":"Land-pass cubic findings on PR 134","event_class":"substantive","record_hash_version":1,"record_hash":"35ef4571472f3f7b8db265d15cbfff09dd6783028a92fc342ba4926441ba05d4"} +{"hash_algorithm":"sha256","ts":"2026-10-02T21:01:15.869Z","author":"pi-grok","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.7","agent_model_source":"environment","agent_instance":"b2e29b56b4df792499683ec2","agent_provenance":{"model":{"value":"grok-4.7","source":"environment"},"effort":null,"role":null,"topic":null},"op":"note_add","patch":[{"op":"add","path":"/metadata/notes/8","value":{"created_at":"2026-10-02T21:01:15.869Z","author":"pi-grok","text":"Clarification for cubic 4168720012: the 2026-09-29T20:12:55 note describes two different invocations, which is why it says both zero skips and two skips. test/ops.test.ts skips \"real-data: scan on configured pm repos reports all ready\" and \"real-data: verify-release on second configured pm repo passes\" unless PM_OPS_TEST_REPOS names at least two existing package roots. A release:check that sets that variable to real pm-slack and pm-csv roots can report 456 tests and zero skips. The default invocation, including CI and the 2026-10-02 land-pass rerun, leaves PM_OPS_TEST_REPOS unset and therefore skips exactly those two tests: 456 tests, 0 failures, 2 skips. Later notes that say zero skips without that qualifier mean the opted-in selection, not the default suite. Hashed history lines are unchanged; this note is the accurate default-suite count."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T21:01:15.869Z"}],"before_hash":"1285dc67cb76498bbf1862a5eee9c97bddada01c62f774f8bccf577c4aedc63e","after_hash":"033c835da0b89ff17fd94e3866b95ac6d711ed148daf2437117cdb65d41d3f7c","item_hash_version":3,"message":"Clarify default-suite skip count versus opted-in zero-skip runs","event_class":"substantive","record_hash_version":1,"record_hash":"1c8aa0f131bc90c0d06ac557e2e18e8100877c52498ba204acd9f34d721d6eea"} +{"hash_algorithm":"sha256","ts":"2026-10-02T21:02:27.848Z","author":"pi-grok","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.7","agent_model_source":"environment","agent_instance":"b2e29b56b4df792499683ec2","agent_provenance":{"model":{"value":"grok-4.7","source":"environment"},"effort":null,"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/2","value":{"created_at":"2026-10-02T21:02:27.848Z","author":"pi-grok","text":"Cubic review 5395445424 disposition:\n\n4168720012 is valid as an evidence clarification, not a history rewrite. Appended a note that separates the opted-in PM_OPS_TEST_REPOS run (zero skips) from the default suite (exactly two real-data skips in test/ops.test.ts). Hashed note_add lines were kept.\n\n4168720026 is valid. renameSync was the only post-validation failure that escaped failRun, so a locked canonical lcov bypassed the injected exit boundary. A red test failed first with Missing expected exception. The publisher is now caught and routed through failRun(1); production still uses renameSync."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T21:02:27.848Z"}],"before_hash":"033c835da0b89ff17fd94e3866b95ac6d711ed148daf2437117cdb65d41d3f7c","after_hash":"8748f7335596589a2c3c6d5e3d6be5df2f3fb8ab24f7a7361868a53e3ee96483","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"c2f7fa2facab123d78bf147d0aea8875a4face91aff2c08609ab3362b054ec19"} +{"hash_algorithm":"sha256","ts":"2026-10-02T21:03:51.083Z","author":"pi-grok","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.7","agent_model_source":"environment","agent_instance":"b2e29b56b4df792499683ec2","agent_provenance":{"model":{"value":"grok-4.7","source":"environment"},"effort":null,"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/3","value":{"created_at":"2026-10-02T21:03:51.083Z","author":"pi-grok","text":"Focused red-green evidence: node --test --test-name-pattern 'failed canonical report publish' test/coverage-gate.test.ts failed first with Missing expected exception, then passed after the publisher catch. Full node --test test/coverage-gate.test.ts then passed 12/12."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T21:03:51.083Z"}],"before_hash":"8748f7335596589a2c3c6d5e3d6be5df2f3fb8ab24f7a7361868a53e3ee96483","after_hash":"e0e4a82fb34739489e0cbc119c25e504d49bd6234d9e8168225337a7c02e6eda","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"e0a7ba97ad73cc6ea765b3418aaebd81b1726520dbd59e10a59b88fb53931ad9"} +{"hash_algorithm":"sha256","ts":"2026-10-02T21:09:41.775Z","author":"pi-grok","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.7","agent_model_source":"environment","agent_instance":"b2e29b56b4df792499683ec2","agent_provenance":{"model":{"value":"grok-4.7","source":"environment"},"effort":null,"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/4","value":{"created_at":"2026-10-02T21:09:41.775Z","author":"pi-grok","text":"Land-pass gate on the rebased stack: npm run release:check exited 0. node --test reported 457 tests, 455 pass, 0 fail, 2 skipped (the default-suite real-data tests). coverage-gate reported 23 sources at 100/100/100/100. changelog:check, audit:prod, pack:dry-run, and the release verifiers passed. pm health --strict-exit --require-merge-drivers exited 0."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T21:09:41.775Z"}],"before_hash":"e0e4a82fb34739489e0cbc119c25e504d49bd6234d9e8168225337a7c02e6eda","after_hash":"2042cbf040036ae75a54857dc436e050a77090e3b9caa529349d421ec7216a51","item_hash_version":3,"event_class":"substantive","record_hash_version":1,"record_hash":"947bd5e412373245365fbdf87aa2bc0d89f3cb30f50ec27e8debbcfc02e38331"} +{"hash_algorithm":"sha256","ts":"2026-10-02T21:09:42.585Z","author":"pi-grok","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.7","agent_model_source":"environment","agent_instance":"b2e29b56b4df792499683ec2","agent_provenance":{"model":{"value":"grok-4.7","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T21:09:42.585Z"}],"before_hash":"2042cbf040036ae75a54857dc436e050a77090e3b9caa529349d421ec7216a51","after_hash":"f6ee7c1f2dc1c01adbcef62b20396402e75369953c9455d0620bbf9eff7f30d8","item_hash_version":3,"message":"Release land-pass claim after cubic disposition and publish-failure fix","event_class":"maintenance","record_hash_version":1,"record_hash":"a2d57967087c89b072eafe0086f15948dabec06e2787bb9e0d016ad83646f272"} +{"hash_algorithm":"sha256","ts":"2026-10-02T21:16:41.017Z","author":"pi-grok","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.7","agent_model_source":"environment","agent_instance":"b2e29b56b4df792499683ec2","agent_provenance":{"model":{"value":"grok-4.7","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T21:16:41.017Z"},{"op":"add","path":"/metadata/assignee","value":"pi-grok"},{"op":"add","path":"/metadata/claim_principal","value":"pi-grok"}],"before_hash":"f6ee7c1f2dc1c01adbcef62b20396402e75369953c9455d0620bbf9eff7f30d8","after_hash":"8bc9cd1eda92f940fb4be73f2c0e9128e4a0bc97f95a41c31b274ab2def54b4d","item_hash_version":3,"message":"Clarify the 457-test count for CodeRabbit 4169890374","event_class":"substantive","record_hash_version":1,"record_hash":"35ea9f5af92f5b74f67148a98c53267fa8488433d4a920d8e30959934f312417"} +{"hash_algorithm":"sha256","ts":"2026-10-02T21:16:42.259Z","author":"pi-grok","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.7","agent_model_source":"environment","agent_instance":"b2e29b56b4df792499683ec2","agent_provenance":{"model":{"value":"grok-4.7","source":"environment"},"effort":null,"role":null,"topic":null},"op":"comment_edit","patch":[{"op":"replace","path":"/metadata/comments/4/text","value":"Land-pass gate on the rebased stack: npm run release:check exited 0. node --test reported 457 tests, 455 pass, 0 fail, 2 skipped (the default-suite real-data tests). The total is 457 rather than the earlier 456 because this branch adds the failed-publish-path coverage-gate test; the 2 skips are unchanged. coverage-gate reported 23 sources at 100/100/100/100. changelog:check, audit:prod, pack:dry-run, and the release verifiers passed. pm health --strict-exit --require-merge-drivers exited 0."},{"op":"add","path":"/metadata/comments/4/edited_at","value":"2026-10-02T21:16:42.259Z"},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T21:16:42.259Z"}],"before_hash":"8bc9cd1eda92f940fb4be73f2c0e9128e4a0bc97f95a41c31b274ab2def54b4d","after_hash":"5f8a45c21d97b2ba58849cd6fb0bcb0d3ff41ff63e5054c2e2d2f77f57f6d654","item_hash_version":3,"message":"State that the added publish-failure test accounts for 457 versus 456","event_class":"substantive","record_hash_version":1,"record_hash":"6cb677b9c8d790d879e01b58f5ff12f289c7ca477b18b769e115646840163ff8"} +{"hash_algorithm":"sha256","ts":"2026-10-02T21:16:43.240Z","author":"pi-grok","author_source":"asserted","agent_harness":"pi","agent_model":"grok-4.7","agent_model_source":"environment","agent_instance":"b2e29b56b4df792499683ec2","agent_provenance":{"model":{"value":"grok-4.7","source":"environment"},"effort":null,"role":{"value":"implementer","source":"argv"},"topic":null},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T21:16:43.240Z"}],"before_hash":"5f8a45c21d97b2ba58849cd6fb0bcb0d3ff41ff63e5054c2e2d2f77f57f6d654","after_hash":"5ce5bc963f8f8a418394065830255dde13903346a3bf4ca086adc83355f3afdc","item_hash_version":3,"message":"Release after test-count clarification","event_class":"maintenance","record_hash_version":1,"record_hash":"f55dc1a150e6433f4f4e5b576d47b4aee9ef4c18f9610004b5aa29ec575eb21e"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:46:02.294Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:46:02.294Z"},{"op":"add","path":"/metadata/assignee","value":"codex-sol-land"},{"op":"add","path":"/metadata/claim_principal","value":"codex-sol-land"}],"before_hash":"5ce5bc963f8f8a418394065830255dde13903346a3bf4ca086adc83355f3afdc","after_hash":"5e6bf5a0c642882034bf8ae2e428f29d521a529b972cc67203d7c0bb8aec02e1","item_hash_version":3,"message":"Authorized restart of fleet PR preparation; earlier stopped-agent history and dispositions are retained.","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"6652631db154f9d8debfc492c219a405b41ceb55bd2e79be02df463ac0f0c550"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:46:02.803Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:46:02.803Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"5e6bf5a0c642882034bf8ae2e428f29d521a529b972cc67203d7c0bb8aec02e1","after_hash":"e719ff4ac319c1a7b0e5858047f7191786fe7a966eadfb573bb67f407b97fff6","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"93c972cd71e332d04aa0b197ce9f0c3c58f7cd632a3cb4cb39da1b81e4826f59"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:46:03.289Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/5","value":{"created_at":"2026-10-02T23:46:03.289Z","author":"codex-sol-land","text":"Resumed PR #134 from 930f66437a4a7f664891d68a5783b49ed26d41f3. Rebase onto current fix/pm-ops-tsx-quality-gates-2026-09-28 yields cf970b002185c956200fb0a8a9195f85c3bd25b1. All existing bot artifacts and restart-era owner replies inspected; no new actionable finding. Preserve earlier fixes and technical refusals. Verifying unchanged CI gates under the shared heavy lock; no merge, release or closure."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:46:03.289Z"}],"before_hash":"e719ff4ac319c1a7b0e5858047f7191786fe7a966eadfb573bb67f407b97fff6","after_hash":"d1c33f62df4acbf4c0301e01f4fea991684b16b0f32de65e36cc14dc7fe1187d","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"13b0966374da6c44eac801c4d8fbcc43f017c4b2aa9eb8c8fa04183e2680e487"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:46:03.886Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"files_add","patch":[{"op":"replace","path":"/metadata/files/4/note","value":"Dynamic runner fixtures and independent real c8 regression"},{"op":"replace","path":"/metadata/files/4/path","value":"test/coverage-gate.test.ts"},{"op":"replace","path":"/metadata/files/3/note","value":"Approved exact CLI SDK development version assertion"},{"op":"replace","path":"/metadata/files/3/path","value":"test/compatibility-floor.test.ts"},{"op":"replace","path":"/metadata/files/2/note","value":"Deterministic unique source denominator"},{"op":"replace","path":"/metadata/files/2/path","value":"scripts/coverage-gate.ts"},{"op":"replace","path":"/metadata/files/1/note","value":"Exact CLI and SDK compatibility pin"},{"op":"replace","path":"/metadata/files/1/path","value":"package.json"},{"op":"replace","path":"/metadata/files/0/note","value":"Generated release heading after refreshing existing published tags"},{"op":"replace","path":"/metadata/files/0/path","value":"CHANGELOG.md"},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:46:03.886Z"}],"before_hash":"d1c33f62df4acbf4c0301e01f4fea991684b16b0f32de65e36cc14dc7fe1187d","after_hash":"042fbc8fabbb21d346ff026d2783cb458a9f8cb216c98bdcfe746105b2956ac7","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"28018910b016159b0d1f9829622c7e9d7a673c25e4a61c19c33d31ec8e69c270"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:46:04.390Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"docs_add","patch":[{"op":"remove","path":"/metadata/docs/2/note"},{"op":"replace","path":"/metadata/docs/2/path","value":"https://github.com/unbraind/pm-ops/pull/134"},{"op":"add","path":"/metadata/docs/3","value":{"path":"README.md","scope":"project","note":"Coverage denominator and controlled boundary contract"}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:46:04.390Z"}],"before_hash":"042fbc8fabbb21d346ff026d2783cb458a9f8cb216c98bdcfe746105b2956ac7","after_hash":"ee1cd57f0329aa4ee5c4d217ce5bc5ae29c6162cf5d18dd77c5528e347ddd492","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"7082873fa7ef4a10a7719111d44b1cc087d2b14e59748d2b0e1095ff26853bb0"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:48:04.573Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"tests_remove","patch":[{"op":"remove","path":"/metadata/tests/2"},{"op":"replace","path":"/metadata/tests/1/provenance/created_at","value":"2026-10-02T18:30:49.450Z"},{"op":"replace","path":"/metadata/tests/1/command","value":"node --test test/coverage-gate.test.ts"},{"op":"replace","path":"/metadata/tests/0/provenance/source_ref","value":"land/pm-ops-134"},{"op":"replace","path":"/metadata/tests/0/provenance/created_at","value":"2026-10-02T18:30:48.783Z"},{"op":"replace","path":"/metadata/tests/0/provenance/author","value":"pi-glm"},{"op":"remove","path":"/metadata/tests/0/pm_context_mode"},{"op":"remove","path":"/metadata/tests/0/timeout_seconds"},{"op":"replace","path":"/metadata/tests/0/command","value":"npm run release:check"},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:48:04.573Z"}],"before_hash":"ee1cd57f0329aa4ee5c4d217ce5bc5ae29c6162cf5d18dd77c5528e347ddd492","after_hash":"fe53ce3934d7049caa81d1154634b9d53223bf14c3f66c19627ad0ac375a7e2b","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"1545d597fb1441dbedac788a94ac31bbbfdd7b1b2f0cbf61506667134430d5ec"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:48:05.357Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"tests_add","patch":[{"op":"add","path":"/metadata/tests/2","value":{"command":"node --test test/coverage-gate.test.ts","scope":"project","timeout_seconds":120,"pm_context_mode":"none","workspace_context_mode":"snapshot","provenance":{"author":"codex-sol-land","created_at":"2026-10-02T23:48:05.323Z","source_kind":"local_mutation","source_ref":"land/pm-ops-134"}}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:48:05.357Z"}],"before_hash":"fe53ce3934d7049caa81d1154634b9d53223bf14c3f66c19627ad0ac375a7e2b","after_hash":"0fe828e25f00d356487921c4933e7abe233b22b7d6365d4720061a5cc75689b1","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"c31e933c8e763ba445fe56f0e056a41965c23a0ed65a333ab8ca1c4456cc2d77"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:48:05.924Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/6","value":{"created_at":"2026-10-02T23:48:05.924Z","author":"codex-sol-land","text":"Restart focused selection exposed an existing linked-test context incompatibility: none/source is refused by current CLI because source workspace can discover tracker data. Its source/schema counterpart passes 12/12. Preserve that counterpart; replace only the incompatible context entry with the same command in none/snapshot, retaining all history and trust policy. This tightens isolation, changes no gate/test assertion, and enables the intended synthetic acceptance. Full CI gate still needs its own passing run."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:48:05.924Z"}],"before_hash":"0fe828e25f00d356487921c4933e7abe233b22b7d6365d4720061a5cc75689b1","after_hash":"ead7c6f54c548ce42a63f253efc78c34bcf6d7e47e1a459dc9cdf7c4f227248d","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"2433182bd04040dbad23c674144ad0f9391ad693d455d81adcfdcc7065b570fd"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:57:59.601Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/7","value":{"created_at":"2026-10-02T23:57:59.601Z","author":"codex-sol-land","text":"Resumed verification: npm ci, current-base rebase, fresh committed-dist comparison, strict local tracker health with required merge drivers, npm run release:check, and bun install --no-save all passed. Full gate: 457 tests, 455 pass, 2 skips; configured coverage thresholds unchanged. PM-linked test/coverage-gate.test.ts passed. Earlier findings and technical refusals retained; no new source fix was needed in this restart. Exact pushed-head CI and substantive reviewer availability remain separate checks; no merge, release, publication or item closure."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:57:59.601Z"}],"before_hash":"ead7c6f54c548ce42a63f253efc78c34bcf6d7e47e1a459dc9cdf7c4f227248d","after_hash":"ec5b4aea4213832794166d9e541c9b181423357767d57e1647fabce59f4e4b2a","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"f2726d65fba84ddfb3ad085abf8e3343440f99dd88198c5838bcabbc6e2030d0"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:58:00.179Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:58:00.179Z"},{"op":"replace","path":"/metadata/status","value":"blocked"}],"before_hash":"ec5b4aea4213832794166d9e541c9b181423357767d57e1647fabce59f4e4b2a","after_hash":"868d197e71fb231ea7022b7895192b4702d4054bd79ee971a6e02458beb0046d","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"2d8f92f5e8ca75c764d52b79a7923da3d54c966aeaf7c9bc611b71c266abab3c"} +{"hash_algorithm":"sha256","ts":"2026-10-02T23:58:00.687Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-02T23:58:00.687Z"}],"before_hash":"868d197e71fb231ea7022b7895192b4702d4054bd79ee971a6e02458beb0046d","after_hash":"0a997320172466192743196f578931e3a4256fee699d398fd6f10f195bcc05c5","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"bb9d93de09436cd6fbd8bcc976e85707c85ced798eb7c5f5344a44e2723fcb35"} +{"hash_algorithm":"sha256","ts":"2026-10-03T00:16:54.859Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"claim","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-03T00:16:54.859Z"},{"op":"add","path":"/metadata/assignee","value":"codex-sol-land"},{"op":"add","path":"/metadata/claim_principal","value":"codex-sol-land"}],"before_hash":"0a997320172466192743196f578931e3a4256fee699d398fd6f10f195bcc05c5","after_hash":"17be23d3727297d5e5dba63dbfdeee8731d3afc860c773f17b9455799a7417ce","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"7c2bb24562fa50ecf5bf4738abcfc131060f92efa997e17a67775a944f29b3dd"} +{"hash_algorithm":"sha256","ts":"2026-10-03T00:16:55.369Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-03T00:16:55.369Z"},{"op":"replace","path":"/metadata/status","value":"in_progress"}],"before_hash":"17be23d3727297d5e5dba63dbfdeee8731d3afc860c773f17b9455799a7417ce","after_hash":"6131c0009eb659fbd28a8be357506cfdf184b524e5dbd4f07a4ba465422849fb","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"c3540fb3a245701912dcc5f4a1344423c178647bcb8000510f844cb7b340f0a8"} +{"hash_algorithm":"sha256","ts":"2026-10-03T00:16:55.927Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/8","value":{"created_at":"2026-10-03T00:16:55.927Z","author":"codex-sol-land","text":"Parent #132 dependency readback: Cubic 4170740367 was technically refused and resolved. Refused: note is optional in the actual pinned SDK contract. the PM CLI package 2026.9.28 dist/types.d.ts lines 222-228 declare LinkedDoc with required path/scope and note?: string. An absent note is therefore valid, independent of notes on neighboring links. The entry was produced by the PM CLI, and strict health with required merge drivers passes at 000f648. Formatting an optional field differently does not make the tracker record non-canonical or require a placeholder note. This records the parent tracker-schema boundary in the stacked assurance owner; no source change is required. The prior 457-test gate and 100/100/100/100 configured coverage remain the code evidence."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-03T00:16:55.927Z"}],"before_hash":"6131c0009eb659fbd28a8be357506cfdf184b524e5dbd4f07a4ba465422849fb","after_hash":"87341b8d96c6bc14b0ee8be9b21e70218cef2dc3f93dfebd333483f795ab4c9e","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"0cfe6377cafdcdc7de2821a505e9119577a6a2f4a0dab4b2127c12c776034b2d"} +{"hash_algorithm":"sha256","ts":"2026-10-03T00:16:56.454Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"update","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-03T00:16:56.454Z"},{"op":"replace","path":"/metadata/status","value":"blocked"}],"before_hash":"87341b8d96c6bc14b0ee8be9b21e70218cef2dc3f93dfebd333483f795ab4c9e","after_hash":"fe57a8b0c6a1cb6dc09b66409477b0489e4b1ecfbd27318c1cc18225317b52a5","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"891bec45cd3e52114a95bd49132bcd9832c7f7d145169ee9f043d176e88b6596"} +{"hash_algorithm":"sha256","ts":"2026-10-03T00:16:57.120Z","author":"codex-sol-land","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"6edbeed2935f1e5c041f14f3","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-03T00:16:57.120Z"}],"before_hash":"fe57a8b0c6a1cb6dc09b66409477b0489e4b1ecfbd27318c1cc18225317b52a5","after_hash":"049e9aa5154b255ae05968c9b783aeacdbb4a6e6f55a2d0bf40b4327980e3430","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"54b35f2972fd586205e3906d058d9744f6e7421692bcbab4494ccfd8bdff346b"} diff --git a/.agents/pm/issues/ops-0c8k.toon b/.agents/pm/issues/ops-0c8k.toon new file mode 100644 index 0000000..0383406 --- /dev/null +++ b/.agents/pm/issues/ops-0c8k.toon @@ -0,0 +1,22 @@ +id: ops-0c8k +title: Enforce documentation for all runtime modules and internal declarations +description: "The existing selected-surface docstring gate passes 221 declarations across 23 runtime/tooling/template files. A separate read-only TypeScript AST presence census finds 580 documented declarations of 1879 and module docblocks on 22 of 23 files. The denominator includes named functions, classes, interfaces, type aliases, methods and signatures, properties and signatures, constructors, accessors and variable statements. Imports, parameters, tests, dependencies and generated output are excluded. Presence alone does not establish documentation quality. The public and large-body policy introduced by closed ops-073p does not enforce the full internal declaration requirement." +type: Issue +status: open +priority: 1 +tags: [] +created_at: "2026-09-29T20:07:47.887Z" +updated_at: "2026-09-29T21:10:47.707Z" +author: codex-coverage-inventory +estimated_minutes: 480 +acceptance_criteria: "Define and enforce the full source module and documentable-declaration denominator; document contracts, invariants, side effects and failures for every declaration including internal APIs; prove missing internal docs fail local and CI checks without exclusions or lowered thresholds; retain explicit compatibility for the existing selected-surface analyzer" +risk: medium +repro_steps: "Run npm run docstring, then compare all authored runtime and tooling declarations against JSDoc presence using an installed TypeScript AST reader." +expected_result: The mandatory gate measures and enforces all authored runtime modules and internal documentable declarations. +actual_result: The selected-surface gate passes 221 declarations while the complete runtime/tooling/template presence census finds 590 of 1887 documented declarations and 22 of 23 module docblocks +component: docstrings +notes[3]{created_at,author,text}: + "2026-09-29T20:36:20.238Z",codex-coverage-inventory,"Coverage review changes add two documented internal functions. Updated independent TypeScript AST presence census over the same 23 runtime/tooling/template modules is 582/1883 declarations and 22/23 module docblocks. The denominator includes named functions, classes, interfaces, aliases, methods/signatures, properties/signatures, constructors/accessors and variable statements. Presence is not semantic documentation quality. Required full coverage remains unmet." + "2026-09-29T21:00:58.468Z",codex-coverage-inventory,"Fail-closed coverage evidence adds three documented internal declarations. Current full AST presence denominator: 585/1887 declarations, 22/23 module docblocks over 23 runtime/tooling/template files. Selected 221-declaration gate remains narrower than the required complete scope. No threshold or denominator waiver." + "2026-09-29T21:10:47.687Z",codex-coverage-inventory,Final assurance boundaries and generated-path/state declarations all have source documentation. Current measured presence is 590/1887 declarations and 22/23 module docblocks. Tests and additional authored documentation obligations still require separate denominator verification; this source census does not establish complete repository documentation compliance. +body: "" diff --git a/.agents/pm/issues/ops-cl0o.toon b/.agents/pm/issues/ops-cl0o.toon index 6b3d2d9..a0a7f14 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -2,10 +2,103 @@ id: ops-cl0o title: "Adding a source file breaks the coverage gate in three places, and none of them says so" description: "The coverage gate enumerates every source file so that a file added without tests cannot pass by being absent from the report. That enumeration is duplicated by hand in three fixture lists inside test/coverage-gate.test.ts (a POSIX stub, a Windows stub, and an explicit array) plus the include list in the package coverage script. Adding one source file therefore requires four coordinated edits, and omitting any of them fails the gate with a coverage threshold error that names a percentage rather than the missing file. Two source files added in this session each hit it." type: Issue -status: open +status: blocked priority: 2 tags[3]: "area:release","area:testing","type:defect" created_at: "2026-08-28T14:25:04.891Z" -updated_at: "2026-08-28T14:25:04.891Z" +updated_at: "2026-10-03T00:16:57.120Z" author: claude +estimated_minutes: 90 +acceptance_criteria: "New TypeScript modules require no edits to hard-coded coverage fixture lists; overlapping source roots produce a sorted unique required-file denominator; real c8 accepts a newly tested module and rejects an unimported module by filename at unchanged per-file 100/100/100/100 thresholds; CLI/SDK 2026.9.29 and the lockfile pass package release checks; required exact-head reviews complete before merge; Each c8 invocation owns unique reports and raw counters, preserves an enclosing default coverage/tmp, rejects stale reports, and passes two real concurrent processes in the same repository; Starting or failing a coverage gate invalidates the shared LCOV so the real assurance provider refuses earlier passing measurements after a test-only failure" +definition_of_ready: Canonical pm-ops checkout and tracker verified; no other claim or active checkout process; stacked on the existing TSX gate candidate +risk: low +blocked_by: ops-0c8k +blocked_reason: "Full documentation under ops-0c8k remains incomplete at 590/1887 declarations and 22/23 modules. Parent PR132 and complete exact-head reviews remain required. Bun strict health fails in the released core under upstream1349. Default CI skips two opt-in fleet checks, and local Trivy/ShellCheck are unavailable. No publication or deployment." +repro_steps: Configure overlapping coverageGate.sources entries and run node --test test/coverage-gate.test.ts. A nested c8 invocation previously inherited and cleaned the enclosing raw-counter directory. +expected_result: "New source modules are discovered once in deterministic order without fixture list edits, while nested coverage invocations preserve parent data and all required measured gates remain enforced." +actual_result: Sorted unique source scope is independently verified; isolated c8 reports and counters preserve parent/peer data; shared LCOV invalidates on pending or failing runs so actual assurance consumers refuse earlier passing reports +dependencies[1]{id,kind,created_at,author,source_kind,author_source}: + ops-0c8k,blocked_by,"2026-09-29T20:12:55.918Z",codex-coverage-inventory,"cli:update:blocked_by",detected +comments[9]: + - created_at: "2026-10-02T18:30:48.281Z" + author: pi-glm + text: "Land-pass update (pi-glm, orchestrator): PR #134's last open reviewer finding (CodeRabbit 4138483396, readdirSync order nondeterminism in the coverage-gate test assertions) is valid and fixed in b5463c8 - all three directory listings are sorted before deepStrictEqual. Thread resolved. Head rebased onto the pm-ops#132 head f3e66c3 (current main 2026.9.29) and re-verified: focused 11-test coverage suite passes; full npm run release:check passes 456 tests, 0 failures, 2 existing opt-in real-data skips, coverage-gate 23 sources at 100/100/100/100. All bot review bodies and comments now carry reactions; re-review requested from CodeRabbit/Greptile/Gemini on the new head." + - created_at: "2026-10-02T18:35:24.315Z" + author: pi-glm + text: "Evidence clarification: the pm test --run wrapper was interrupted by its own execution timeout mid-suite (node --test reports ops.test.ts interrupted at ~89s into that file, trust_refusal on one sub-command), not by a gate failure. Direct verification on the same head: full 'npm run release:check' completed with exit 0 (456 tests, 0 failures, 2 existing opt-in real-data skips; coverage-gate 23 sources at 100/100/100/100), and the focused 'node --test test/coverage-gate.test.ts' passed 11/11." + - created_at: "2026-10-02T21:02:27.848Z" + author: pi-grok + text: "Cubic review 5395445424 disposition:\n\n4168720012 is valid as an evidence clarification, not a history rewrite. Appended a note that separates the opted-in PM_OPS_TEST_REPOS run (zero skips) from the default suite (exactly two real-data skips in test/ops.test.ts). Hashed note_add lines were kept.\n\n4168720026 is valid. renameSync was the only post-validation failure that escaped failRun, so a locked canonical lcov bypassed the injected exit boundary. A red test failed first with Missing expected exception. The publisher is now caught and routed through failRun(1); production still uses renameSync." + - created_at: "2026-10-02T21:03:51.083Z" + author: pi-grok + text: "Focused red-green evidence: node --test --test-name-pattern 'failed canonical report publish' test/coverage-gate.test.ts failed first with Missing expected exception, then passed after the publisher catch. Full node --test test/coverage-gate.test.ts then passed 12/12." + - created_at: "2026-10-02T21:09:41.775Z" + author: pi-grok + text: "Land-pass gate on the rebased stack: npm run release:check exited 0. node --test reported 457 tests, 455 pass, 0 fail, 2 skipped (the default-suite real-data tests). The total is 457 rather than the earlier 456 because this branch adds the failed-publish-path coverage-gate test; the 2 skips are unchanged. coverage-gate reported 23 sources at 100/100/100/100. changelog:check, audit:prod, pack:dry-run, and the release verifiers passed. pm health --strict-exit --require-merge-drivers exited 0." + edited_at: "2026-10-02T21:16:42.259Z" + - created_at: "2026-10-02T23:46:03.289Z" + author: codex-sol-land + text: "Resumed PR #134 from 930f66437a4a7f664891d68a5783b49ed26d41f3. Rebase onto current fix/pm-ops-tsx-quality-gates-2026-09-28 yields cf970b002185c956200fb0a8a9195f85c3bd25b1. All existing bot artifacts and restart-era owner replies inspected; no new actionable finding. Preserve earlier fixes and technical refusals. Verifying unchanged CI gates under the shared heavy lock; no merge, release or closure." + - created_at: "2026-10-02T23:48:05.924Z" + author: codex-sol-land + text: "Restart focused selection exposed an existing linked-test context incompatibility: none/source is refused by current CLI because source workspace can discover tracker data. Its source/schema counterpart passes 12/12. Preserve that counterpart; replace only the incompatible context entry with the same command in none/snapshot, retaining all history and trust policy. This tightens isolation, changes no gate/test assertion, and enables the intended synthetic acceptance. Full CI gate still needs its own passing run." + - created_at: "2026-10-02T23:57:59.601Z" + author: codex-sol-land + text: "Resumed verification: npm ci, current-base rebase, fresh committed-dist comparison, strict local tracker health with required merge drivers, npm run release:check, and bun install --no-save all passed. Full gate: 457 tests, 455 pass, 2 skips; configured coverage thresholds unchanged. PM-linked test/coverage-gate.test.ts passed. Earlier findings and technical refusals retained; no new source fix was needed in this restart. Exact pushed-head CI and substantive reviewer availability remain separate checks; no merge, release, publication or item closure." + - created_at: "2026-10-03T00:16:55.927Z" + author: codex-sol-land + text: "Parent #132 dependency readback: Cubic 4170740367 was technically refused and resolved. Refused: note is optional in the actual pinned SDK contract. the PM CLI package 2026.9.28 dist/types.d.ts lines 222-228 declare LinkedDoc with required path/scope and note?: string. An absent note is therefore valid, independent of notes on neighboring links. The entry was produced by the PM CLI, and strict health with required merge drivers passes at 000f648. Formatting an optional field differently does not make the tracker record non-canonical or require a placeholder note. This records the parent tracker-schema boundary in the stacked assurance owner; no source change is required. The prior 457-test gate and 100/100/100/100 configured coverage remain the code evidence." +notes[9]{created_at,author,text}: + "2026-09-29T19:54:12.169Z",codex-coverage-inventory,"Scope: consolidate fixture source reports around the gates emitted include arguments while retaining independent real-c8 pass/fail fixtures. Deduplicate and sort overlapping source roots. Update exact published CLI/SDK pin to 2026.9.29. Depends on parent TSX-gate candidate PR132. Rollout: reviewed source PR only, no publication/deployment. Rollback: revert this change; thresholds/exemptions remain unchanged." + "2026-09-29T20:01:49.136Z",codex-coverage-inventory,"Red-green evidence: duplicate-root regression failed with four include entries instead of two. Real child c8 initially inherited Node test-worker context and skipped execution; standalone child environment now executes its real assertions. Full release gate then exposed c8 inheriting and cleaning parent NODE_V8_COVERAGE counters, yielding incomplete aggregate coverage. Added a red runner-argument regression and pinned each gate to its repository-owned coverage/tmp. Exact development-version assertion updated alongside the published CLI pin; thresholds unchanged." + "2026-09-29T20:12:55.278Z",codex-coverage-inventory,"Validated source candidate: npm ci and exact CLI/SDK 2026.9.29 pin pass. Full release:check with real pm-slack and pm-csv selections passes 456/456 tests, zero skips/TODOs, c8 per-file 100 statements/branches/functions/lines across 23 runtime/tooling/template files, 221 selected documented declarations, zero duplication across 43 sources and zero full/production dependency audit findings. PM-linked none/snapshot acceptance passes 11 tests. The default suite still skips two opt-in live-fleet checks. Independent full documentation presence census is 580/1879 declarations and 22/23 module docblocks, tracked by ops-0c8k. Selected docstring gate success is not full documentation coverage. No publication or deployment is authorized by these measurements." + "2026-09-29T20:22:05.110Z",codex-coverage-inventory,"Review round at dbb0265: Sourcery inline 4137899586 correctly identified collisions for concurrent or nested invocations within one repository. Upvoted and replied with the disposition. Reclaimed this owner for the fix: per-invocation report/counter directories, successful atomic LCOV publication, cleanup and real concurrent process acceptance. Full documentation and broader gate blockers remain." + "2026-09-29T20:36:19.460Z",codex-coverage-inventory,"CI round at dbb0265 ran its coverage jobs successfully but failed changelog:check: a fresh checkout sees the already published v2026.09.29 tag while the local clone had stale tags. Fetching writable pm-ops refs reproduced the failure locally. Regenerated CHANGELOG.md with pm-changelog, changing only the existing Unreleased heading to 2026.9.29 - 2026-09-29. No release or publication is being created. Independent inventory omission proof fails on index.ts. New broader documentation census: 582/1883 declarations and 22/23 module docblocks, still incomplete." + "2026-09-29T20:38:33.655Z",codex-coverage-inventory,"Review fixes validated: each gate owns coverage/run-* reports and raw counters, publishes the last successful LCOV atomically, and removes its own temporary artifacts on success or handled failure. Real c8 passes two concurrent same-repository processes and preserves the default parent coverage/tmp sentinel across successful and failing runs. Independent fast-glob inventory covers the actual package; deliberately omitting index.ts fails its assertion. Full release:check passes 456 tests with zero failures/skips/TODOs and all four c8 columns at 100 per-file across 23 files. PM-linked none/snapshot acceptance passes 11 tests. Full/production audits have zero findings, strict health/validate/history pass. Generated changelog is current after writable tag refresh. All four valid inline findings have been upvoted and acknowledged; exact-head review of the fix remains pending." + "2026-09-29T21:00:57.706Z",codex-coverage-inventory,"Greptile round 2 finding 4138181201 at f801740 is valid: retaining earlier canonical LCOV after a failed run lets the real assurance provider report an old pass after only tests change. Reclaimed for a fail-closed report fix. New real-provider regression resolves 100 from a successful c8 report, changes only a test, observes gate exit 1, then requires the provider to refuse the absent report. It fails against f801740 with Missing expected exception. Focused and PM-linked acceptance now pass 11 tests without skips. Every start and every exit, including preflight, invalidates the canonical report; unexpected failures invalidate through finally. Successful peers retain isolated counters and publish atomically. Full gate validation is running." + "2026-09-29T21:10:45.798Z",codex-coverage-inventory,"Final assurance source passes full release:check: 456 tests, zero failures/skips/TODOs, all four c8 columns at 100 per-file over 23 runtime/tooling/template files. PM-linked none/snapshot acceptance passes 11 tests. The real provider reads 100 from a successful report, then refuses it after only the tests change and fail. Pre-fix f801740 fails this assertion. Broader documentation presence is now 590/1887 declarations and 22/23 modules after documenting every newly introduced internal boundary/path/state declaration. Selected docstrings still checks 221 declarations, not the complete scope. npm packed strict health passes; Bun imports, extension copy/execution and all five adapter configurations pass but strict health reproduces upstream1349 without extensions. No duplicate upstream write or workaround. Exact-head new checks and reviews remain necessary after this final fix." + "2026-10-02T21:01:15.869Z",pi-grok,"Clarification for cubic 4168720012: the 2026-09-29T20:12:55 note describes two different invocations, which is why it says both zero skips and two skips. test/ops.test.ts skips \"real-data: scan on configured pm repos reports all ready\" and \"real-data: verify-release on second configured pm repo passes\" unless PM_OPS_TEST_REPOS names at least two existing package roots. A release:check that sets that variable to real pm-slack and pm-csv roots can report 456 tests and zero skips. The default invocation, including CI and the 2026-10-02 land-pass rerun, leaves PM_OPS_TEST_REPOS unset and therefore skips exactly those two tests: 456 tests, 0 failures, 2 skips. Later notes that say zero skips without that qualifier mean the opted-in selection, not the default suite. Hashed history lines are unchanged; this note is the accurate default-suite count." +files[5]{path,scope,note}: + CHANGELOG.md,project,Generated release heading after refreshing existing published tags + package.json,project,Exact CLI and SDK compatibility pin + scripts/coverage-gate.ts,project,Deterministic unique source denominator + test/compatibility-floor.test.ts,project,Approved exact CLI SDK development version assertion + test/coverage-gate.test.ts,project,Dynamic runner fixtures and independent real c8 regression +tests[3]: + - command: "npm run release:check" + scope: project + provenance: + author: pi-glm + created_at: "2026-10-02T18:30:48.783Z" + source_kind: local_mutation + source_ref: land/pm-ops-134 + - command: node --test test/coverage-gate.test.ts + scope: project + provenance: + author: pi-glm + created_at: "2026-10-02T18:30:49.450Z" + source_kind: local_mutation + source_ref: land/pm-ops-134 + - command: node --test test/coverage-gate.test.ts + scope: project + timeout_seconds: 120 + pm_context_mode: none + workspace_context_mode: snapshot + provenance: + author: codex-sol-land + created_at: "2026-10-02T23:48:05.323Z" + source_kind: local_mutation + source_ref: land/pm-ops-134 +docs[4]: + - path: "https://github.com/unbraind/pm-cli/issues/1349" + scope: global + note: Published core Bun merge-driver strict-health blocker independently reproduced without extensions + - path: "https://github.com/unbraind/pm-ops/pull/134" + scope: global + note: Stacked coverage source inventory and isolated c8 report candidate + - path: "https://github.com/unbraind/pm-ops/pull/134" + scope: project + - path: README.md + scope: project + note: Coverage denominator and controlled boundary contract body: "" diff --git a/README.md b/README.md index 252bfbe..7b9f8b7 100644 --- a/README.md +++ b/README.md @@ -399,6 +399,28 @@ The canonical ESLint factory enforces the eight forbidden syntax selectors `TSExportAssignment`) plus the fleet's correctness rules. It ignores generated and dependency output by default; pass `ignores` to add project-specific paths. +## Package coverage gate + +`npm run coverage` discovers this repository's executable `.ts` files from +`coverageGate.sources`, including operational scripts and the launcher template. +Overlapping roots form a sorted, unique file set, which supplies both the c8 +include arguments and the report-presence check. Tests, dependencies, build +output and declaration files are outside the runtime denominator. Thresholds +remain 100% statements, branches, functions and lines for every measured file. +Every invocation uses its own `coverage/run-*` report and counter directory, +so concurrent or nested gates preserve one another's data. After validation, +it atomically publishes `coverage/lcov.info` and removes its temporary directory. +Starting or failing a run invalidates that shared report, so assurance consumers +cannot treat an earlier pass as current after a failed test. Concurrent runs +judge their own fresh reports and preserve peer counters; a failed completion +leaves the shared report unavailable until another success publishes one. + +The gate's controlled runner fixtures derive their reports from the include +arguments, so adding a module requires no fixture-list edits. A separate real +c8 fixture tests a newly imported module and then adds an unimported module: +the latter must fail at the unchanged thresholds and name the missing module. +Controlled fixture reports are never used as package coverage evidence. + ## License MIT © unbrained diff --git a/package-lock.json b/package-lock.json index 91f3bfb..8f45404 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@babel/eslint-parser": "^8.0.5", "@babel/plugin-syntax-typescript": "^8.0.3", "@types/node": "^26.2.0", - "@unbrained/pm-cli": "2026.9.28", + "@unbrained/pm-cli": "2026.9.29", "c8": "^12.0.0", "eslint": "^10.10.0", "fast-glob": "^3.3.3", @@ -1357,9 +1357,9 @@ } }, "node_modules/@unbrained/pm-cli": { - "version": "2026.9.28", - "resolved": "https://registry.npmjs.org/@unbrained/pm-cli/-/pm-cli-2026.9.28.tgz", - "integrity": "sha512-bbyq/FIKMUxnGKJTieG3AVL96tS4l9JUuTgzgAiZTqI7lYyLXytmQFVD1a+2neVQT9+6sVNF8ko2u7DcqztxjQ==", + "version": "2026.9.29", + "resolved": "https://registry.npmjs.org/@unbrained/pm-cli/-/pm-cli-2026.9.29.tgz", + "integrity": "sha512-dkWT7u42PhKVbignagfdvwiLkIIo1pzsX4zetaKuwIXK68yyv6JqnYJ0fndRNNqTCEFUZOx7ArW3USE7f1tg1A==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 56c4a4a..3347b2f 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,7 @@ "@babel/eslint-parser": "^8.0.5", "@babel/plugin-syntax-typescript": "^8.0.3", "@types/node": "^26.2.0", - "@unbrained/pm-cli": "2026.9.28", + "@unbrained/pm-cli": "2026.9.29", "c8": "^12.0.0", "eslint": "^10.10.0", "fast-glob": "^3.3.3", diff --git a/scripts/coverage-gate.ts b/scripts/coverage-gate.ts index e48ecd1..652cbf0 100644 --- a/scripts/coverage-gate.ts +++ b/scripts/coverage-gate.ts @@ -31,8 +31,10 @@ import { spawnSync } from "node:child_process"; import { existsSync, mkdirSync, + mkdtempSync, readdirSync, readFileSync, + renameSync, rmSync, statSync, } from "node:fs"; @@ -96,6 +98,12 @@ interface CoverageGateOptions { readonly spawn?: typeof spawnSync; /** Exit boundary, injectable so tests can assert fail-closed diagnostics. */ readonly exit?: (code: number) => never; + /** + * Canonical report publisher. Tests inject a throwing publisher to prove a + * locked destination still exits through the gate diagnostic instead of an + * uncaught exception. Production uses `renameSync`. + */ + readonly publishReport?: (source: string, destination: string) => void; } const defaultRepoRoot = resolve(import.meta.dirname, ".."); @@ -104,7 +112,25 @@ const defaultRepoRoot = resolve(import.meta.dirname, ".."); export function runCoverageGate(options: CoverageGateOptions = {}): void { const repoRoot = options.repoRoot ?? defaultRepoRoot; const spawn = options.spawn ?? spawnSync; - const exit = options.exit ?? process.exit; + /** Selected termination boundary retains the injected test sentinel or native process exit. */ + const exitBoundary = options.exit ?? process.exit; + /** Production publishes by atomic rename; tests may inject a failing publisher. */ + const publishReport = options.publishReport ?? renameSync; + /** Assurance reads this shared path only after a successful gate publishes it. */ + const canonicalLcovPath = join(repoRoot, "coverage", "lcov.info"); + + /** Refuse stale assurance measurements while this run is pending or failed. */ + function invalidateReport(): void { + rmSync(canonicalLcovPath, { force: true }); + } + + /** Invalidate shared evidence before every terminating failure, including preflight. */ + function exit(code: number): never { + invalidateReport(); + return exitBoundary(code); + } + + invalidateReport(); let manifest: PackageManifest; try { manifest = JSON.parse( @@ -245,9 +271,11 @@ export function runCoverageGate(options: CoverageGateOptions = {}): void { return found; } - const expected = gateConfig.sources.flatMap((source) => + // A directory and one of its descendants may both be configured. Count each + // source once and use deterministic ordering for runner arguments/diagnostics. + const expected = [...new Set(gateConfig.sources.flatMap((source) => collectSources(join(repoRoot, source)) - ); + ))].sort(); const exempt = new Set(gateConfig.ignore ?? []); const required = expected.filter((file) => !exempt.has(file)); @@ -310,120 +338,162 @@ export function runCoverageGate(options: CoverageGateOptions = {}): void { exit(1); } - const lcovPath = join(repoRoot, "coverage", "lcov.info"); - mkdirSync(join(repoRoot, "coverage"), { recursive: true }); - // Delete any previous report first. If this run writes none, a leftover file - // from an earlier, broader run would satisfy the presence check on stale data — - // the gate would pass by reading history rather than by measuring anything. - rmSync(lcovPath, { force: true }); - - const result = spawn( - process.platform === "win32" ? "npx.cmd" : "npx", - [ - "c8", - "--all", - // Scope the report to exactly the files the presence check requires. Passing - // the enumerated paths rather than a directory glob keeps the two in step by - // construction, and keeps test files and tooling out of the percentages even - // when the source root is the repository root. - ...required.flatMap((file) => ["--include", file]), - "--check-coverage", - "--per-file", - "--statements", - String(gateConfig.thresholds.statements), - "--lines", - String(gateConfig.thresholds.lines), - "--branches", - String(gateConfig.thresholds.branches), - "--functions", - String(gateConfig.thresholds.functions), - "--reporter", - "text", - "--reporter", - "lcov", - "--reports-dir", - join(repoRoot, "coverage"), - process.execPath, - "--test", - ...gateConfig.tests, - ], - { - cwd: repoRoot, - stdio: "inherit", - // Pin the timezone so the measurement is reproducible on any machine. - // Code that branches on a timestamp's UTC offset takes different paths under - // a local offset than under UTC, which moves the reported percentage between - // a contributor's machine and CI. A threshold pinned to one machine's number - // then fails on the other for reasons unrelated to the change under review. - env: { ...process.env, TZ: "UTC" }, - }, - ); - - if (result.error) { - console.error( - `coverage-gate: failed to start the test runner: ${result.error.message}`, - ); - exit(1); + /** Generated reports and isolated counters share this repository-local parent. */ + const coverageDirectory = join(repoRoot, "coverage"); + mkdirSync(coverageDirectory, { recursive: true }); + // Both the report and raw counters belong to this invocation. A shared report + // path races even when counters are separate, and a stale canonical report + // must never satisfy this invocation's completeness check. + /** Exclusive invocation directory creation fails if the filesystem cannot allocate it. */ + const runDirectory = mkdtempSync(join(coverageDirectory, "run-")); + /** Fresh report path used for this invocation's completeness decision. */ + const lcovPath = join(runDirectory, "lcov.info"); + /** Only a validated successful publication may survive this invocation's cleanup. */ + let reportPublished = false; + + /** Remove only this invocation's artifacts, preserving every peer run. */ + function cleanupRun(): void { + rmSync(runDirectory, { recursive: true, force: true }); } - // Surface a runner failure before touching the report at all. A failing suite, - // an unmet threshold, or a test file that will not load can each leave the lcov - // output absent or incomplete, and every diagnostic below would then describe a - // coverage-configuration problem the author does not have — burying the test - // failure they need to act on. - if (result.status !== 0) { - exit(result.status ?? 1); + /** Clean before an exit boundary that may terminate without running finally. */ + function failRun(code: number): never { + cleanupRun(); + return exit(code); } - /** - * Source files the run actually reported on, read back from the lcov output. - * - * `SF:` paths are normalised to repository-relative POSIX form so they can be - * compared against the walk. The lcov reporter emits them relative to the - * working directory on Linux, but that is not contractual and Windows runners - * have been seen to emit absolute paths; without normalising, the presence - * check would invert into a permanently red build that blames every source file - * for never loading. - */ - const reported = new Set(); try { - statSync(lcovPath); - for (const line of readFileSync(lcovPath, "utf8").split("\n")) { - if (!line.startsWith("SF:")) continue; - const raw = line.slice(3).trim(); - const abs = isAbsolute(raw) ? raw : join(repoRoot, raw); - reported.add(relative(repoRoot, abs).split(sep).join("/")); - } - } catch { - console.error( - `coverage-gate: no coverage report was written to ${ - relative(repoRoot, lcovPath) - }.`, + const result = spawn( + process.platform === "win32" ? "npx.cmd" : "npx", + [ + "c8", + "--all", + // Scope the report to exactly the files the presence check requires. Passing + // the enumerated paths rather than a directory glob keeps the two in step by + // construction, and keeps test files and generated output out of percentages even + // when the source root is the repository root. + ...required.flatMap((file) => ["--include", file]), + "--check-coverage", + "--per-file", + "--statements", + String(gateConfig.thresholds.statements), + "--lines", + String(gateConfig.thresholds.lines), + "--branches", + String(gateConfig.thresholds.branches), + "--functions", + String(gateConfig.thresholds.functions), + "--reporter", + "text", + "--reporter", + "lcov", + "--reports-dir", + runDirectory, + // Override inherited NODE_V8_COVERAGE so c8 cleans only its own counters. + "--temp-directory", + join(runDirectory, "tmp"), + process.execPath, + "--test", + ...gateConfig.tests, + ], + { + cwd: repoRoot, + stdio: "inherit", + // Pin the timezone so the measurement is reproducible on any machine. + // Code that branches on a timestamp's UTC offset takes different paths under + // a local offset than under UTC, which moves the reported percentage between + // a contributor's machine and CI. A threshold pinned to one machine's number + // then fails on the other for reasons unrelated to the change under review. + env: { ...process.env, TZ: "UTC" }, + }, ); - exit(1); - } - const missing = required.filter((file) => !reported.has(file)); + if (result.error) { + console.error( + `coverage-gate: failed to start the test runner: ${result.error.message}`, + ); + failRun(1); + } - if (missing.length > 0) { - console.error( - [ - "", - `coverage-gate: ${missing.length} source file(s) never loaded during the run and were`, - "omitted from the coverage report, so the reported percentages exclude them entirely:", - ...missing.map((file) => ` - ${file}`), - "", - "Import each file from a test (or exercise it through the CLI entrypoint under test).", - "A file that is genuinely type-only belongs in `coverageGate.ignore` in package.json.", - "", - ].join("\n"), + // Surface a runner failure before touching the report at all. A failing suite, + // an unmet threshold, or a test file that will not load can each leave the lcov + // output absent or incomplete, and every diagnostic below would then describe a + // coverage-configuration problem the author does not have — burying the test + // failure they need to act on. + if (result.status !== 0) { + failRun(result.status ?? 1); + } + + /** + * Source files the run actually reported on, read back from the lcov output. + * + * `SF:` paths are normalised to repository-relative POSIX form so they can be + * compared against the walk. The lcov reporter emits them relative to the + * working directory on Linux, but that is not contractual and Windows runners + * have been seen to emit absolute paths; without normalising, the presence + * check would invert into a permanently red build that blames every source file + * for never loading. + */ + const reported = new Set(); + try { + statSync(lcovPath); + for (const line of readFileSync(lcovPath, "utf8").split("\n")) { + if (!line.startsWith("SF:")) continue; + const raw = line.slice(3).trim(); + const abs = isAbsolute(raw) ? raw : join(repoRoot, raw); + reported.add(relative(repoRoot, abs).split(sep).join("/")); + } + } catch { + console.error( + `coverage-gate: no coverage report was written to ${ + relative(repoRoot, lcovPath) + }.`, + ); + failRun(1); + } + + const missing = required.filter((file) => !reported.has(file)); + + if (missing.length > 0) { + console.error( + [ + "", + `coverage-gate: ${missing.length} source file(s) never loaded during the run and were`, + "omitted from the coverage report, so the reported percentages exclude them entirely:", + ...missing.map((file) => ` - ${file}`), + "", + "Import each file from a test (or exercise it through the CLI entrypoint under test).", + "A file that is genuinely type-only belongs in `coverageGate.ignore` in package.json.", + "", + ].join("\n"), + ); + failRun(1); + } + + // Publish a complete successful report atomically. Concurrent successes may + // replace this convenience report, but every gate judges its own run first. + // A locked destination must still use the gate diagnostic and exit boundary; + // finally invalidates the convenience report when publication did not finish. + try { + publishReport(lcovPath, canonicalLcovPath); + } catch (error) { + console.error( + `coverage-gate: failed to publish the coverage report: ${String(error)}`, + ); + failRun(1); + } + reportPublished = true; + + console.log( + `\ncoverage-gate: ${required.length} source file(s) reported, thresholds met.`, ); - exit(1); + } finally { + // Unexpected exceptions must also fail closed for the assurance consumer. + // A failed concurrent run invalidates the convenience report until another + // successful completion publishes one; peer counters remain untouched. + if (!reportPublished) invalidateReport(); + cleanupRun(); } - - console.log( - `\ncoverage-gate: ${required.length} source file(s) reported, thresholds met.`, - ); } if ( diff --git a/test/compatibility-floor.test.ts b/test/compatibility-floor.test.ts index 7fd1bff..04298ad 100644 --- a/test/compatibility-floor.test.ts +++ b/test/compatibility-floor.test.ts @@ -34,7 +34,7 @@ const releaseWorkflow = readFileSync(resolve(repoRoot, ".github", "workflows", " const CLI = "@unbrained/pm-cli"; const EXACT_VERSION = /^\d+\.\d+\.\d+$/; -const REQUIRED_DEVELOPMENT_VERSION = "2026.9.28"; +const REQUIRED_DEVELOPMENT_VERSION = "2026.9.29"; /** * Two independent systems enforce the pm CLI compatibility floor, and each reads diff --git a/test/coverage-gate.test.ts b/test/coverage-gate.test.ts index 84c3bdc..f45a108 100644 --- a/test/coverage-gate.test.ts +++ b/test/coverage-gate.test.ts @@ -1,17 +1,28 @@ +/** + * Coverage-gate contracts: controlled process/report failures plus a real c8 + * fixture proving that newly authored, unimported modules cannot disappear from + * the measured denominator. Fixture reports never represent release coverage. + */ import assert from "node:assert/strict"; -import { spawnSync, type SpawnSyncReturns } from "node:child_process"; +import { spawn, spawnSync, type SpawnSyncReturns } from "node:child_process"; import { chmodSync, + existsSync, mkdirSync, mkdtempSync, + readFileSync, + readdirSync, rmSync, + symlinkSync, writeFileSync, } from "node:fs"; import { tmpdir } from "node:os"; -import { join, resolve } from "node:path"; +import { basename, dirname, join, resolve } from "node:path"; import test, { after, before } from "node:test"; +import glob from "fast-glob"; import { runCoverageGate } from "../scripts/coverage-gate.ts"; +import { QUALITY_PROVIDER_ID, qualityMeasurementProvider } from "../assurance.ts"; let root: string; @@ -83,11 +94,19 @@ function exit(code: number): never { throw new GateExit(code); } +/** Read every c8 include argument in order, without consulting coverage reports. */ +function includedSources(args: readonly string[]): string[] { + return args.flatMap((arg, index) => arg === "--include" ? [args[index + 1]] : []); +} + /** Write an lcov source-file list for the fixture package. */ -function writeLcov(directory: string, files: readonly string[]): void { - mkdirSync(join(directory, "coverage"), { recursive: true }); +function writeLcov(directory: string, files: readonly string[], args?: readonly string[]): void { + const reportDirectory = args === undefined + ? join(directory, "coverage") + : args[args.indexOf("--reports-dir") + 1]; + mkdirSync(reportDirectory, { recursive: true }); writeFileSync( - join(directory, "coverage", "lcov.info"), + join(reportDirectory, "lcov.info"), `${files.map((file) => `SF:${file}\nend_of_record`).join("\n")}\n`, ); } @@ -106,7 +125,7 @@ test("coverage gate accepts a complete report and forwards all four exact thresh writeLcov(directory, [ "src/index.ts", resolve(directory, "src/nested/worker.ts"), - ]); + ], args); return spawnResult(); }) as unknown as typeof spawnSync; @@ -118,40 +137,145 @@ test("coverage gate accepts a complete report and forwards all four exact thresh assert.strictEqual(calls[0].args[index + 1], "100"); } assert.ok(calls[0].args.includes("--per-file")); + const reportDirectory = calls[0].args[calls[0].args.indexOf("--reports-dir") + 1]; + assert.strictEqual(dirname(reportDirectory), join(directory, "coverage")); + assert.match(basename(reportDirectory), /^run-/); + assert.strictEqual( + calls[0].args[calls[0].args.indexOf("--temp-directory") + 1], + join(reportDirectory, "tmp"), + "nested c8 must not clean the parent run's inherited raw-counter directory", + ); assert.deepStrictEqual( calls[0].args.filter((arg) => arg === "--include").length, 2, ); }); -test("coverage gate defaults to its package root and native process boundaries", () => { +test("overlapping source roots produce one sorted include per source file", () => { + const directory = fixture("overlapping-sources", { + sources: ["src/nested", "src", "src/index.ts"], + tests: [], + thresholds: { statements: 100, lines: 100, branches: 100, functions: 100 }, + }); + const spawn = ((_command: string, args: readonly string[]) => { + const included = includedSources(args); + assert.deepStrictEqual(included, ["src/index.ts", "src/nested/worker.ts"]); + writeLcov(directory, included, args); + return spawnResult(); + }) as unknown as typeof spawnSync; + runCoverageGate({ repoRoot: directory, spawn, exit }); +}); + +test("real c8 discovers newly tested modules and rejects an unimported module by filename", async () => { + const directory = fixture("real-c8", { + sources: ["src", "src/nested"], + tests: ["test/complete.test.ts"], + thresholds: { statements: 100, lines: 100, branches: 100, functions: 100 }, + }); const packageRoot = resolve(import.meta.dirname, ".."); - const spawn = (() => { - writeLcov(packageRoot, [ - "index.ts", - "attestation.ts", - "shell-scan.ts", - "docstrings.ts", - "assurance.ts", - "invocation-audit.ts", - "merge-driver.ts", - "merge-driver-prepare.ts", - "templates/prepare-merge-driver.ts", - "eslint.ts", - "duplication.ts", - "scripts/coverage-gate.ts", - "scripts/lint.ts", - "scripts/duplication-gate.ts", - "scripts/docstring-gate.ts", - "scripts/main-invocation.ts", - "scripts/prepare-merge-driver.ts", - "scripts/shell-command-scan.ts", - "scripts/verify-release-changelog-date.ts", - "scripts/verify-release-completeness.ts", - "scripts/verify-release-publish-attestation.ts", - "lifecycle-policy.ts", - "scripts/verify-lifecycle-policy.ts", - ]); + symlinkSync(join(packageRoot, "node_modules"), join(directory, "node_modules"), "junction"); + mkdirSync(join(directory, "test")); + writeFileSync(join(directory, "src", "new-file.ts"), "export const added = 3;\n"); + writeFileSync(join(directory, "test", "complete.test.ts"), [ + 'import assert from "node:assert/strict";', + 'import test from "node:test";', + 'import { value } from "../src/index.ts";', + 'import { worker } from "../src/nested/worker.ts";', + 'import { added } from "../src/new-file.ts";', + 'test("executes every module", () => assert.equal(value + worker + added, 6));', + "", + ].join("\n")); + const script = resolve(packageRoot, "scripts/coverage-gate.ts"); + const env = { ...process.env }; + // This is a separate test run. Node otherwise treats its inherited test-worker + // marker as recursive node:test invocation and silently refuses to run files. + delete env.NODE_TEST_CONTEXT; + const parentCounters = join(directory, "coverage", "tmp"); + mkdirSync(parentCounters, { recursive: true }); + const sentinel = join(parentCounters, "parent-owned.txt"); + writeFileSync(sentinel, "preserve parent counters"); + env.NODE_V8_COVERAGE = parentCounters; + /** Execute a standalone real c8 gate with the same isolated consumer context. */ + function runFixture(): SpawnSyncReturns { + return spawnSync(process.execPath, [script, directory], { + cwd: directory, + encoding: "utf8", + timeout: 30_000, + env, + }); + } + const complete = runFixture(); + assert.strictEqual(complete.status, 0, `${complete.stdout}\n${complete.stderr}`); + assert.match(complete.stdout, /3 source file\(s\) reported/); + assert.strictEqual(readFileSync(sentinel, "utf8"), "preserve parent counters"); + + const concurrent = await Promise.all([0, 1].map(() => new Promise<{ + status: number | null; stdout: string; stderr: string; + }>((resolveResult, reject) => { + const child = spawn(process.execPath, [script, directory], { cwd: directory, env, timeout: 30_000 }); + let stdout = ""; + let stderr = ""; + child.stdout.setEncoding("utf8").on("data", (data: string) => { stdout += data; }); + child.stderr.setEncoding("utf8").on("data", (data: string) => { stderr += data; }); + child.once("error", reject); + child.once("close", (status) => resolveResult({ status, stdout, stderr })); + }))); + for (const result of concurrent) { + assert.strictEqual(result.status, 0, `${result.stdout}\n${result.stderr}`); + assert.match(result.stdout, /3 source file\(s\) reported/); + } + assert.deepStrictEqual(readdirSync(join(directory, "coverage")).sort(), ["lcov.info", "tmp"]); + + const measurementContext = { + provider: QUALITY_PROVIDER_ID, + key: "coverage-percent", + parameters: { dimension: "lines" }, + trigger: "ci", + pm_root: join(directory, ".agents", "pm"), + repo_root: directory, + }; + const passingMeasurement = await qualityMeasurementProvider.resolve(measurementContext); + assert.strictEqual(passingMeasurement.value, 100); + const testPath = join(directory, "test", "complete.test.ts"); + const passingTests = readFileSync(testPath, "utf8"); + writeFileSync(testPath, `${passingTests}\ntest("changed test fails", () => assert.fail("synthetic test failure"));\n`); + const failedTests = runFixture(); + assert.strictEqual(failedTests.status, 1, `${failedTests.stdout}\n${failedTests.stderr}`); + assert.match(failedTests.stdout, /synthetic test failure/); + assert.throws(() => qualityMeasurementProvider.resolve(measurementContext), /coverage report not found/); + assert.deepStrictEqual(readdirSync(join(directory, "coverage")).sort(), ["tmp"]); + writeFileSync(testPath, passingTests); + + writeFileSync(join(directory, "src", "unimported.ts"), "export const omitted = 4;\n"); + const incomplete = runFixture(); + assert.strictEqual(incomplete.status, 1, `${incomplete.stdout}\n${incomplete.stderr}`); + assert.match(`${incomplete.stdout}\n${incomplete.stderr}`, /unimported\.ts/); + assert.match(incomplete.stderr, /does not meet threshold \(100%\) for src\/unimported\.ts/); + assert.strictEqual(readFileSync(sentinel, "utf8"), "preserve parent counters"); + assert.deepStrictEqual(readdirSync(join(directory, "coverage")).sort(), ["tmp"]); +}); + +test("coverage gate defaults to its package root and includes the independent package inventory", () => { + const packageRoot = resolve(import.meta.dirname, ".."); + // The package denominator comes from a different glob engine, without reading + // coverageGate.sources or reusing the gate's recursive collector. This covers + // runtime code, release tooling, and shipped TypeScript templates, while + // excluding tests, declarations, dependencies, generated output, and metadata. + const inventory = glob.sync("**/*.ts", { + cwd: packageRoot, + dot: true, + followSymbolicLinks: false, + ignore: [ + "**/*.d.ts", + "**/{node_modules,dist,dist-test,coverage,test,tests,public,.agents,.git,.github}/**", + ], + }).sort(); + assert.ok(inventory.length > 0, "the independent source inventory must be nonempty"); + const spawn = ((_command: string, args: readonly string[]) => { + const included = includedSources(args); + assert.deepStrictEqual(included, inventory, + "every independently discovered authored source must enter c8's denominator"); + writeLcov(packageRoot, included, args); return spawnResult(); }) as unknown as typeof spawnSync; try { @@ -169,16 +293,22 @@ test("coverage gate direct entrypoint executes against an explicit package root" }); const bin = join(directory, "bin"); mkdirSync(bin, { recursive: true }); + writeFileSync(join(bin, "report.ts"), [ + 'import { mkdirSync, writeFileSync } from "node:fs";', + 'import { join } from "node:path";', + 'const args = process.argv.slice(2);', + 'const files = args.flatMap((arg, index) => arg === "--include" ? [args[index + 1]] : []);', + 'const directory = args[args.indexOf("--reports-dir") + 1];', + 'mkdirSync(directory, { recursive: true });', + 'writeFileSync(join(directory, "lcov.info"), files.map((file) => `SF:${file}\\nend_of_record`).join("\\n") + "\\n");', + "", + ].join("\n")); if (process.platform === "win32") { - writeFileSync( - join(bin, "npx.cmd"), - `@echo off\r\nmkdir coverage 2>nul\r\n(echo SF:src/index.ts& echo end_of_record)>coverage\\lcov.info\r\n`, - ); + writeFileSync(join(bin, "npx.cmd"), + `@"${process.execPath}" "%~dp0report.ts" %*\r\n`); } else { - writeFileSync( - join(bin, "npx"), - "#!/usr/bin/env sh\nmkdir -p coverage\nprintf 'SF:src/index.ts\\nend_of_record\\n' > coverage/lcov.info\n", - ); + writeFileSync(join(bin, "npx"), + `#!/usr/bin/env sh\n"${process.execPath}" "${join(bin, "report.ts")}" "$@"\n`); chmodSync(join(bin, "npx"), 0o755); } const result = spawnSync(process.execPath, [ @@ -197,19 +327,6 @@ test("coverage gate direct entrypoint executes against an explicit package root" assert.strictEqual(result.status, 0, result.stderr); assert.match(result.stdout, /1 source file\(s\) reported/); - if (process.platform === "win32") { - writeFileSync( - join(bin, "npx.cmd"), - `@echo off\r\nmkdir coverage 2>nul\r\n(echo SF:index.ts& echo end_of_record& echo SF:attestation.ts& echo end_of_record& echo SF:shell-scan.ts& echo end_of_record& echo SF:docstrings.ts& echo end_of_record& echo SF:assurance.ts& echo end_of_record& echo SF:invocation-audit.ts& echo end_of_record& echo SF:merge-driver.ts& echo end_of_record& echo SF:merge-driver-prepare.ts& echo end_of_record& echo SF:templates/prepare-merge-driver.ts& echo end_of_record& echo SF:eslint.ts& echo end_of_record& echo SF:duplication.ts& echo end_of_record& echo SF:scripts/coverage-gate.ts& echo end_of_record& echo SF:scripts/lint.ts& echo end_of_record& echo SF:scripts/duplication-gate.ts& echo end_of_record& echo SF:scripts/docstring-gate.ts& echo end_of_record& echo SF:scripts/main-invocation.ts& echo end_of_record& echo SF:scripts/prepare-merge-driver.ts& echo end_of_record& echo SF:scripts/shell-command-scan.ts& echo end_of_record& echo SF:scripts/verify-release-changelog-date.ts& echo end_of_record& echo SF:scripts/verify-release-completeness.ts& echo end_of_record& echo SF:scripts/verify-release-publish-attestation.ts& echo end_of_record& echo SF:lifecycle-policy.ts& echo end_of_record& echo SF:scripts/verify-lifecycle-policy.ts& echo end_of_record)>coverage\\lcov.info\r\n`, - - ); - } else { - writeFileSync( - join(bin, "npx"), - "#!/usr/bin/env sh\nmkdir -p coverage\nprintf 'SF:index.ts\\nend_of_record\\nSF:attestation.ts\\nend_of_record\\nSF:shell-scan.ts\\nend_of_record\\nSF:docstrings.ts\\nend_of_record\\nSF:assurance.ts\\nend_of_record\\nSF:invocation-audit.ts\\nend_of_record\\nSF:merge-driver.ts\\nend_of_record\\nSF:merge-driver-prepare.ts\\nend_of_record\\nSF:templates/prepare-merge-driver.ts\\nend_of_record\\nSF:eslint.ts\\nend_of_record\\nSF:duplication.ts\\nend_of_record\\nSF:scripts/coverage-gate.ts\\nend_of_record\\nSF:scripts/lint.ts\\nend_of_record\\nSF:scripts/duplication-gate.ts\\nend_of_record\\nSF:scripts/docstring-gate.ts\\nend_of_record\\nSF:scripts/main-invocation.ts\\nend_of_record\\nSF:scripts/prepare-merge-driver.ts\\nend_of_record\\nSF:scripts/shell-command-scan.ts\\nend_of_record\\nSF:scripts/verify-release-changelog-date.ts\\nend_of_record\\nSF:scripts/verify-release-completeness.ts\\nend_of_record\\nSF:scripts/verify-release-publish-attestation.ts\\nend_of_record\\nSF:lifecycle-policy.ts\\nend_of_record\\nSF:scripts/verify-lifecycle-policy.ts\\nend_of_record\\n' > coverage/lcov.info\n", - - ); - } const packageRoot = resolve(import.meta.dirname, ".."); try { const defaultRoot = spawnSync(process.execPath, [ @@ -302,6 +419,35 @@ test("coverage gate diagnoses unreadable and malformed package manifests", (cont assertSingleDiagnostic(messages, before, /could not read package\.json/); }); +test("coverage gate routes a failed canonical report publish through the exit boundary", (context) => { + const directory = fixture("publish-failure"); + const messages: string[] = []; + context.mock.method(console, "error", (...args: unknown[]) => { + messages.push(args.map(String).join(" ")); + }); + const spawn = ((_command: string, args: readonly string[]) => { + writeLcov(directory, ["src/index.ts", "src/nested/worker.ts"], args); + return spawnResult(); + }) as unknown as typeof spawnSync; + assert.throws( + () => runCoverageGate({ + repoRoot: directory, + spawn, + exit, + publishReport: () => { + throw new Error("EPERM: coverage/lcov.info is locked"); + }, + }), + (error: unknown) => error instanceof GateExit && error.code === 1, + ); + assert.match(messages.join("\n"), /failed to publish the coverage report: Error: EPERM: coverage\/lcov.info is locked/); + assert.strictEqual(existsSync(join(directory, "coverage", "lcov.info")), false); + assert.deepStrictEqual( + readdirSync(join(directory, "coverage")).filter((name) => name.startsWith("run-")), + [], + ); +}); + test("coverage gate rejects runner launch failures and non-zero test or threshold results", (context) => { context.mock.method(console, "error", () => undefined); const directory = fixture("runner-failures"); @@ -335,6 +481,7 @@ test("coverage gate rejects absent and incomplete lcov reports", (context) => { ); const absent = fixture("absent-report"); + writeLcov(absent, ["src/index.ts", "src/nested/worker.ts"]); const noReport = (() => spawnResult()) as unknown as typeof spawnSync; const before = messages.length; assert.throws( @@ -342,10 +489,11 @@ test("coverage gate rejects absent and incomplete lcov reports", (context) => { GateExit, ); assertSingleDiagnostic(messages, before, /no coverage report/); + assert.deepStrictEqual(readdirSync(join(absent, "coverage")), []); const incomplete = fixture("incomplete-report"); - const omitted = (() => { - writeLcov(incomplete, ["src/index.ts"]); + const omitted = ((_command: string, args: readonly string[]) => { + writeLcov(incomplete, ["src/index.ts"], args); return spawnResult(); }) as unknown as typeof spawnSync; const incompleteBefore = messages.length; @@ -354,6 +502,7 @@ test("coverage gate rejects absent and incomplete lcov reports", (context) => { GateExit, ); assertSingleDiagnostic(messages, incompleteBefore, /never loaded during the run/); + assert.deepStrictEqual(readdirSync(join(incomplete, "coverage")), []); }); test("coverage gate verifies type-only ignores against effective compiler output", (context) => { @@ -441,7 +590,7 @@ test("coverage gate verifies type-only ignores against effective compiler output "/** docs */\n// erased\nexport {};\n", ); let calls = 0; - const complete = (() => { + const complete = ((_command: string, args: readonly string[]) => { calls += 1; if (calls === 1) { return spawnResult({ @@ -450,7 +599,7 @@ test("coverage gate verifies type-only ignores against effective compiler output }), }); } - writeLcov(typeOnly, ["src/index.ts"]); + writeLcov(typeOnly, ["src/index.ts"], args); return spawnResult(); }) as unknown as typeof spawnSync; runCoverageGate({ repoRoot: typeOnly, spawn: complete, exit }); @@ -462,12 +611,12 @@ test("coverage gate verifies type-only ignores against effective compiler output "export {};\n", ); let defaultCalls = 0; - const defaultPaths = (() => { + const defaultPaths = ((_command: string, args: readonly string[]) => { defaultCalls += 1; if (defaultCalls === 1) { return spawnResult({ stdout: JSON.stringify({ compilerOptions: {} }) }); } - writeLcov(defaultEmit, ["src/index.ts"]); + writeLcov(defaultEmit, ["src/index.ts"], args); return spawnResult(); }) as unknown as typeof spawnSync; runCoverageGate({ repoRoot: defaultEmit, spawn: defaultPaths, exit }); @@ -486,12 +635,12 @@ test("coverage gate honors custom skipped directories and Windows launcher selec writeFileSync(join(directory, "dist", "src", "types-only.js"), "export {};\n"); const platform = Object.getOwnPropertyDescriptor(process, "platform"); const commands: string[] = []; - const spawn = ((command: string) => { + const spawn = ((command: string, args: readonly string[]) => { commands.push(command); if (commands.length === 1) { return spawnResult({ stdout: JSON.stringify({ compilerOptions: { outDir: "dist", rootDir: "." } }) }); } - writeLcov(directory, ["src/index.ts"]); + writeLcov(directory, ["src/index.ts"], args); return spawnResult(); }) as unknown as typeof spawnSync; Object.defineProperty(process, "platform", { ...platform, value: "win32" });