Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 18 additions & 6 deletions docs/BACKLOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15095,7 +15095,9 @@ measurement from this row's subject and it is named here rather than performed.*

## 1272. the shell-syntax harness resolves whichever bash PATH orders first, and reports a harness failure as 160 content failures

> 🔢 **Re-scored 2026-08-20 -> P3.** Value **2/10** · Difficulty **1/10** · _fill-in_. The underlying defect is real and unfixed (tests/test_workflow_shell_syntax.py:110, tests/test_dependabot_automerge_guardrails.py:145, tests/test_installed_coord_hooks.py:666 all still use unpinned discovery, and the third resolves sh first), but #1216 is the surviving number for it and its amendment already absorbs this item's unique content, naming the three modules and the 127-versus-2 discrimination layer. The remainder specific to THIS number is closing it with a pointer, a ledger edit. _(previously unscored.)_
> ✅ **SHIPPED -- verified on main c57903c2c.** All three named sites pin the interpreter on proof, not on a name: `require_bash` from `tests/_bash_resolver.py` at test_workflow_shell_syntax.py:123 and test_dependabot_automerge_guardrails.py:212, and at test_installed_coord_hooks.py:719-726 the `sh` preference must pass `bash_sees` and `bash_preserves_path_order` or fall back to the resolver (PR 672). The 127-versus-2 layer is `explain_returncode` at _bash_resolver.py:231, widened to 126 under this number, so a harness fault names itself. Re-running this item's own control with PATH forced so `shutil.which("bash")` returns the WSL stub, the resolver still returned Git Bash usr/bin and the three modules gave 53 passed, 8 skipped, zero failures against the 19 recorded here. #1216 is the surviving number and is SHIPPED.
>
> **Re-scored 2026-08-20 -> P3.** Value **2/10** · Difficulty **1/10** · _fill-in_. The underlying defect is real and unfixed (tests/test_workflow_shell_syntax.py:110, tests/test_dependabot_automerge_guardrails.py:145, tests/test_installed_coord_hooks.py:666 all still use unpinned discovery, and the third resolves sh first), but #1216 is the surviving number for it and its amendment already absorbs this item's unique content, naming the three modules and the 127-versus-2 discrimination layer. The remainder specific to THIS number is closing it with a pointer, a ledger edit. _(previously unscored.)_
>
> **Filed 2026-08-14 - not started. TWO SEATS RAN THE SAME TEST ON THE SAME BOX ON THE SAME DAY AND GOT OPPOSITE RESULTS.** `tests/test_workflow_shell_syntax.py` writes each workflow shell block to a temp file and checks it with `subprocess.run([bash, "-n", str(probe)])`, where `bash` comes from **`shutil.which("bash")`** and `str(probe)` is a **Windows** path. **Both a Git Bash and a WSL `bash` are installed on this box**, and `shutil.which` returns **whichever the invoking process's `PATH` happens to order first**. Nothing pins it.
> **MEASURED, BOTH RESOLUTIONS, SAME WINDOWS PATH, WITH A REAL-SYNTAX-ERROR NEGATIVE CONTROL:**
Expand Down Expand Up @@ -15457,7 +15459,9 @@ can finish a suite rather than merely a lane with hours.

## 1291. Get-HandledTools returns NULL on its zero-tool and missing-file paths, correct only by its caller's grace

