From 8016fcbb3840043a00c88617449cb13ea4cecbdf Mon Sep 17 00:00:00 2001 From: unbraind <1153461+unbraind@users.noreply.github.com> Date: Tue, 29 Sep 2026 22:14:41 +0200 Subject: [PATCH 01/11] Keep the coverage source inventory unique and preserve nested run counters Deduplicate and sort source roots before forming c8 includes and checking reported file presence. Replace three hard-coded fixture inventories with reports derived from runner arguments. Independent real-c8 fixtures verify new-module discovery, unimported-file failure and preservation of parent data. Pin c8 raw counters to the measured repository instead of inheriting a parent NODE_V8_COVERAGE directory that c8 cleans. Update the approved CLI/SDK pin and lockfile to published 2026.9.29 without changing coverage thresholds/exemptions. Validation: 456 tests, zero skips with real pm-slack/pm-csv selections; c8 reports per-file 100 statements/branches/functions/lines over 23 runtime and tooling files. PM-linked snapshot checks pass 11 tests. npm ci, types, lint, duplication, selected docstrings, production/full audits and release gates pass. ops-cl0o remains blocked for full internal documentation (ops-0c8k), default CI opt-in skips and required reviews. No publication or deployment is included. --- .agents/pm/history/ops-0c8k.jsonl | 1 + .agents/pm/history/ops-cl0o.jsonl | 13 +++ .agents/pm/issues/ops-0c8k.toon | 18 ++++ .agents/pm/issues/ops-cl0o.toon | 28 +++++- README.md | 17 ++++ package-lock.json | 8 +- package.json | 2 +- scripts/coverage-gate.ts | 10 +- test/compatibility-floor.test.ts | 2 +- test/coverage-gate.test.ts | 146 ++++++++++++++++++++---------- 10 files changed, 188 insertions(+), 57 deletions(-) create mode 100644 .agents/pm/history/ops-0c8k.jsonl create mode 100644 .agents/pm/issues/ops-0c8k.toon diff --git a/.agents/pm/history/ops-0c8k.jsonl b/.agents/pm/history/ops-0c8k.jsonl new file mode 100644 index 00000000..6176e074 --- /dev/null +++ b/.agents/pm/history/ops-0c8k.jsonl @@ -0,0 +1 @@ +{"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"} diff --git a/.agents/pm/history/ops-cl0o.jsonl b/.agents/pm/history/ops-cl0o.jsonl index 24341569..7b150c95 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -1 +1,14 @@ {"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"} diff --git a/.agents/pm/issues/ops-0c8k.toon b/.agents/pm/issues/ops-0c8k.toon new file mode 100644 index 00000000..2324f6e0 --- /dev/null +++ b/.agents/pm/issues/ops-0c8k.toon @@ -0,0 +1,18 @@ +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-29T20:07:47.887Z" +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 full presence census finds 580 of 1879 documented declarations and 22 of 23 module docblocks. +component: docstrings +body: "" diff --git a/.agents/pm/issues/ops-cl0o.toon b/.agents/pm/issues/ops-cl0o.toon index 6b3d2d98..68d8fcd3 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -2,10 +2,34 @@ 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-09-29T20:12:56.601Z" 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; Every c8 invocation uses the measured repositorys coverage/tmp directory and preserves an enclosing coverage run +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 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. +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: "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." +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 +notes[3]{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." +files[4]{path,scope,note}: + 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[1]{command,scope,timeout_seconds,pm_context_mode,provenance{author,created_at,source_kind,source_ref}}: + node --test test/coverage-gate.test.ts,project,120,none,codex-coverage-inventory,"2026-09-29T19:58:09.585Z",local_mutation,fix/pm-ops-coverage-source-inventory-2026-09-29 +docs[1]{path,scope,note}: + README.md,project,Coverage denominator and controlled boundary contract body: "" diff --git a/README.md b/README.md index 252bfbe3..2507632b 100644 --- a/README.md +++ b/README.md @@ -399,6 +399,23 @@ 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. +Raw counters live in that repository's `coverage/tmp`, so a nested gate cannot +clean a parent run's inherited counter directory. + +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 91f3bfb2..8f454040 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 56c4a4aa..3347b2f1 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 e48ecd15..fd377142 100644 --- a/scripts/coverage-gate.ts +++ b/scripts/coverage-gate.ts @@ -245,9 +245,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)); @@ -343,6 +345,10 @@ export function runCoverageGate(options: CoverageGateOptions = {}): void { "lcov", "--reports-dir", join(repoRoot, "coverage"), + // c8 otherwise defaults to inherited NODE_V8_COVERAGE and cleans that + // directory before running. Nested gates must preserve the parent's data. + "--temp-directory", + join(repoRoot, "coverage", "tmp"), process.execPath, "--test", ...gateConfig.tests, diff --git a/test/compatibility-floor.test.ts b/test/compatibility-floor.test.ts index 7fd1bff6..04298add 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 84c3bdc0..412df9c6 100644 --- a/test/coverage-gate.test.ts +++ b/test/coverage-gate.test.ts @@ -1,10 +1,17 @@ +/** + * 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 { chmodSync, mkdirSync, mkdtempSync, + readFileSync, rmSync, + symlinkSync, writeFileSync, } from "node:fs"; import { tmpdir } from "node:os"; @@ -118,40 +125,94 @@ 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")); + assert.strictEqual( + calls[0].args[calls[0].args.indexOf("--temp-directory") + 1], + join(directory, "coverage", "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("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 = args.flatMap((arg, index) => + arg === "--include" ? [args[index + 1]] : [] + ); + assert.deepStrictEqual(included, ["src/index.ts", "src/nested/worker.ts"]); + writeLcov(directory, included); + 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", () => { + 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, ".."); + 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, "parent-counters"); + mkdirSync(parentCounters); + const sentinel = join(parentCounters, "parent-owned.txt"); + writeFileSync(sentinel, "preserve parent counters"); + env.NODE_V8_COVERAGE = parentCounters; + const complete = spawnSync(process.execPath, [script, directory], { + cwd: directory, + encoding: "utf8", + timeout: 30_000, + env, + }); + 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"); + + writeFileSync(join(directory, "src", "unimported.ts"), "export const omitted = 4;\n"); + const incomplete = spawnSync(process.execPath, [script, directory], { + cwd: directory, + encoding: "utf8", + timeout: 30_000, + env, + }); + 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"); +}); + test("coverage gate defaults to its package root and native process boundaries", () => { 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", - ]); + const spawn = ((_command: string, args: readonly string[]) => { + // This fake only acknowledges the actual runner scope. The independent real + // c8 fixture above verifies the walk and fail-closed measurement itself. + writeLcov(packageRoot, args.flatMap((arg, index) => + arg === "--include" ? [args[index + 1]] : [] + )); return spawnResult(); }) as unknown as typeof spawnSync; try { @@ -169,16 +230,20 @@ 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";', + 'const args = process.argv.slice(2);', + 'const files = args.flatMap((arg, index) => arg === "--include" ? [args[index + 1]] : []);', + 'mkdirSync("coverage", { recursive: true });', + 'writeFileSync("coverage/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 +262,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, [ From 9dd3924846f7e6539d0bcc0fe39290c8fe9edb45 Mon Sep 17 00:00:00 2001 From: unbraind <1153461+unbraind@users.noreply.github.com> Date: Tue, 29 Sep 2026 22:40:19 +0200 Subject: [PATCH 02/11] Isolate every c8 run and independently verify the package source scope Give each coverage invocation unique report and counter directories. Validate its own fresh LCOV, then publish the successful report atomically and clean only that invocation. Preserve a parent using c8's default coverage/tmp. Add two real concurrent same-repository c8 processes, stale-report rejection, cleanup checks, and an independent fast-glob package inventory. A controlled index.ts omission fails the inventory assertion. Factor shared include parsing to retain the zero-duplication gate. Regenerate the existing September 29 changelog heading with pm-changelog after refreshing published tags; this reproduces and fixes the fresh-checkout CI failure without weakening the check or creating a release. Validation: 456 passed, zero failed/skipped/TODO; c8 100 statements, branches, functions and lines per-file across 23 runtime/tooling/template files; PM-linked none/snapshot 11 passed; strict types/lint, duplication, selected docstrings, full/production audits, package allowlist and release contract gates pass. Addresses Sourcery 4137899586/4137911348, CodeRabbit 4137928843 and Greptile 4137938933. Full documentation remains incomplete at 582/1883 declarations, 22/23 modules under ops-0c8k. Parent PR132 and exact-head reviews remain required. No publication, deployment or production data changes. Owner: ops-cl0o. --- .agents/pm/history/ops-0c8k.jsonl | 2 + .agents/pm/history/ops-cl0o.jsonl | 8 + .agents/pm/issues/ops-0c8k.toon | 6 +- .agents/pm/issues/ops-cl0o.toon | 19 ++- README.md | 7 +- scripts/coverage-gate.ts | 235 ++++++++++++++++-------------- test/coverage-gate.test.ts | 107 ++++++++++---- 7 files changed, 236 insertions(+), 148 deletions(-) diff --git a/.agents/pm/history/ops-0c8k.jsonl b/.agents/pm/history/ops-0c8k.jsonl index 6176e074..bfbd6465 100644 --- a/.agents/pm/history/ops-0c8k.jsonl +++ b/.agents/pm/history/ops-0c8k.jsonl @@ -1 +1,3 @@ {"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"} diff --git a/.agents/pm/history/ops-cl0o.jsonl b/.agents/pm/history/ops-cl0o.jsonl index 7b150c95..720dd570 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -12,3 +12,11 @@ {"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"} diff --git a/.agents/pm/issues/ops-0c8k.toon b/.agents/pm/issues/ops-0c8k.toon index 2324f6e0..be7c796b 100644 --- a/.agents/pm/issues/ops-0c8k.toon +++ b/.agents/pm/issues/ops-0c8k.toon @@ -6,13 +6,15 @@ status: open priority: 1 tags: [] created_at: "2026-09-29T20:07:47.887Z" -updated_at: "2026-09-29T20:07:47.887Z" +updated_at: "2026-09-29T20:40:19.566Z" 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 full presence census finds 580 of 1879 documented declarations and 22 of 23 module docblocks. +actual_result: 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 component: docstrings +notes[1]{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." body: "" diff --git a/.agents/pm/issues/ops-cl0o.toon b/.agents/pm/issues/ops-cl0o.toon index 68d8fcd3..4601d56d 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -6,30 +6,35 @@ status: blocked priority: 2 tags[3]: "area:release","area:testing","type:defect" created_at: "2026-08-28T14:25:04.891Z" -updated_at: "2026-09-29T20:12:56.601Z" +updated_at: "2026-09-29T20:38:35.168Z" 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; Every c8 invocation uses the measured repositorys coverage/tmp directory and preserves an enclosing coverage run +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" 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 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. +blocked_reason: 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. 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: "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." +actual_result: "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" 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 -notes[3]{created_at,author,text}: +notes[6]{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." -files[4]{path,scope,note}: + "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." +files[5]{path,scope,note}: 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 + CHANGELOG.md,project,Generated release heading after refreshing existing published tags tests[1]{command,scope,timeout_seconds,pm_context_mode,provenance{author,created_at,source_kind,source_ref}}: node --test test/coverage-gate.test.ts,project,120,none,codex-coverage-inventory,"2026-09-29T19:58:09.585Z",local_mutation,fix/pm-ops-coverage-source-inventory-2026-09-29 -docs[1]{path,scope,note}: +docs[2]{path,scope,note}: + "https://github.com/unbraind/pm-ops/pull/134",global,Stacked coverage source inventory and isolated c8 report candidate README.md,project,Coverage denominator and controlled boundary contract body: "" diff --git a/README.md b/README.md index 2507632b..620b22f8 100644 --- a/README.md +++ b/README.md @@ -407,8 +407,11 @@ 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. -Raw counters live in that repository's `coverage/tmp`, so a nested gate cannot -clean a parent run's inherited counter directory. +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` as the last successful report and +removes its temporary directory. Each gate judges its own fresh report, including +on failure; a previous canonical report cannot satisfy its presence check. 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 diff --git a/scripts/coverage-gate.ts b/scripts/coverage-gate.ts index fd377142..a2db5aa7 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"; @@ -312,124 +314,143 @@ 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 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. + const runDirectory = mkdtempSync(join(coverageDirectory, "run-")); + const lcovPath = join(runDirectory, "lcov.info"); - 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"), - // c8 otherwise defaults to inherited NODE_V8_COVERAGE and cleans that - // directory before running. Nested gates must preserve the parent's data. - "--temp-directory", - join(repoRoot, "coverage", "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" }, - }, - ); - - if (result.error) { - console.error( - `coverage-gate: failed to start the test runner: ${result.error.message}`, - ); - exit(1); + /** 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. + renameSync(lcovPath, join(coverageDirectory, "lcov.info")); + + console.log( + `\ncoverage-gate: ${required.length} source file(s) reported, thresholds met.`, ); - exit(1); + } finally { + cleanupRun(); } - - console.log( - `\ncoverage-gate: ${required.length} source file(s) reported, thresholds met.`, - ); } if ( diff --git a/test/coverage-gate.test.ts b/test/coverage-gate.test.ts index 412df9c6..21f88978 100644 --- a/test/coverage-gate.test.ts +++ b/test/coverage-gate.test.ts @@ -4,19 +4,21 @@ * 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, 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"; @@ -90,11 +92,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`, ); } @@ -113,7 +123,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; @@ -125,9 +135,12 @@ 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(directory, "coverage", "tmp"), + join(reportDirectory, "tmp"), "nested c8 must not clean the parent run's inherited raw-counter directory", ); assert.deepStrictEqual( @@ -143,17 +156,15 @@ test("overlapping source roots produce one sorted include per source file", () = thresholds: { statements: 100, lines: 100, branches: 100, functions: 100 }, }); const spawn = ((_command: string, args: readonly string[]) => { - const included = args.flatMap((arg, index) => - arg === "--include" ? [args[index + 1]] : [] - ); + const included = includedSources(args); assert.deepStrictEqual(included, ["src/index.ts", "src/nested/worker.ts"]); - writeLcov(directory, included); + 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", () => { +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"], @@ -177,8 +188,8 @@ test("real c8 discovers newly tested modules and rejects an unimported module by // 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, "parent-counters"); - mkdirSync(parentCounters); + 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; @@ -192,6 +203,23 @@ test("real c8 discovers newly tested modules and rejects an unimported module by 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")), ["lcov.info", "tmp"]); + writeFileSync(join(directory, "src", "unimported.ts"), "export const omitted = 4;\n"); const incomplete = spawnSync(process.execPath, [script, directory], { cwd: directory, @@ -203,16 +231,30 @@ test("real c8 discovers newly tested modules and rejects an unimported module by 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")), ["lcov.info", "tmp"]); }); -test("coverage gate defaults to its package root and native process boundaries", () => { +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[]) => { - // This fake only acknowledges the actual runner scope. The independent real - // c8 fixture above verifies the walk and fail-closed measurement itself. - writeLcov(packageRoot, args.flatMap((arg, index) => - arg === "--include" ? [args[index + 1]] : [] - )); + 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 { @@ -232,10 +274,12 @@ test("coverage gate direct entrypoint executes against an explicit package root" 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]] : []);', - 'mkdirSync("coverage", { recursive: true });', - 'writeFileSync("coverage/lcov.info", files.map((file) => `SF:${file}\\nend_of_record`).join("\\n") + "\\n");', + '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") { @@ -387,6 +431,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( @@ -394,10 +439,11 @@ test("coverage gate rejects absent and incomplete lcov reports", (context) => { GateExit, ); assertSingleDiagnostic(messages, before, /no coverage report/); + assert.deepStrictEqual(readdirSync(join(absent, "coverage")), ["lcov.info"]); 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; @@ -406,6 +452,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) => { @@ -493,7 +540,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({ @@ -502,7 +549,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 }); @@ -514,12 +561,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 }); @@ -538,12 +585,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" }); From a05dc211f6d126807d42d2d3a219bcd0e5311c05 Mon Sep 17 00:00:00 2001 From: unbraind <1153461+unbraind@users.noreply.github.com> Date: Tue, 29 Sep 2026 23:11:53 +0200 Subject: [PATCH 03/11] Invalidate shared coverage evidence when a gate starts or fails The gate previously retained the last successful canonical LCOV after failing. The actual assurance provider could therefore report the earlier 100% result after only tests changed. Invalidate the shared report before measuring and at every failure exit, including preflight. Unexpected failures invalidate in finally; validated successes publish atomically from their private run directory. Peer raw counters remain isolated. Document the generated paths and state. The real-provider regression first measures 100 from c8, changes only a test, observes failure, and requires the provider to refuse the old report. It fails against f801740 and passes with this fix. Existing concurrency, default-parent counter preservation, unimported-module and independent-inventory regressions pass. Validation: full release:check with real pm-slack/pm-csv selections passes 456/456 with zero skips/TODOs, all four c8 columns at 100 per-file across 23 runtime/tooling/template modules; linked PM none/snapshot acceptance passes 11. Strict types/lint, zero duplication, selected documentation, audits, artifact allowlist, changelog/date, attestation and lifecycle contracts pass. Full documentation remains 590/1887 declarations and 22/23 modules. Bun strict health independently reproduces existing upstream1349 with extensions disabled; imports, real ops execution and all five adapter configurations pass. Keep ops-cl0o blocked and unclaimed pending these gates, parent PR132 and reviews. Addresses Greptile 4138181201. No publication or deployment. Blocker: ops-0c8k. --- .agents/pm/history/ops-0c8k.jsonl | 2 ++ .agents/pm/history/ops-cl0o.jsonl | 6 ++++ .agents/pm/issues/ops-0c8k.toon | 8 ++++-- .agents/pm/issues/ops-cl0o.toon | 15 ++++++---- README.md | 8 ++++-- scripts/coverage-gate.ts | 30 +++++++++++++++++-- test/coverage-gate.test.ts | 48 ++++++++++++++++++++++--------- 7 files changed, 89 insertions(+), 28 deletions(-) diff --git a/.agents/pm/history/ops-0c8k.jsonl b/.agents/pm/history/ops-0c8k.jsonl index bfbd6465..6ceb1104 100644 --- a/.agents/pm/history/ops-0c8k.jsonl +++ b/.agents/pm/history/ops-0c8k.jsonl @@ -1,3 +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 720dd570..30098cf3 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -20,3 +20,9 @@ {"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"} diff --git a/.agents/pm/issues/ops-0c8k.toon b/.agents/pm/issues/ops-0c8k.toon index be7c796b..03834064 100644 --- a/.agents/pm/issues/ops-0c8k.toon +++ b/.agents/pm/issues/ops-0c8k.toon @@ -6,15 +6,17 @@ status: open priority: 1 tags: [] created_at: "2026-09-29T20:07:47.887Z" -updated_at: "2026-09-29T20:40:19.566Z" +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 current full presence census finds 582 of 1883 documented declarations and 22 of 23 module docblocks +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[1]{created_at,author,text}: +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 4601d56d..7b1b4c2c 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -6,26 +6,28 @@ status: blocked priority: 2 tags[3]: "area:release","area:testing","type:defect" created_at: "2026-08-28T14:25:04.891Z" -updated_at: "2026-09-29T20:38:35.168Z" +updated_at: "2026-09-29T21:10:47.067Z" 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" +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: 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. +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: "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" +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 -notes[6]{created_at,author,text}: +notes[8]{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." files[5]{path,scope,note}: package.json,project,Exact CLI and SDK compatibility pin scripts/coverage-gate.ts,project,Deterministic unique source denominator @@ -34,7 +36,8 @@ files[5]{path,scope,note}: CHANGELOG.md,project,Generated release heading after refreshing existing published tags tests[1]{command,scope,timeout_seconds,pm_context_mode,provenance{author,created_at,source_kind,source_ref}}: node --test test/coverage-gate.test.ts,project,120,none,codex-coverage-inventory,"2026-09-29T19:58:09.585Z",local_mutation,fix/pm-ops-coverage-source-inventory-2026-09-29 -docs[2]{path,scope,note}: +docs[3]{path,scope,note}: + "https://github.com/unbraind/pm-cli/issues/1349",global,Published core Bun merge-driver strict-health blocker independently reproduced without extensions "https://github.com/unbraind/pm-ops/pull/134",global,Stacked coverage source inventory and isolated c8 report candidate README.md,project,Coverage denominator and controlled boundary contract body: "" diff --git a/README.md b/README.md index 620b22f8..7b9f8b7b 100644 --- a/README.md +++ b/README.md @@ -409,9 +409,11 @@ 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` as the last successful report and -removes its temporary directory. Each gate judges its own fresh report, including -on failure; a previous canonical report cannot satisfy its presence check. +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 diff --git a/scripts/coverage-gate.ts b/scripts/coverage-gate.ts index a2db5aa7..13703784 100644 --- a/scripts/coverage-gate.ts +++ b/scripts/coverage-gate.ts @@ -106,7 +106,23 @@ 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; + /** 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( @@ -314,13 +330,18 @@ export function runCoverageGate(options: CoverageGateOptions = {}): void { 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 { @@ -443,12 +464,17 @@ export function runCoverageGate(options: CoverageGateOptions = {}): void { // Publish a complete successful report atomically. Concurrent successes may // replace this convenience report, but every gate judges its own run first. - renameSync(lcovPath, join(coverageDirectory, "lcov.info")); + renameSync(lcovPath, canonicalLcovPath); + reportPublished = true; console.log( `\ncoverage-gate: ${required.length} source file(s) reported, thresholds met.`, ); } 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(); } } diff --git a/test/coverage-gate.test.ts b/test/coverage-gate.test.ts index 21f88978..1d5aa350 100644 --- a/test/coverage-gate.test.ts +++ b/test/coverage-gate.test.ts @@ -21,6 +21,7 @@ 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; @@ -193,12 +194,16 @@ test("real c8 discovers newly tested modules and rejects an unimported module by const sentinel = join(parentCounters, "parent-owned.txt"); writeFileSync(sentinel, "preserve parent counters"); env.NODE_V8_COVERAGE = parentCounters; - const complete = spawnSync(process.execPath, [script, directory], { - cwd: directory, - encoding: "utf8", - timeout: 30_000, - env, - }); + /** 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"); @@ -220,18 +225,33 @@ test("real c8 discovers newly tested modules and rejects an unimported module by } assert.deepStrictEqual(readdirSync(join(directory, "coverage")), ["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")), ["tmp"]); + writeFileSync(testPath, passingTests); + writeFileSync(join(directory, "src", "unimported.ts"), "export const omitted = 4;\n"); - const incomplete = spawnSync(process.execPath, [script, directory], { - cwd: directory, - encoding: "utf8", - timeout: 30_000, - env, - }); + 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")), ["lcov.info", "tmp"]); + assert.deepStrictEqual(readdirSync(join(directory, "coverage")), ["tmp"]); }); test("coverage gate defaults to its package root and includes the independent package inventory", () => { @@ -439,7 +459,7 @@ test("coverage gate rejects absent and incomplete lcov reports", (context) => { GateExit, ); assertSingleDiagnostic(messages, before, /no coverage report/); - assert.deepStrictEqual(readdirSync(join(absent, "coverage")), ["lcov.info"]); + assert.deepStrictEqual(readdirSync(join(absent, "coverage")), []); const incomplete = fixture("incomplete-report"); const omitted = ((_command: string, args: readonly string[]) => { From 9a176ee4496a323973f1a646be48afcdbebdb744 Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Fri, 2 Oct 2026 20:29:47 +0200 Subject: [PATCH 04/11] Sort coverage directory listings in coverage gate tests readdirSync does not guarantee lexical order on every filesystem (XFS and tmpfs return hash or creation order), so the three directory assertions in test/coverage-gate.test.ts compared an unsorted listing against an ordered array and could fail on a correct gate. Sort each listing before the deepStrictEqual comparison; single-entry checks stay equivalent. CodeRabbit finding 4138483396. Rebased onto pm-ops#132 head f3e66c3 (main now includes releases 2026.9.28-1 and 2026.9.29). Full release:check passes: 456 tests, 0 failures, 2 existing opt-in real-data skips; coverage 100/100/100/100 across 23 sources. --- test/coverage-gate.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/coverage-gate.test.ts b/test/coverage-gate.test.ts index 1d5aa350..6e9bfbb6 100644 --- a/test/coverage-gate.test.ts +++ b/test/coverage-gate.test.ts @@ -223,7 +223,7 @@ test("real c8 discovers newly tested modules and rejects an unimported module by 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")), ["lcov.info", "tmp"]); + assert.deepStrictEqual(readdirSync(join(directory, "coverage")).sort(), ["lcov.info", "tmp"]); const measurementContext = { provider: QUALITY_PROVIDER_ID, @@ -242,7 +242,7 @@ test("real c8 discovers newly tested modules and rejects an unimported module by 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")), ["tmp"]); + assert.deepStrictEqual(readdirSync(join(directory, "coverage")).sort(), ["tmp"]); writeFileSync(testPath, passingTests); writeFileSync(join(directory, "src", "unimported.ts"), "export const omitted = 4;\n"); @@ -251,7 +251,7 @@ test("real c8 discovers newly tested modules and rejects an unimported module by 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")), ["tmp"]); + assert.deepStrictEqual(readdirSync(join(directory, "coverage")).sort(), ["tmp"]); }); test("coverage gate defaults to its package root and includes the independent package inventory", () => { From 1fc3c2211b86453c6c4682742b196739dd70b05e Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Fri, 2 Oct 2026 20:35:13 +0200 Subject: [PATCH 05/11] Record the sorted directory-listing fix and gate evidence on ops-cl0o --- .agents/pm/history/ops-cl0o.jsonl | 3 +++ .agents/pm/issues/ops-cl0o.toon | 30 +++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/.agents/pm/history/ops-cl0o.jsonl b/.agents/pm/history/ops-cl0o.jsonl index 30098cf3..aa9f182e 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -26,3 +26,6 @@ {"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"} diff --git a/.agents/pm/issues/ops-cl0o.toon b/.agents/pm/issues/ops-cl0o.toon index 7b1b4c2c..4dd87264 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -6,7 +6,7 @@ status: blocked priority: 2 tags[3]: "area:release","area:testing","type:defect" created_at: "2026-08-28T14:25:04.891Z" -updated_at: "2026-09-29T21:10:47.067Z" +updated_at: "2026-10-02T18:30:49.494Z" 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" @@ -19,6 +19,8 @@ expected_result: "New source modules are discovered once in deterministic order 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[1]{created_at,author,text}: + "2026-10-02T18:30:48.281Z",pi-glm,"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." notes[8]{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." @@ -34,8 +36,30 @@ files[5]{path,scope,note}: 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 CHANGELOG.md,project,Generated release heading after refreshing existing published tags -tests[1]{command,scope,timeout_seconds,pm_context_mode,provenance{author,created_at,source_kind,source_ref}}: - node --test test/coverage-gate.test.ts,project,120,none,codex-coverage-inventory,"2026-09-29T19:58:09.585Z",local_mutation,fix/pm-ops-coverage-source-inventory-2026-09-29 +tests[3]: + - 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 + - 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 docs[3]{path,scope,note}: "https://github.com/unbraind/pm-cli/issues/1349",global,Published core Bun merge-driver strict-health blocker independently reproduced without extensions "https://github.com/unbraind/pm-ops/pull/134",global,Stacked coverage source inventory and isolated c8 report candidate From 338d95d6453543eb8ef5d1f964b5dd8c26026d8e Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Fri, 2 Oct 2026 20:35:24 +0200 Subject: [PATCH 06/11] Clarify the pm-run timeout against the directly verified gate evidence on ops-cl0o --- .agents/pm/history/ops-cl0o.jsonl | 1 + .agents/pm/issues/ops-cl0o.toon | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.agents/pm/history/ops-cl0o.jsonl b/.agents/pm/history/ops-cl0o.jsonl index aa9f182e..828fad03 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -29,3 +29,4 @@ {"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"} diff --git a/.agents/pm/issues/ops-cl0o.toon b/.agents/pm/issues/ops-cl0o.toon index 4dd87264..a15659f8 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -6,7 +6,7 @@ status: blocked priority: 2 tags[3]: "area:release","area:testing","type:defect" created_at: "2026-08-28T14:25:04.891Z" -updated_at: "2026-10-02T18:30:49.494Z" +updated_at: "2026-10-02T18:35:24.315Z" 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" @@ -19,8 +19,9 @@ expected_result: "New source modules are discovered once in deterministic order 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[1]{created_at,author,text}: +comments[2]{created_at,author,text}: "2026-10-02T18:30:48.281Z",pi-glm,"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." + "2026-10-02T18:35:24.315Z",pi-glm,"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." notes[8]{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." From 94ffd956ffccb6a6a2cbdaa899b7a777bf8063be Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Fri, 2 Oct 2026 23:03:51 +0200 Subject: [PATCH 07/11] Route a locked coverage report publish through the gate exit Cubic 4168720026: renameSync failures escaped failRun and the injected exit boundary. A throwing publisher now fails closed with the gate diagnostic. Also record the default-suite skip-count clarification. --- .agents/pm/history/ops-cl0o.jsonl | 4 ++++ .agents/pm/issues/ops-cl0o.toon | 11 ++++++++--- scripts/coverage-gate.ts | 19 ++++++++++++++++++- test/coverage-gate.test.ts | 30 ++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/.agents/pm/history/ops-cl0o.jsonl b/.agents/pm/history/ops-cl0o.jsonl index 828fad03..672ed0c1 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -30,3 +30,7 @@ {"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"} diff --git a/.agents/pm/issues/ops-cl0o.toon b/.agents/pm/issues/ops-cl0o.toon index a15659f8..7a12cab3 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -6,7 +6,9 @@ status: blocked priority: 2 tags[3]: "area:release","area:testing","type:defect" created_at: "2026-08-28T14:25:04.891Z" -updated_at: "2026-10-02T18:35:24.315Z" +updated_at: "2026-10-02T21:03:51.083Z" +assignee: pi-grok +claim_principal: pi-grok 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" @@ -19,10 +21,12 @@ expected_result: "New source modules are discovered once in deterministic order 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[2]{created_at,author,text}: +comments[4]{created_at,author,text}: "2026-10-02T18:30:48.281Z",pi-glm,"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." "2026-10-02T18:35:24.315Z",pi-glm,"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." -notes[8]{created_at,author,text}: + "2026-10-02T21:02:27.848Z",pi-grok,"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." + "2026-10-02T21:03:51.083Z",pi-grok,"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." +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." @@ -31,6 +35,7 @@ notes[8]{created_at,author,text}: "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}: package.json,project,Exact CLI and SDK compatibility pin scripts/coverage-gate.ts,project,Deterministic unique source denominator diff --git a/scripts/coverage-gate.ts b/scripts/coverage-gate.ts index 13703784..652cbf0d 100644 --- a/scripts/coverage-gate.ts +++ b/scripts/coverage-gate.ts @@ -98,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, ".."); @@ -108,6 +114,8 @@ export function runCoverageGate(options: CoverageGateOptions = {}): void { const spawn = options.spawn ?? spawnSync; /** 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"); @@ -464,7 +472,16 @@ export function runCoverageGate(options: CoverageGateOptions = {}): void { // Publish a complete successful report atomically. Concurrent successes may // replace this convenience report, but every gate judges its own run first. - renameSync(lcovPath, canonicalLcovPath); + // 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( diff --git a/test/coverage-gate.test.ts b/test/coverage-gate.test.ts index 6e9bfbb6..f45a108d 100644 --- a/test/coverage-gate.test.ts +++ b/test/coverage-gate.test.ts @@ -7,6 +7,7 @@ import assert from "node:assert/strict"; import { spawn, spawnSync, type SpawnSyncReturns } from "node:child_process"; import { chmodSync, + existsSync, mkdirSync, mkdtempSync, readFileSync, @@ -418,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"); From 188e56f396c47cdc053bdc64b7ac5e62b3c34e97 Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Fri, 2 Oct 2026 23:09:42 +0200 Subject: [PATCH 08/11] Record the cubic skip clarification evidence and release the ops-cl0o claim --- .agents/pm/history/ops-cl0o.jsonl | 2 ++ .agents/pm/issues/ops-cl0o.toon | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.agents/pm/history/ops-cl0o.jsonl b/.agents/pm/history/ops-cl0o.jsonl index 672ed0c1..ffc60d6e 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -34,3 +34,5 @@ {"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"} diff --git a/.agents/pm/issues/ops-cl0o.toon b/.agents/pm/issues/ops-cl0o.toon index 7a12cab3..04e1459d 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -6,9 +6,7 @@ status: blocked priority: 2 tags[3]: "area:release","area:testing","type:defect" created_at: "2026-08-28T14:25:04.891Z" -updated_at: "2026-10-02T21:03:51.083Z" -assignee: pi-grok -claim_principal: pi-grok +updated_at: "2026-10-02T21:09:42.585Z" 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" @@ -21,11 +19,12 @@ expected_result: "New source modules are discovered once in deterministic order 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[4]{created_at,author,text}: +comments[5]{created_at,author,text}: "2026-10-02T18:30:48.281Z",pi-glm,"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." "2026-10-02T18:35:24.315Z",pi-glm,"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." "2026-10-02T21:02:27.848Z",pi-grok,"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." "2026-10-02T21:03:51.083Z",pi-grok,"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." + "2026-10-02T21:09:41.775Z",pi-grok,"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." 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." From cf970b002185c956200fb0a8a9195f85c3bd25b1 Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Fri, 2 Oct 2026 23:16:53 +0200 Subject: [PATCH 09/11] Explain the 457-test total in the ops-cl0o land-pass note CodeRabbit 4169890374: the extra test is the failed-publish path. The two default-suite skips are unchanged. --- .agents/pm/history/ops-cl0o.jsonl | 3 +++ .agents/pm/issues/ops-cl0o.toon | 25 ++++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/.agents/pm/history/ops-cl0o.jsonl b/.agents/pm/history/ops-cl0o.jsonl index ffc60d6e..5352cdcd 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -36,3 +36,6 @@ {"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"} diff --git a/.agents/pm/issues/ops-cl0o.toon b/.agents/pm/issues/ops-cl0o.toon index 04e1459d..29d73f5e 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -6,7 +6,7 @@ status: blocked priority: 2 tags[3]: "area:release","area:testing","type:defect" created_at: "2026-08-28T14:25:04.891Z" -updated_at: "2026-10-02T21:09:42.585Z" +updated_at: "2026-10-02T21:16:43.240Z" 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" @@ -19,12 +19,23 @@ expected_result: "New source modules are discovered once in deterministic order 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[5]{created_at,author,text}: - "2026-10-02T18:30:48.281Z",pi-glm,"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." - "2026-10-02T18:35:24.315Z",pi-glm,"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." - "2026-10-02T21:02:27.848Z",pi-grok,"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." - "2026-10-02T21:03:51.083Z",pi-grok,"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." - "2026-10-02T21:09:41.775Z",pi-grok,"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." +comments[5]: + - 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" 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." From c467dc2bcf99e84b51bf8bc0ee485b16a5de0bae Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Sat, 3 Oct 2026 01:58:00 +0200 Subject: [PATCH 10/11] docs(ops): record resumed PR #134 verification --- .agents/pm/history/ops-cl0o.jsonl | 11 +++++++ .agents/pm/issues/ops-cl0o.toon | 50 +++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/.agents/pm/history/ops-cl0o.jsonl b/.agents/pm/history/ops-cl0o.jsonl index 5352cdcd..1fd171f6 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -39,3 +39,14 @@ {"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"} diff --git a/.agents/pm/issues/ops-cl0o.toon b/.agents/pm/issues/ops-cl0o.toon index 29d73f5e..3300e1e1 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -6,7 +6,7 @@ status: blocked priority: 2 tags[3]: "area:release","area:testing","type:defect" created_at: "2026-08-28T14:25:04.891Z" -updated_at: "2026-10-02T21:16:43.240Z" +updated_at: "2026-10-02T23:58:00.687Z" 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" @@ -19,7 +19,7 @@ expected_result: "New source modules are discovered once in deterministic order 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[5]: +comments[8]: - 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." @@ -36,6 +36,15 @@ comments[5]: 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." 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." @@ -47,21 +56,12 @@ notes[9]{created_at,author,text}: "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 - CHANGELOG.md,project,Generated release heading after refreshing existing published tags tests[3]: - - 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 - command: "npm run release:check" scope: project provenance: @@ -76,8 +76,26 @@ tests[3]: created_at: "2026-10-02T18:30:49.450Z" source_kind: local_mutation source_ref: land/pm-ops-134 -docs[3]{path,scope,note}: - "https://github.com/unbraind/pm-cli/issues/1349",global,Published core Bun merge-driver strict-health blocker independently reproduced without extensions - "https://github.com/unbraind/pm-ops/pull/134",global,Stacked coverage source inventory and isolated c8 report candidate - README.md,project,Coverage denominator and controlled boundary contract + - 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: "" From 881af8bc4c2c87fba557f1e24f5d63053a3041ea Mon Sep 17 00:00:00 2001 From: SteveBot <1153461+unbraind@users.noreply.github.com> Date: Sat, 3 Oct 2026 02:16:59 +0200 Subject: [PATCH 11/11] docs(ops): retain verified parent schema disposition --- .agents/pm/history/ops-cl0o.jsonl | 5 +++++ .agents/pm/issues/ops-cl0o.toon | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.agents/pm/history/ops-cl0o.jsonl b/.agents/pm/history/ops-cl0o.jsonl index 1fd171f6..cd420c7a 100644 --- a/.agents/pm/history/ops-cl0o.jsonl +++ b/.agents/pm/history/ops-cl0o.jsonl @@ -50,3 +50,8 @@ {"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-cl0o.toon b/.agents/pm/issues/ops-cl0o.toon index 3300e1e1..a0a7f14d 100644 --- a/.agents/pm/issues/ops-cl0o.toon +++ b/.agents/pm/issues/ops-cl0o.toon @@ -6,7 +6,7 @@ status: blocked priority: 2 tags[3]: "area:release","area:testing","type:defect" created_at: "2026-08-28T14:25:04.891Z" -updated_at: "2026-10-02T23:58:00.687Z" +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" @@ -19,7 +19,7 @@ expected_result: "New source modules are discovered once in deterministic order 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[8]: +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." @@ -45,6 +45,9 @@ comments[8]: - 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."