Repository navigation
Description
The provenance build plan's Phase 8 promotes the repo-wide sweep, the combined upstream-drift
convention engagement, and the narrow CI regression gate for the cleaned state into their own
sub-topic. This issue is that promotion artifact, and it is the Brief the sub-topic runs from.
Why this is an issue rather than docs/topics/provenance-sweep/PLAN.md
The plan named a contract slice as the promotion target. That target is not merge-able:
docs/topics/<slug>/ is Contract tier, branch-only, and scripts/check-contract-slice-prune.sh
hard-fails any new path there on the way to main — the parent topic's own slice was pruned for
exactly this reason (#3456). The work-item tracker is the graduation route the topic-docs
lifecycle names for actionable follow-ups, so the Brief lands here. Nothing about the plan's
content changes; only its vessel.
Precondition, and it is a hard one
The sweep cannot apply dispositions yet, and this is the gate's own arithmetic rather than a
blocker to route around. The golden set ships at 10 cases across four groupings, so no class
reaches min_n_per_class 10 and every class is report-only at v1. fix and sweep apply
dispositions to fix-eligible findings only, and at v1 there are none.
So the sub-topic has two distinct stages, and the first does not wait on the second:
- A report-only sweep is runnable now and is worth running: it produces the corpus-scale
telemetry (fetch counts, cache hits, carve-out declines, not-found rates) that the convention
engagement needs as evidence, and it harvests adjudications into golden cases. - A disposition-applying sweep unlocks only once the growth loop carries
verbatimand
near-verbatimpast n=10 at or above the 0.95 precision bar. That is the named exit condition
of the first growth round in provenance plugin: phases 6 to 8 (golden set and measurement, crosswalk registration, sweep) #3458.
Running stage 1 and feeding its adjudications back is what makes stage 2 reachable. Reversing
them is not an option.
Measured baseline entering the sweep
From the Phase 6 measurement (recorded in plugins/provenance/CHANGELOG.md): over 1,347 tracked
markdown files after carve-outs, 525 stamp candidates, 482 parsed, 43 declined, 0 expired at the
180-day default. Golden set: 10 cases, overall 8 tp / 0 fp / 0 fn / 2 tn, every class report-only.
The adversarial rotation probe (design thread T15) returned a real limit worth carrying into the
sweep: at roughly one substitution every four words, containment goes to 0.0 with no matched
spans against a source that was fetched and identity-checked. Word-shingling is evadable by an
author who intends to evade it, and no value of min_containment above zero recovers a passage
with zero matching shingles. The sweep should expect a floor on what the deterministic half can
confirm, and should not read a clean fingerprint as proof of originality.
Execution contract (inherited from the parent Brief)
- One tracked file at a time. Apply the verdict, verify (semantic diff plus pointer liveness),
close. - A file is closed when every finding in it carries a disposition or an explicit neutral
outcome — never when the interesting ones are done. - Record each closure in the sweep ledger so an interrupted sweep resumes without re-deciding
closed files, and so the closure count is a fact rather than a memory. - Carve-outs stay categorical. If the sweep starts accumulating per-instance suppressions, that is
evidence a carve-out is drawn wrongly, and the fix is to redraw it inrubric.md— not to keep
a suppression list. This matters beyond tidiness: see the convention engagement below.
The two additions the parent plan requires this Brief to carry
- The live no-breadcrumb (
not-found) probe, as a first-run validation item. That disposition
has never been exercised live — every spike source was supplied by hand. The sweep's first
genuine no-breadcrumb candidate validates that the searched-surfaces listing names every
surface actually checked, and that budget exhaustion reads as a first-class neutral outcome
rather than as an acquittal. - Sweep resume semantics. The fetch ceiling and the response cache are scoped per SWEEP, not
per invocation, and both are recorded in the closure ledger. A resumed sweep therefore neither
resets its spend nor silently reuses a stale cache. The ledger is checkout-local; state that
explicitly, because a sweep resumed in a different checkout is a new sweep.
The convention engagement (fires at sweep completion only)
Drafted in full at docs/specs/provenance-convention-engagement.md. It executes as one entry
in docs/conventions/upstream-drift/CHANGELOG.md, carrying three parts:
- Recorded-decision re-derivation. chore(conventions): plugins restating upstream harness facts are not adopters of upstream-drift, so stale claims never surface #2273 deferred an adoption gate with its own stated
trigger: "a detector is demonstrated that separates an upstream restatement from an in-repo one
without a suppression list." Sweep completion either is that demonstration or it is not, and
the engagement says which from evidence — the closure ledger, the measured precision/recall at
the stated minimum n, and the carve-out record showing categorical exclusions only. If the
sweep accumulated per-instance suppressions, the bar is not cleared, the trigger has not fired,
and the engagement records exactly that with the count.
The honest expected outcome, stated now so the engagement cannot overclaim later: the detector
is LLM-led with deterministic verification, so the enforceability row moves at most from
reasoning-only to detect-then-judge, and a deterministic suppression-free CI gate in the
*-gatepattern remains unavailable. - Enforceability table update, version bump conditional. Major bump ONLY if an enforceability
verdict changes; otherwise a minor entry with the as-of date refreshed and the outcome stated,
drift or no drift. - The trigger-less-stamp table-row flip. Partially pre-consumed: the check's code shipped in
Phase 3 and its crosswalk row in Phase 7 (feat(provenance): documentation-provenance audit plugin (phases 1 to 5) #3456 and the Phase 7 work). What remains here is
exactly the convention's own row moving from "named but not built" to "built, off-by-default,
repo-override enabled", plus the build-trigger bookkeeping. The registry row's early presence
is scheduled, not drifted.
Also recorded at the same firing: the hash-store designed-issue trigger evaluated against the
sweep's fetch telemetry; the dead-pointer round-trip wiring (the weekly link-check lane routing
to the demotion path in reference/dispositions.md); and the adopters table, where rows are
added only for surfaces that actually conform, with #2297 getting its closure evidence if the
repository ends the sweep conforming.
What the engagement never does: declare the migration playbook's plugin-eval deferral trigger
fired; rewrite prior changelog entries or dated records; or convert a judgment verdict into a
deterministic claim — report-only tiers stay report-only whatever the sweep measured.
Checklist
- Grow the golden set past
min_n_per_classforverbatimandnear-verbatim(provenance plugin: phases 6 to 8 (golden set and measurement, crosswalk registration, sweep) #3458) - Run the report-only sweep; record closure ledger, telemetry, and adjudications
- Validate the live no-breadcrumb
not-foundprobe on its first genuine case - Confirm sweep resume semantics (per-sweep ceiling and cache, checkout-local ledger)
- Disposition-applying sweep, once a class is fix-eligible
- Execute the convention engagement as one
upstream-drift/CHANGELOG.mdentry - Evaluate the hash-store designed-issue trigger against the sweep's fetch telemetry
- Wire the dead-pointer round-trip to the weekly link-check lane
- Narrow CI regression gate for the cleaned state
Related
- provenance plugin: phases 6 to 8 (golden set and measurement, crosswalk registration, sweep) #3458 — phases 6 and 7, and the golden-set growth this sub-topic depends on
- feat(provenance): documentation-provenance audit plugin (phases 1 to 5) #3456 — phases 1 to 5, where the plugin, its scripts, and the trigger-less check shipped
- Refs chore(conventions): plugins restating upstream harness facts are not adopters of upstream-drift, so stale claims never surface #2273 — the upstream-drift recorded decision this engagement re-derives
- Refs chore(plugins): 12 unstamped upstream harness claims across 11 plugins — upstream-drift adoption backlog #2297 — the fleet's open-carriers issue, which gets its closure evidence here
docs/specs/provenance-convention-engagement.md— the engagement, drafted in fulldocs/specs/provenance-design-threads.md— T15, the adversarial probe whose limit is recorded above
Metadata
Metadata
Assignees
Labels
Type
Fields
Work status
Activity
feat(provenance): golden set, crosswalk registration, and two defects…
fix(provenance): correct a stale Phase 6 baseline, and pin its as-of …
feat(provenance)!: rubric v3 states the scope C3 and C4 are graded at
kyle-sexton commentedon Aug 28, 2026
Stage 1 report-only sweep: first run, recorded
Ran the report-only sweep across the whole corpus at
d7e391da, split into two judgment legs (docs/,plugins/) plus a mechanical telemetry leg, each with an independent fresh-context verifier. No dispositions were applied and no tracked file was edited by any sweep leg: at v1 no class reachesmin_n_per_class, so applying one would be a correctness violation rather than a shortcut.Checklist movement
not-foundprobe on its first genuine case — validated, with a gap found.min_n_per_class— candidates harvested below; not yet converted.Telemetry
d7e391da,--as-of 2026-08-28plugins/work-items/skills/track/actions/add.md:104Two of these figures are date-relative and expire, which is why the as-of date is pinned: the 180-day zero holds only until 2026-10-05 on the current oldest stamp, and the 60-day count moves daily.
The adoption-bar evidence this issue asks for
This issue states that if the sweep accumulates per-instance suppressions, the #2273 adoption bar is not cleared. It accumulated none. Three categorical carve-outs, no per-instance suppression list anywhere, and two skill surfaces forbid them by design. That is the first evidence on record pointing at the trigger, and it is recorded here rather than in the convention, because the engagement fires at sweep completion and this is one run.
The
excluded_pathsplacement holds as designed: the fixtures exclusion lives in the config layer, not unconditionally inlist-corpus.sh, so the eval harness lifts it while a normal run declines it and says so. The #3041 precedent is live.Resume semantics are not implemented
All three claims in this Brief measured as NOT IMPLEMENTED:
reference/source-fetch.md:110scopescorpus_fetch_ceilingto "the run"source-fetch.md:113-115, cache "lives in the run's memory slice"reference/dispositions.md:152-154,SKILL.md:163-165record closures and guard outcomes onlyCheckout-local holds by design (
docs/specs/provenance-plugin-topology.md:60places the ledger under.work/, which.gitignore:30ignores) but no script enforces it —.work/is referenced by no script at all. The Brief describes intended semantics; whether they were built is what this checklist item measured, and they were not. Recording rather than building, since this run was scoped to measure.Findings
docs/(148 files) does not lexically copy the upstream it cites. Exhaustive 296-comparison sweep, corpus-wide max containment 0.011. The fivedocs/upstream/*.mdrecords tested against a real clone ofmattpocock/skillsscored 0.001–0.009 with zero firings, and their self-declared near-verbatim adoption cites upstream to the correct line.plugins/produced six findings that stand, four of them in one file:plugins/context7/skills/lookup/context/lookup.md:40-41plugins/firecrawl/skills/firecrawl/context/commands.md:36plugins/playwright/skills/playwright/reference/test-generation.md:80lookup.mdreproduces a five-step procedure from the live upstream in order, containment 0.217 with a 26-word span, and carries zero attribution and zero external URLs across 77 non-empty lines. The plugin does attribute upstash — in a sibling file — and C3 grades what is on the page.Tier caveat, found by the verifier: two of those four were tiered on the file-level separation flag, but their per-finding longest spans are 14 words each, below the 15 floor, and file containment 0.217 is below 0.3. Neither arm fires for them individually. They are genuine short copies below the deliberate floor — the floor working as designed — and must not be recorded as
fingerprint-confirmed. Related process deviation: the cited ranges match no module span, so nomination ranges were carried through unrefined against SKILL.md step 7.A materialized drift, outside the tier table's domain:
docs/NATIVE-SURFACES.md:98records a native description absent from both shippedclaudebinaries in this container. The row's own recheck trigger has already fired. This is not drift risk; it is drift.check-stamps.shstructurally cannot see it.T15 reproduced live, twice
The rotation limit is no longer only a synthetic probe.
firecrawl/.../commands.md:36restates(default 5, max 100)from the Firecrawl CLI docs at containment 0.000 with zero matched spans, against a source that was fetched and identity-checked. The verifier control-tested the module rather than trusting the zero (local-vs-itself returns 0.927), so this is a genuine detector miss on a table-row-to-prose restatement, not an operational failure.llm-suspectedis the forced tier: no lexical evidence is possible.Neither leg proposed moving the 0.3/15 constants, and neither read a clean fingerprint as proof of originality.
The no-breadcrumb probe validated, and found a gap
Resolved at rung 4 (local binaries) after a zero-URL file. Budget exhaustion was exercised on a second candidate (404 then 403) and held as a neutral outcome, not an acquittal — correctly, because a further rung then resolved it, and stopping early would have lost the materialized drift above as a false negative.
The gap: the searched-surfaces listing has no mechanical floor.
emit-findings.shhas no field for it, no budget block, no schema. Three prose requirements, zero enforcement — a listing omitting a rung is indistinguishable downstream from a complete one.Also unplanned and worth a decision before stage 2: the stale string's authoritative home is
docs/native-surfaces/records.json:108, outside the markdown corpus and generated, and its rendering says never to hand-edit it. Afixpass would edit a generated file.Detector defects found by running it on itself
docs/upstream/aihero-course.md:127declines as "bare year" while ending in a conforming ISO date — a real stamp silently exempted from expiry.docs/conventions/standards/README.md:134,plugins/claude-config/skills/audit/SKILL.md:171). AlsoSC2034and"cache_read_input_tokens": 2000read as bare years.textfield reports the keyword line rather than the date line, so whoever adjudicates the 44 declines sees misleading context.Adjudication candidates harvested
Rejected findings are the high-value output, because a case converted from a rejected finding is one nobody authored to pass. Harvested, not yet converted: a byte-identical 16-word list of eight product-defined identifiers that fires the separation rule but fails C2 (no other way to write it); a conforming record whose trigger has fired, a shape no golden case has; carve-out 5's reach over
RESEARCH-*.md; and a 0.589-containment/142-word case that turned entirely on grading scope.That last one produced a rubric change: C3 and C4 are graded at different scopes and v2 never said so. Two readers agreed on the verdict and disagreed on which scope produced it. Rubric v3 states it — C3 outward across the file, C4 on the passage — and takes the invalidation: the v2 golden-set measurement does not carry forward, so the set must be re-scored before any precision figure is cited. That pushes fix-eligibility further out, not closer.
Honest limits on this run
plugins/; the rest got path- and stamp-level treatment only.nomination_passesran once, not twice — nominations were not unioned.judge_sampleswas not met: judgments are single-context, not three blind panels. No verdict here carries panel unanimity. Both judgment legs reported this themselves rather than being caught at it.claudebinaries in this container, 2.1.246 and 2.1.250; the finding survived at both, but the pin was wrong). Another leg could not obtain a verifier at all and said so rather than claiming one.Recommended before stage 2
fixpass must not editrecords.jsonthrough its rendering.Generated by Claude Code
fix(provenance): supply the judge the file rubric v3 tells it to grade
fix(provenance): apply the window rule and the v3 file input to both …
docs(provenance): correct three counts this entry got wrong about itself
fix(provenance): four defects the first report-only sweep found, thre…
provenance/audit: vendored-snapshot tier rule; record searched-surfac…
fix(provenance): stop the rubric from carrying its own answer key
feat(provenance): schema-check the not-found searched listing, and st…
fix(provenance): remove two answer-key leaks from the golden set, clo…
kyle-sexton commentedon Sep 6, 2026
This was generated by AI during triage.
Claiming for triage-only evaluation (no execution).
Generated by Claude Code
kyle-sexton commentedon Sep 6, 2026
This was generated by AI during triage.
Triage: verified, oversized, routed human-gated with a decomposition proposal
Stage 1 ran and is recorded in detail. What this pass adds is a current-state re-measurement, which moves two things, and an assessment that the item is too large to route as one unit but cannot yet be sliced cleanly.
Re-measured on current
main,--as-of 2026-09-06The trigger-less check is on and producing 87 findings. All 87 carry
rule-trigger-less-stamp; zero are expiry findings, so the sweep's "0 expired at the 180-day default" still holds. This is directly load-bearing for the checklist's third convention part: the row's move to "built, off-by-default, repo-override enabled" is not pending, the override is live, and 87 is the number the engagement will have to report. Worth capturing before the figure moves.Two of the recorded detector false positives are still present. Reproduced from the declined groups:
plugins/code-tidying/.../shell-tooling.md:38SC2034, a shellcheck codeplugins/context-guard/reference/reader-contract.md:78"cache_read_input_tokens": 2000A third is questionable: a table row in
docs/upstream/mattpocock-skills-v12-map.md:48declines as a bare year with no year in view. And one decline carries a wrong reason string:plugins/github/reference/recipes/billing.md:140readsAs of 2026-07and is declined as "bare year, no month or day" when it plainly has a month.Two recorded defects appear resolved. The ordinary-English "may" false positive no longer appears in any month-name decline (all five are genuine month-name forms, three of them the plugin's own changelog describing this very bug). The
text-field defect is not visible either: every example now shows the matched line. The stamp under-report fixed in #3473 is the likely cause. The issue's checklist does not track these, so their resolution is recorded here rather than ticked.Net: the decline classifier still has a real precision problem across 39 bare-year declines, narrower than at sweep time but not closed.
Why this is oversized
Nine checklist items, three complete. The remainder are not variations on one task, they are five different kinds of work:
min_n_per_class(provenance plugin: phases 6 to 8 (golden set and measurement, crosswalk registration, sweep) #3458) and on re-scoring against rubric v3, whose scope change invalidated the v2 measurement. Two preconditions, not one, and the second was added after this issue was written.Why it is not being decomposed in this pass
Decomposition needs stable slice boundaries, and four unanswered decisions from the stage-1 run sit directly on them:
fixpass would edit a generated file. Until this is answered, nobody knows whether the sweep's disposition scope includes generated surfaces, which changes what a stage-2 slice even contains.min_n. Sequencing this after the re-score wastes the re-score.Slicing before these are answered produces items that get rewritten as soon as they are. That is the specific failure decomposition is supposed to prevent, so this pass stops at the proposal.
Proposed decomposition, for approval in one pass
Blockers first. A maintainer answering the four decisions above can approve this split as-is.
min_n_per_classA and D are executable today and depend on nothing in the decision set. If the maintainer wants movement before sitting down with B, those two are where it exists.
Routing
needs-human, for a genuinely open decision rather than a capability blocker: the four questions in B are spec calls about what the sweep's disposition scope is and what the tier table contains. Neither the decision-defaulted exit nor a delegable one fits, because there is no reversible default available for a question that redefines what the deliverable is.The item stays as the sub-topic's Brief. Nothing here supersedes the stage-1 run comment, which remains the record of what was measured.
Labels: replacing the raw
priority: needs-triagewithpriority: medium(real value, no deadline, and the blocked stages cannot move until B is answered regardless of urgency); addingneeds-human.Triage claim released.
Generated by Claude Code
49 remaining items
kyle-sexton commentedon Nov 2, 2026
Cordoned to the
After zeromilestone by the issue-triage session; not closed. Both open sub-issues, #9755 and #9759, are already inAfter zero, and admission holds this parent until they close (admission comment names both). Leaving it atstatus: readycounted it as lane supply it cannot be. The work stays open and resumes with its children.Posted by the issue-triage session. This was generated by AI.
kyle-sexton commentedon Nov 4, 2026
Disposition sweep, 2026-11-04
Slice 2 of 3 for this issue, from #9755. This ran
/attribution:audit sweeponmainatb54572a9f98b81ce164d222e42cfaa2b8eb46121, in its own worktree. Plugin: attribution 0.15.3. Rubrics: copy v5, restated-fact v1. Sweep idchore-9755-attribution-disposition-sweep-20261104T134320Z. The ledger is checkout-local, so this comment is the record slice 3 reads.Result: zero dispositions applied, no edit, no commit, no PR. Exactly one file reached all three fix gates:
scripts/fixtures/hooks-lifecycle-table.md, a test fixture this run's fence forbids editing. It stays open. Every other judged copy candidate cleared.Closure
Files left open:
scripts/fixtures/hooks-lifecycle-table.md: 3 near-verbatim findings past every gate. The edit is outside this run's fence. Its consumer isscripts/gen-hook-event-registry.test.sh, which reads it as "a saved copy of the Hooks reference lifecycle table".docs/contracts/execution-target/README.md:64-71,plugins/discovery/README.md:26,docs/migration-playbook.md:948-950: each carries one restated-fact finding that survived refutation, in a file another change is repointing links in, so it was left open. Restated-fact is report-only, and the recommended disposition isconvert-to-pointerorcondense-to-stamped-record, by the file's offline need.Read the 277 with care. Slice 3 should not read it as 277 adjudicated files. Only 74 candidates reached a panel, and 1907 of 1958 merged nominations and 532 fired candidates did not. A candidate that never reached a panel is not a finding and was not cleared; its outcome is "not judged (sampling rule)". That outcome is not one of the five dispositions in
reference/dispositions.md. The ledger entries carry it under the labelsneutral xN: nomination not panel-judgedandleave-with-reason xN: fired span not panel-judged, which stretch those labels: the defined neutral outcome isneutral-not-found, andleave-with-reasonis defined for a carve-out, a veto or a human decision. No candidate left unjudged could have been edited here, because the tier and verdict gates require a panel.The fixed rule for model reads
Stated before nomination began: 281 files.
docs/upstream/CHANGELOG.mdand.changes/(the 60th has 13)Another 5,495 corpus files were only enumerated.
Telemetry
**/evals/fixtures/**256 (config),**/vendor/**21 (built-in)corpus_fetch_ceiling200review_agents: 1)Findings
Copy: at every gate, fenced (3)
Rule
attribution/audit/rule-verbatim-copy. Tierfingerprint-confirmed. Source https://code.claude.com/docs/en/hooks, rung 1, identity checked: manifest title "Hooks reference", read 2026-11-04. Containment 0.888. Panels unanimous STANDS. Review SURVIVES.scripts/fixtures/hooks-lifecycle-table.md:1-7scripts/fixtures/hooks-lifecycle-table.md:8-29scripts/fixtures/hooks-lifecycle-table.md:31-37Class:
near-verbatim, because all three judges and the reviewer graded the correspondence as carrying word-level edits. I found no rule in the plugin that defines the line between the two classes, so this run used its own, and the judges' dispatch asked for it before they ran: corresponding sentences with word-level edits are near-verbatim, those without are verbatim. The differences may be upstream drift since the copy was saved rather than an author's edits. Under either class the file was not edited.Copy: judged and cleared (55)
All unanimous. No split on any copy candidate.
skill-authoring/SKILL.md:100-102and:136cleared on copy carve-out 5docs/native-surfaces.mdcarries a generated-output marker; its two candidates cleared, so no finding names its input (docs/native-surfaces/records.json) as a fix site.Restated-fact: relay-eligible, report-only (9)
Rule
attribution/audit/rule-restated-upstream-fact, rubric v1. Unanimous panel, refutation SURVIVES. Never fix-eligible.plugins/app-control/reference/control-skill.md:78-94docs/contracts/execution-target/README.md:64-71(left open)plugins/work-items/tools/work-item-tracker/adapters/github/README.md:676-696plugins/playbooks/skills/fable-5/SKILL.md:126plugins/source-control/skills/pull-request/SKILL.md:44plugins/user-experience/reference/flows-ia.md:134-136plugins/discovery/README.md:26(left open)plugins/code-metrics/README.md:150-158docs/migration-playbook.md:948-950(left open)Restated-fact: human report only (2)
plugins/user-experience/reference/research-methods.md:65-74leave-with-reasondocs/upstream/claude-code-mods/research-2026-09-19/research-contradictions-and-corrections.md:108-115Restated-fact: cleared (5)
plugins/playbooks/skills/boris/reference/autonomy.md:43-60,plugins/debugging/README.md:58-62,plugins/playbooks/README.md:51-58,plugins/context-guard/reference/cloud-headless-capture.md:49-52,plugins/review/agents/security-reviewer.md:81-87.Deterministic
4 expired stamps:
docs/upstream/claude-com-fold-subagents.md:67,plugins/work-items/skills/track/actions/add.md:116, andplugins/attribution/evals/audit-stale-stamps/prompt.md:7andplugins/attribution/evals/audit-stamp-declined-reported/prompt.md:7, which are eval inputs. 56 trigger-less stamps. Report-only; none was judged.Precision and n per class
Relayed, not measured here.
score-golden.shneeds--goldenand--actual, and--actualis a judged run's product; no such file is tracked, so a run on current main would mean re-judging all 56 cases. This run applied no disposition, so the done-when does not call for it. Copy rubric v5 and the golden cases have not changed since the score below, except the tier table's fix-eligible wording in #12369. Whole-set re-score of 56 cases, fromplugins/attribution/CHANGELOG.md:76-83, with fix-eligibility from the owner's ruling:Measured here, and it is not precision. Panel outcomes on real text, with no human adjudication and so no precision figure:
Honest limits
CHANGELOG.mdfiles and the generateddocs/native-surfaces.mdwent to nominators with only the lines within 15 of a fired span. Nominators reported reading the other files whole.evalstree, 180 of them namedskill-fired.md, each with no 15-word span. The separation rule fired on them, but the read rule asks for a span, so they were not model-read. 1483 of 1499 restated-fact nominations (16 sampled, at most one per file, seed 9755, from 115 strong nominations in both passes with no record noted). Every copy-class nomination whose span did not reach the rule, none of which could be fix-eligible.unexpected-content-type, includingraw.githubusercontent.compages served astext/plain, which is the audit's rung 1b route. They include the Claude Codemods/README.md,CHANGELOG.mdandmods/types/claude-code.d.ts; nominators named the last on 22 ranges, more than any other unread URL. Copies of those pages could not reachfingerprint-confirmedin this run.kyle-sexton commentedon Nov 6, 2026
Close audit, 2026-11-06: not closable yet. The issue stays in After zero.
min_nnot-foundprobescripts/fixtures/hooks-lifecycle-table.md, a saved copy thatscripts/gen-hook-event-registry.test.shreads, fenced from that runWhat closes it: a sweep run that gives a no-breadcrumb candidate its budgeted search, one interrupted-and-resumed sweep, and a disposition for the fixture. The fixture is a deliberate copy, so its disposition is most likely a recorded keep, not a rewrite.
kyle-sexton commentedon Nov 6, 2026
kyle-sexton commentedon Nov 6, 2026
Close evidence: budgeted search, interrupted-and-resumed sweep, fixture disposition
Answers the three gaps in the 2026-11-06 close audit. One sweep,
/attribution:audit sweep, over two files:scripts/fixtures/hooks-lifecycle-table.mdandplugins/machine-health/skills/audit/reference/windows/check-catalog.md. It ran on branchchore/3465-provenance-sweep-close, fast-forwarded tomainat50dc172d624, in its own worktree.attribution-3465-close-20261106T023054Z, topicattribution-3465-close.sweep-ledger.shis byte-identical.docs/conventions/attribution.yaml. There is noseparationkey, so the fingerprint ran at 0.3 / 15.1. No-breadcrumb candidate: budgeted search ran, and found the source
Candidate.
check-catalog.md:414-419. It saysLastTaskResult267011 isSCHED_S_TASK_HAS_NOT_RUNand 267014 isSCHED_S_TASK_TERMINATED. The 2026-10-28 run recorded it asnot-foundwith no Task Scheduler page fetched.Surfaces searched, in order:
extract-breadcrumbs.sh --dir)elevation-matrix.md(4 URLs) andremediation-policy.md(0 URLs)searches_per_candidate3): Firecrawl web search forSCHED_S_TASK_HAS_NOT_RUN 0x00041303 Task Scheduler error and success constantswinerror.hdefinitionResolution stopped after search 1 because that search identified the source and the fetch below confirmed both values. This was not the convergence rule, which needs the same top source from two searches. Searches 2 and 3 were not spent.
Fetch. Fetch 1 of 5 (
fetches_per_candidate5) read that page at rung 1 (fetch-docs.sh --profile generic).state: read, HTTP 200,text/markdown, sha2560f45078c….# Task Scheduler error and success constants (WinError.h) - Win32 apps | Microsoft Learn. The generic profile has no page index, so the canonical-slug check did not run. The page listsSCHED_S_TASK_HAS_NOT_RUNas0x00041303(267011) andSCHED_S_TASK_TERMINATEDas0x00041306(267014). Both values in the passage match.Outcome: a source was found, not
not-found. The candidate stays on the restated-fact rubric at tiersource-fetched-similar, report-only. Because the source was found, this run did not re-exercise the neutral budget-exhausted path. The Stage 1 report-only sweep exercised that path (404 then 403, held neutral); see this issue's first comment.Not re-run here. The verdict relays the 2026-10-28 panel: 3/3 STANDS, refutation SURVIVES. No new panel ran.
Recommended disposition:
condense-to-stamped-record, pointing at that page, with a recheck trigger of that page changing either constant. A human applies it. The file stays open in the ledger, the same treatment the 2026-11-04 run gave report-only restated-fact files.Limit. The searched-surfaces listing above is this run's own claim. Per CHANGELOG 0.6.3 and
reference/source-fetch.md, nothing machine-checks it for completeness.2. Interrupted and resumed
Run 1 (first skill invocation):
initat 2026-11-06T02:30:54Z.spend 2,cache-add.spend 1,cache-addat 02:32:26Z.statusat the checkpoint: 1 closed, spend 3 of 200, 2 cache entries.Run 2 (second skill invocation, same checkout and topic):
initprintedledger exists … (a resume of sweep attribution-3465-close-20261106T023054Z).statusrestored 1 closed file, spend 3 (not 0) and 2 cache entriesclosewas refused:already closed, exit 3cache-checkon the Microsoft page printedre-validate … fetch it again and compare the hash. The page was re-fetched with--max-age 0: server 304, sha256 unchanged. That fetch was spent (spend 1) and the page was cached again at 02:33:03ZFinal
status: 1 closed, spend 4 of 200, 2 cache entries.Not exercised here: a resume from a different checkout.
plugins/attribution/skills/audit/scripts/sweep-ledger.test.sh:277-300covers it: another checkout sees a new sweep, and a copied ledger is refused.How the interruption was made. Run 1 stopped deliberately between two Skill invocations in one session, not through a crash or a lost session.
3. Fixture disposition: a recorded keep, by category
scripts/fixtures/hooks-lifecycle-table.mdreproduced the 2026-11-04 evidence against the Hooks reference:Disposition:
leave-with-reason×3, on the test-fixture carve-out. The file is a deliberate saved copy thatscripts/gen-hook-event-registry.test.shreads. It was not edited.Where the keep is recorded. The plugin has no per-instance suppression (
plugins/attribution/README.md:88-91). The finding-suppression contract treats a file the audit should never read as an exclusion, not a suppression. So the keep is a categoricalexcluded_pathsentry. Commit000a7b7523aputs the bundled 0.16.0 default (**/fixtures/**,**/__fixtures__/**,**/testdata/**) back intodocs/conventions/attribution.yaml.Why the default was missing. That file's
**/evals/fixtures/**(#10555, 2026-10-28) replaced the default whole, perskills/setup/reference/keys.md"The test-fixture exclusion". The default itself shipped later (#13354, 2026-11-04).Effect on the corpus.
The fixture is no longer in the corpus. Per-instance suppressions: 0.
Limits
This was a targeted two-file run on candidates named by earlier records. These skill steps did not run:
emit-findings.sh(step 10)The installed plugin is 0.15.5 and the source is 0.17.2.
The skill resolves its config root and its ledger from the session's working directory. A run aimed at another worktree by path reads that worktree's config and writes its ledger there only when it runs from inside that worktree; this run used
env -C.Remaining against the close audit
None of the three items above.
One follow-up:
check-catalog.md:414-419waits on a human to apply the recommended stamped record.chore(attribution): leave excluded_paths unset so the bundled default…
docs(attribution): note that the eval harness lifts the fixture default
kyle-sexton commentedon Nov 6, 2026
Closed: every item is delivered or deferred by owner decision. The last change, #13643, merged at 2026-11-06T03:10Z.
min_n_per_classnot-foundprobedocs/contracts/upstream-drift/README.mdThe gate stays out of this issue under the owner direction of 2026-11-05 to close hardening-tied work and rediscover it one item at a time, the same basis on which #9759 closed. Open follow-up, advisory:
check-catalog.md:414-419would take acondense-to-stamped-recorddisposition, which a human applies.