> 🔢 **Re-scored 2026-08-20 -> P3.** Value **2/10** · Difficulty **2/10** · _fill-in_. Unchanged: both exit paths at install-gate.ps1:244 and :250 still unroll, and the sole caller at :302 still re-wraps, so shipped behaviour is correct and the trap is latent exactly as filed. Value 2 is rung 2 -- developer tooling with no product, PHI or live-defect axis, and the one caller already covers it. Difficulty 2 for the two-token fix plus a test that must reach the function through ParseFile and FunctionDefinitionAst, since dot-sourcing install-gate.ps1 performs a machine-global install and a test routed through -Status cannot tell fixed from unfixed. _(previously unscored.)_
> ✅ **SHIPPED -- verified on main c57903c2c.** PR #577 comma-wrapped both exit paths of `Get-HandledTools` (scripts/worktree/install-gate.ps1:250 and :256) and dropped the sole caller's compensating `@()` wrap at :308, so the array guarantee now lives in the function rather than in its caller's grace. The discriminating AST-lift test is tests/test_gate_rule_scan_agreement.py:322, asserting type and count on the missing-file, zero-tool, one-tool and two-tool arms without wrapping the result; 26 tests pass, and a scratch copy with either comma removed reproduces the filed NULL / bare-String table.
>
> **Re-scored 2026-08-20 -> P3.** Value **2/10** · Difficulty **2/10** · _fill-in_. Unchanged: both exit paths at install-gate.ps1:244 and :250 still unroll, and the sole caller at :302 still re-wraps, so shipped behaviour is correct and the trap is latent exactly as filed. Value 2 is rung 2 -- developer tooling with no product, PHI or live-defect axis, and the one caller already covers it. Difficulty 2 for the two-token fix plus a test that must reach the function through ParseFile and FunctionDefinitionAst, since dot-sourcing install-gate.ps1 performs a machine-global install and a test routed through -Status cannot tell fixed from unfixed. _(previously unscored.)_
>
> **Filed 2026-08-19 -- not started. THIS IS A LATENT TRAP, NOT A LIVE DEFECT, AND THE DISTINCTION IS THE ITEM.** `Get-HandledTools` in [`scripts/worktree/install-gate.ps1`](../scripts/worktree/install-gate.ps1) returns `$null` rather than an empty array on two of its paths. **Shipped behaviour is correct today** because its single caller (around line 294) wraps the result in `@(...)`. **A commit message or item claiming a present-tense bug here would be false.** The honest claim: the function is correct only by its caller's grace, and the guarantee belongs in the function. **THE CHANGE: make both exit paths return an array unconditionally.**
> **MEASURED, in pwsh 7, by extracting the function through the PowerShell AST rather than running it:**
Expand Down Expand Up @@ -17988,7 +17992,9 @@ at which point the population is gone and this row cannot be re-derived.

## 1345. The claim gate decides documentation by path prefix, so executable code under docs escapes it

> 🔢 **Filed 2026-08-23 - not started.** `claim_check.py` decides whether a commit "touches code" by testing the PATH PREFIX against a documentation list. ***A `.py` file under a documentation prefix therefore DECLARES ITSELF DOCUMENTATION TO THE CLAIM GATE***, and a commit touching only such files is stood down on without ever meeting the claim rule.
> ✅ **SHIPPED -- verified on main c57903c2c.** The claim gate now decides on what a file IS, not where it sits: the code-extension test runs before the location test and is casefolded (scripts/hooks/claim_check.py:175-192, _CODE_SUFFIXES at :73), landed by PR 563 and PR 576. Driving _touches_code returns CODE for docs/bench/microbench.py, docs/security/asvs-scorecard.py, docs/bench/Tool.PY and .github/workflows/ci.yml, and DOC for docs/BACKLOG.md and docs/bench/results.csv, so the deliberate documentation carve-out survives. Both controls are pinned by paired arms plus an anti-vacuity check on the live population (tests/test_claim_check.py:223, :233, :242 must-block; :264, :274 must-not-block; :284), 18 passed.
>
> **Filed 2026-08-23 - not started.** `claim_check.py` decides whether a commit "touches code" by testing the PATH PREFIX against a documentation list. ***A `.py` file under a documentation prefix therefore DECLARES ITSELF DOCUMENTATION TO THE CLAIM GATE***, and a commit touching only such files is stood down on without ever meeting the claim rule.
>
> **Scored 2026-09-03 -> P3.** Value **1/10** · Difficulty **1/10** · _fill-in_. Both required controls are built and live, and I drove them rather than read them. The extension test now runs BEFORE the location test and is casefolded (scripts/hooks/claim_check.py:148-166, list at :57), so importing the module and calling _touches_code returned CODE for docs/bench/microbench.py, docs/security/scorecard.py, docs/bench/Tool.PY and .github/workflows/ci.yml, and DOC for docs/BACKLOG.md and docs/bench/results.csv -- the exempt-doc twin the item says must survive. The paired arms exist and assert the right direction (tests/test_claim_check.py:233 must-block, :264 must-not-block, :284 anti-vacuity), and the whole file ran green: 18 passed via pytest tests/test_claim_check.py. The measured population is covered -- 2 .py under docs/ here and 9 files under the vault's doc prefixes (8 .py including the six docs/security/asvs-*.py that write the security record, plus one .yml) all carry listed extensions -- and the fix is on the live path, since the installed .git/hooks/claim_check.py carries _CODE_SUFFIXES and the casefolded test, wired through the commit-msg hook. Only bookkeeping is left: docs/BACKLOG.md:16228 still banners this "not started", a banner flip and nothing runnable.
> Verdict: build
Expand Down Expand Up @@ -19034,7 +19040,9 @@ share a shape.

