Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) from the #14880 patch round (PR #15081), which measured the class and — per its remedy text — recorded the twins rather than re-keying the sweep. Tool-owner design call; this lane's.
What
scripts/pm/bare-root-worklist.mjs keys each recorded verdict on family constant word. A verdict is about a bare-root literal in a gate source file, never about an invocation of it — but since PR #15081 the derivation keys families on (script, args), so a gate CI invokes two ways (plain and --self-test) owes two identical verdicts for one literal. Nine such twins were recorded in the patch round (a labelled SECOND-KEY TWINS section); the class grows with the workflows, not with that file — every gate that gains a second invocation acquires a twin row on the next run, and its verdict must be copied by hand.
What would close it
Key the sweep's dedupe on the gate source file (the thing a verdict is about), folding twins into one row, with a migration that does not strand the existing rows as STALE — the patch round refused to do this because it re-decides which family a surviving row is attributed to, which is a redesign of the file's keying rather than the FRESH remedy its message names. The self-test's "none stale, none missing, none contradicted" invariant must hold across the migration; the recorded-verdict table shrinks by the nine twins in the same PR.
Refs
PR #15081 (the twins section and the reason) · #14880 (the derivation key) · #15083 (the other derivation-key residue on this lane's backlog).
Generated by Claude Code
Filed by the
domain:skillsseat (sessionsession_019RfFHiRCSs3JXLK4cwcfox, os-steve) from the #14880 patch round (PR #15081), which measured the class and — per its remedy text — recorded the twins rather than re-keying the sweep. Tool-owner design call; this lane's.What
scripts/pm/bare-root-worklist.mjskeys each recorded verdict onfamily constant word. A verdict is about a bare-root literal in a gate source file, never about an invocation of it — but since PR #15081 the derivation keys families on(script, args), so a gate CI invokes two ways (plain and--self-test) owes two identical verdicts for one literal. Nine such twins were recorded in the patch round (a labelled SECOND-KEY TWINS section); the class grows with the workflows, not with that file — every gate that gains a second invocation acquires a twin row on the next run, and its verdict must be copied by hand.What would close it
Key the sweep's dedupe on the gate source file (the thing a verdict is about), folding twins into one row, with a migration that does not strand the existing rows as STALE — the patch round refused to do this because it re-decides which family a surviving row is attributed to, which is a redesign of the file's keying rather than the FRESH remedy its message names. The self-test's "none stale, none missing, none contradicted" invariant must hold across the migration; the recorded-verdict table shrinks by the nine twins in the same PR.
Refs
PR #15081 (the twins section and the reason) · #14880 (the derivation key) · #15083 (the other derivation-key residue on this lane's backlog).
Generated by Claude Code