docs(plan): slice 4b verdict-consumption plan - #112
Conversation
There was a problem hiding this comment.
Copilot wasn't able to review any files in this pull request.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: dfc5e70487
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| > **Baseline measurement trap (carried from 4a).** Running the suite via `uv run --project <worktree>` installs the wheel, which materializes `loop/_bundle/` and makes `scripts/test_resources.py::test_repo_checkout_resolves_to_repo_dirs` fail *correctly*. Measure from inside the worktree (`bash -c 'cd <worktree> && uv run --with … pytest -q … scripts'`), never with `--project`. | ||
|
|
||
| **Source of decisions:** `/tmp/claude-1000/-mnt-c-Dev-projects-loop-engineer/f56b13c4-a1fa-4923-bf9e-66fef64fa76a/scratchpad/slice4b-binding-decisions.md` (D1–D10, governor-adjudicated and settled) and `…/slice4b-verified-findings.md` (F1–F6, the operator's own live probes). Those two files **override `docs/adr/0002-ci-attested-verdict.md`** for this slice — specifically its decisions 2, 4 and 5 — and this slice appends an `## Amendment (2026-07-29, Slice 4b)` section to the ADR recording exactly that. Where this plan and D1–D10 disagree, **D1–D10 win and this plan is wrong.** |
There was a problem hiding this comment.
Preserve the binding decisions in a tracked location
Make the controlling D1–D10 decisions available in the repository rather than delegating normativity to these session-specific /tmp/claude-1000/.../scratchpad files. Neither referenced file exists in a fresh checkout or elsewhere in the repository, yet this line says they override both this plan and the committed ADR, so future readers cannot determine the governing rule if the documents conflict; embed the settled decisions or point to a tracked source.
Useful? React with 👍 / 👎.
| - [ ] Full suite green in **both** dependency legs, measured from **inside** a fresh worktree (never `--project`): **1567 passed / 18 skipped** with `--with pyyaml --with jsonschema --with pytest`, **1468 passed / 117 skipped** with `--with pyyaml --with pytest`. State the environment beside every number. | ||
| - [ ] The CI-equivalent leg (`+ --with hypothesis`) reports **1579 passed / 15 skipped** in the live checkout (measured **1577 / 17** in a fresh worktree, the documented −2/+2 delta). `--with hypothesis` swings roughly +10/−1 — never quote a count without its dependency set. |
There was a problem hiding this comment.
Update the final checklist for the added regression test
Reconcile these definition-of-done counts with the post-merge correction already included in the executed slice. The plan's end-state table records 215 added cases and therefore 1568/18 canonical, 1469/117 fallback, and 1580/15 with Hypothesis, but this checklist still uses the pre-correction 214-case totals (1567, 1468, and 1579), so following its required exact-count gate now reports a false mismatch.
Useful? React with 👍 / 👎.
Collects slice 4a (#106) and slice 4b (#110, #111, #112): loop verdict, opt-in keyless attestation, --compare, replay-based chain ancestry, anchor@1, signer trust, and the head-bearing subject. Neither slice shipped on its own; both sat in Unreleased and go out under one number. Beyond the version surfaces, this cut carries corrections a mechanical bump would not have made. The changelog said the predicate is handed to actions/attest as a subject-path. It is handed as predicate-path, alongside a SEPARATE subject file, and §23 says outright that the predicate bytes are deliberately not the subject — doctor validation_mode and tool.version live inside the predicate, so the same run projects different bytes in different environments. A reader following that sentence would hash the wrong file and fail every verification. "the three attestations minted before this release": the count was right, the scope word was wrong. attest.yml shipped inside this same window, so nothing predates the release; the three carrying the retired subject form are the pushes through c493804. Re-scoped to match what attest.yml and reference §24 already said. ADR 0002 decision 6 is withdrawn, in a new dated amendment. It described code-owner review as in force once the ruleset required it. The ruleset cannot require it: one collaborator, no self-approval, bypass_actors empty, current_user_can_bypass never, and no classic protection underneath. Flipping it would invert the intent rather than merely fail — maintainer-authored pull requests become unmergeable while bot-authored ones become gated, and agent work here lands under the maintainer's account. CODEOWNERS is demoted in place to what it honestly is, a record of the gate-defining surface, across the ADR, the changelog, reference §23 and §24, and the file's own header. test_docs_version.py's changelog check now ADDS 0.12.0 and keeps 0.11.0, and restores 0.10.0 — the previous cut replaced its predecessor's assertion instead of adding to it, leaving that heading with no cover. Baselines, live checkout: 1577 passed / 16 skipped with pyyaml+jsonschema+pytest, 1478 / 115 with pyyaml+pytest. Both legs +7 against pre-cut, which is the CLI guard's new tests plus the retired version-bump pin offset by the new code-owner pin. CI additionally installs hypothesis, which moves the number.
Fast-follow docs PR for the slice 4b feature PR (#110), following the #84 / #99 / #104 precedent: the plan lands separately so the feature PR's diff stays reviewable rather than being 90% plan prose.
Committed as executed, with every in-flight amendment folded in — the plan's own Global Constraint requires the committed document to match what shipped, not the pre-execution draft:
(9 cases)header reconciled to its row sum; Task 9 grew to 13 cases (the whole-branch review's regression pin) and Task 10 to 10 (a pin for the ci.yml ancestry exercise and the new fallback leg, neither of which had a test row). Slice totals moved 212 → 215 collected cases, 1568 / 18 canonical and 1469 / 117 structural-fallback.gates-fallbackjob — separate rather than a matrix leg, because a matrix would renamegates' check contexts and this repo's ruleset pins them by name.attest.ymlrun30509952627.subject[0].digest.sha256≠predicate.chain.headand =sha256(<the 64 head bytes>)), and the one thing the experiment falsified — gh's real denial stderr, corrected in fix(action): classify gh's real denial stderr as contradicted, not unavailable #111.Zero new tests and zero change to either suite count: this task ships a documentation file only.