## 1367. The gate-parity failure asks the reader to attribute the drift instead of computing it

> 🔢 **Filed 2026-08-26 -- FIXED IN THIS CHANGE; the status banner is deliberately unchanged**
> ✅ **SHIPPED -- verified on main c57903c2c.** PR 632 added the computed attribution strictly additively (+186/-0): the pure `drift_verdict` at tests/test_gate_installed_parity.py:317 holds all four branches the item's table names (installed==main at :342, checkout==main at :359, neither at :365, main unreadable at :337), and the untouched assertion interpolates it at :432. Driven at HEAD, the four branches return distinct and correctly directed text, and the file runs 13 passed -- covering the four branch tests (:668, :687, :694, :699), the mutual-distinctness control (:715), and the wiring test that monkeypatches INSTALLED_GATE to a temporary copy rather than the machine-global file (:727). No doc or record limb is left: docs/BACKLOG.md:282 already ranks this row confirmed shipped.
>
> **Filed 2026-08-26 -- FIXED IN THIS CHANGE; the status banner is deliberately unchanged**
> (same handling as #1026, #1361 and #1365). `test_the_installed_gate_matches_the_committed_source`
> compares the installed gate against THIS CHECKOUT, which is the right question. Its failure text
> then correctly REFUSES to name a culprit and hands the reader a `git log` to run. Three seats did
Expand Down Expand Up @@ -19107,7 +19115,9 @@ take it out from under a concurrent session. Same reasoning the existing negativ

## 1366. the four connscale fields that discriminate the surviving failure hypotheses never escape the test job

> 🔢 **Filed 2026-08-26 (builder 2) - BUILT IN THIS COMMIT, not yet landed.** Successor in subject to [#1211](#1211-empty_claims_per_msg-is-not-contention-immune-the-ratio-form-excursions-past-its-own-slo-band-on-a-hosted-runner), whose limb one made the RATIO survive a passing run; this makes the readings that EXPLAIN the ratio survive one too.
> ✅ **SHIPPED -- verified on main c57903c2c.** PR 624 landed all five band-less fields as DIAGNOSTIC_FIELDS (harness/load/connscale/report.py:597) plus the second renderer render_diagnostics_markdown (report.py:907), whose table carries no prior, band floor, margin or verdict and whose preamble states that none of them has an SLO band. Driven rather than read: a record with reload_seconds=None and fd_probe_degraded_ticks=0 renders the unmeasured field as a dash and the measured zero as 0, the fixture calls _record_diagnostics unconditionally at tests/test_connscale_smoke.py:450, and tests/test_connscale_empty_claims_per_msg.py gives 47 passed. The 2026-08-31 correction is carried in the code at report.py:918, which names fd_count_monotonic as the only enforced band.
>
> **Filed 2026-08-26 (builder 2) - BUILT IN THIS COMMIT, not yet landed.** Successor in subject to [#1211](#1211-empty_claims_per_msg-is-not-contention-immune-the-ratio-form-excursions-past-its-own-slo-band-on-a-hosted-runner), whose limb one made the RATIO survive a passing run; this makes the readings that EXPLAIN the ratio survive one too.
>
> **Scored 2026-09-03 -> P3.** Value **1/10** · Difficulty **1/10** · _fill-in_. Verified by driving the code, not by reading it, and every limb is met. All five band-less fields the item enumerates are in DIAGNOSTIC_FIELDS at harness/load/connscale/report.py:594-621, and the second renderer render_diagnostics_markdown at harness/load/connscale/report.py:904 emits them with no prior, band floor, margin or verdict column plus a preamble sentence stating none has an SLO band -- I imported the module and rendered a record with reload_seconds=None and fd_probe_degraded_ticks=0, which produced "| 1.25 | - | 7 | 0 | 2.5 |", so an unmeasured field is a dash and a measured zero still prints 0. The fixture calls _record_diagnostics unconditionally before any assertion at tests/test_connscale_smoke.py:450, routed through _append_step_summary at tests/test_connscale_smoke.py:271, which is the selection-bias limb. The test arm is real and collected: tests/test_connscale_empty_claims_per_msg.py:1117-1225 pins the shipped set against a literal rather than against DIAGNOSTIC_FIELDS itself and asserts the unconditional call site by source scan, and running that file on the repo venv gave 47 passed. The item's own 2026-08-31 correction is carried into the code, with harness/load/connscale/report.py:915 naming fd_count_monotonic as the only enforced band, so no docstring still reads the retired "two metrics" way.
> Verdict: build
Expand Down Expand Up @@ -21231,7 +21241,9 @@ The mark is applied at runtime by `tests/conftest.py` from that manifest, **not

## 1410. gate liveness treats a timeout-cancelled job as did-not-run, so a gate killed mid-measurement reports healthy

> 🔢 **Filed 2026-08-31 (ci-diagnostics) - BUILT IN THIS COMMIT, not yet landed.** The reason #1409 ran eight days unseen. Fixed in the same change.
> ✅ **SHIPPED -- verified on main c57903c2c.** PR 724 (merge 4107615cc) keyed the did-not-run excuse on the receipt being ABSENT instead of on the result string (scripts/quality/liveness.py:207-210) and joined `cancelled` to the anti-laundering branch with the reworded "A gate that did not finish is dead, not inapplicable" (liveness.py:285-300). Replaying the four-PR production payload against both file versions confirms the direction: the pre-fix file returns no violations, HEAD returns "the gate reported ITSELF dead", and a genuine cancel with no receipt stays green in both. `pytest tests/test_gate_liveness.py -q` gives 31 passed, covering the must-trip, must-not-trip and laundering arms (tests/test_gate_liveness.py:246, :260, :285); no `negative_controls.toml` entry exists, as intended.
>
> **Filed 2026-08-31 (ci-diagnostics) - BUILT IN THIS COMMIT, not yet landed.** The reason #1409 ran eight days unseen. Fixed in the same change.
>
> **Scored 2026-09-03 -> P3.** Value **1/10** · Difficulty **1/10** · _fill-in_. Every limb was checked by running it, not by reading it. The receipt-conditional excuse is live at scripts/quality/liveness.py:206-257 and the workflow really calls it (.github/workflows/quality-advisory.yml:802-803, with the coverage job's `if: always()` record step and `receipt` output at :510-512 and :341-342); loading the pre-fix file from 4107615cc^ beside HEAD's and feeding both the four-PR production payload, the old one returns no violations while the new one returns "the gate reported ITSELF dead", and a genuine cancel with no receipt stays green in both, so the must-trip and must-not-trip arms are confirmed by direction. The anti-laundering rider is at liveness.py:285-304 with the reworded "A gate that did not finish is dead, not inapplicable", and `pytest tests/test_gate_liveness.py -q` gives 31 passed using the primary checkout's .venv, which closes the gap the item itself named as unrun; no negative_controls.toml entry exists for `gate liveness (advisory)`, as intended. All that remains is flipping the still-open banner at docs/BACKLOG.md:18855, a doc edit that ships nothing runnable. Note for a future filer, not a defect of this item: the pre-existing signal-field hole at liveness.py:147 is explicitly scoped out here and still has no number of its own.
> Verdict: build
Expand Down
Loading