Repository navigation
Concise skills rollout: attribution (2 skills, 1 model-invoked) #6599
Copy link
Copy link
Labels
host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.Needs an unattended run on a host; the host runner takes it, not a person or the issue lane.priority: mediumReal value, no hard deadline; normal backlog flow.Real value, no hard deadline; normal backlog flow.status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.A maintainer confirmed the item is real and in scope; ready to be worked.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.A briefed fix or small feature; blast radius bounded by the brief, tests exist.
Description
Part of #6476. Rewrite attribution's skills to the skill criteria in one draft PR, following the per-plugin runbook (/playbooks:skill-authoring, reference/rewrite-a-plugin.md). The runbook and the rewrite protocol it cites decide what ships; this issue holds only what is specific to the plugin.
The plugin today
As of origin/main on 2026-10-24:
- Skills:
audit(model-invoked);setup(user-invoked). - Outcome eval case directories under the plugin: 0. Probe files under
probes/: 0.
Done when
-
/skill-quality:check plugins/attributionon the PR head reports no FAIL that the run on main does not. -
/evals:validatepasses onplugins/attribution's eval suite at the PR head. - Each model-invoked skill has a probe file:
plugins/attribution/probes/audit.json. - The PR body holds a per-skill decision table, description and body decided separately, with the before and after numbers behind each row.
- The PR body names every skill or case left unmeasured, with the reason.
- The plugin's version or changelog entry is in the PR, per the plugin's release mode.
Eval spend and review
- Eval passes within prepaid API credit are pre-approved (owner decision Q46, 2026-10-24), at the
--max-cost-usd 5per-pass ceiling set on #6476 on 2026-10-18. - No person gates the PR: the owner's 2026-10-24 decision (C12) leaves only an intent mismatch during the build or a security issue at review as stops.
Generated by Claude Code
Metadata
Metadata
Assignees
Labels
host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.Needs an unattended run on a host; the host runner takes it, not a person or the issue lane.priority: mediumReal value, no hard deadline; normal backlog flow.Real value, no hard deadline; normal backlog flow.status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.A maintainer confirmed the item is real and in scope; ready to be worked.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.A briefed fix or small feature; blast radius bounded by the brief, tests exist.
Type
Fields
No fields configured for Task.
Activity
github-actions commentedon Oct 7, 2026
Proposed work class: work-class: scoped
Basis: automated intake triage; the lanes App applied this class.
Size: Medium
Complexity: Medium
Uncertainty: Known
Flags: none
Blocked by: none
Understood: rewrite the two
attributionskills (audit, model-invoked;setup, user-invoked) to the skill criteria in one draft PR, following the per-plugin runbook. Done-when covers skill-quality and eval validation, a probe file foraudit, a per-skill decision table in the PR body, unmeasured items named, and a version or changelog entry. Eval spend is prepaid and pre-approved, so no cost flag. I found no missing information and no likely duplicates. This is part of #6476.Automated triage, applied by the lanes App.
kyle-sexton commentedon Oct 24, 2026
Released by the owner's HITL session (2026-10-24, C12): it waited only on a removed gate. Intake triage re-runs on it to set its fields, then admission takes it.
github-actions commentedon Oct 25, 2026
The triage sweep dispatched intake triage for this issue (attempt 1 of 2).
6 remaining items
kyle-sexton commentedon Oct 31, 2026
kyle-sexton commentedon Nov 1, 2026
Progress: eval cases and the trigger probe landed in #11757. This issue stays open.
audit, 2 forsetup) underplugins/attribution/evals/, with deterministic graders and pass and fail samples, plus the frozen probe fileprobes/audit.json(18 queries). In the smoke pass every case scored 1.00 with the plugin and 0.50-0.75 without it.auditmade sandbox-denied lookups while resolving thereviewplugin's contract. A fix was tried and reverted on review: the lookups work outside the eval sandbox, so they are a sandbox limit, not a skill defect.kyle-sexton commentedon Nov 1, 2026
kyle-sexton commentedon Nov 1, 2026
Host run. The #6599 pass measured a concise rewrite of the
attributionskills on Opus 5.5 and Sonnet 5.5. No part met the no-loss rule written before the first paid run, so no text ships and no PR was opened.Result
Words shipped: 0 (0%).
audit/SKILL.mdstays at 2726 words andsetup/SKILL.mdat 1915.Words tried in measured passes: 200 of 4641 (4.3%).
auditdescription: 137 to 99. The cut was the mechanism detail: "Breadcrumb-first, then budgeted search", the rubric and tier sentences, "behind a semantic-diff guard and live pointer checks", and "Empty target audits tracked markdown". All 9 quoted trigger phrases were kept.setupdescription: 136 to 55. It became a summary plus when to run it, with no quoted trigger list, since the skill is user-invoked.setupbody: 1760 to 1679. Two Gotchas bullets that restate body sections were cut: the per-key edit and the fixture exclusion.Cuts the meaning diff restored before any paid run:
disable-model-invocation: trueunder the setup contract" sentence;After those restores the
auditbody was byte-identical to before, so it was not tried.auditdescriptionroutes-auditcheck, are INVALID.auditbodysetupdescription + bodyWhat ran
Claude Code 2.1.316, base
6e9c55e4e6.claude plugin evalran before and after copies launched together, with these flags on every pass:--ablation none --runs 3 -j 2 --keep-temp --judge-model opus.--scaffold --allow-tools Bash Write Edit --threshold 0.8.--eval-dir trigger-evals --threshold 0 --disallow-tools Read Glob Grep.The suite and probes:
7b58feb034c0). One change was made, in the run copies only:routes-auditarmbothtowith-only, a no-op under--ablation none.probes/audit.jsonwas not read.evals/plustrigger-evals/:fedba3b10011.Two fresh
compare-labeleragents ran each meaning-diff round. Round 1 found 4 losses as a union and round 2 found 1; all were restored verbatim or in plain words. Every other difference was labeled RELOCATED or FALSE POSITIVE.setup-*setup-*audit-*audit-*Scores from VALID pairs only:
setup-apply-rejects-misplaced-keysetup-check-writes-nothingWhy it fails
auditdescription. On Sonnet the shorter description fired on held-out near-misses that the before text left alone: 3 of 24 after, 0 of 24 before. Two queries drove it, one of them firing in 2 of 3 runs. The rule needed after to be no worse than before minus 0.05 on both polarities, on both models. The cut removed the mechanism sentences that set this skill apart from neighboring jobs, which is a plausible cause but was not proved by a restore. The held-out set is now spent, so a partial-restore variant needs a fresh blind set in a new round.setup. Both cases scored 1.00 in every run on both versions and both models. The preregistered rule asks the noise report for "non-inferior". With 2 cases that report can only say "n too small to call", and the suite was frozen, so the rule could not be met. The rule was not loosened after the numbers were in. Next round: add a third setup case before freezing, or preregister "n too small" as no measured drop, as Concise skills rollout: ai-briefing (2 skills, 1 model-invoked) #6597 did.auditoutcome pairs. All four passes were INVALID on permission denials, on both versions. The denials are the step-11 producer-contract lookup test(attribution): add outcome eval cases and audit trigger probes #11757 already reported: a Glob orlsabove the plugin copy forfindings-file-shape.mdorreview/skills/fanout/SKILL.md, and acurlof the contract from raw.githubusercontent.com. Sonnet also tried acurlof the fixture'sdocs.example.invalidlink. The unused with-arm means were identical per case. The preregistered denial reruns were skipped, because no rerun could change a decision: the body was unchanged and the description had already failed on Sonnet.Spend: 51.92 USD list-price estimate (sum of
costUsd, 12 passes), wall time 39.5 min, subscription login.Disclosure: the outcome passes, which grant Bash, ran through the plugin-eval Docker link swap (
docker-links.py run), because a Docker config file on the host is a link the sandbox refuses. The plugin-eval guidance reserves that swap for the user's yes. This lane ran it without one, while another lane on the host was already running under the same swap.Remaining
The issue can close with no text change. Both skills keep their text for the reasons above. The step-11 lookup that sends
auditsearching outside its workspace is still open from #11757, and it keepsauditoutcome passes INVALID until it is fixed.Kept for a later round: the after copy, the preregistration and all traces are kept off-repo on the lane-3 host. The branch
feat/6599-concise-attributionholds no commits. Nothing was closed.kyle-sexton commentedon Nov 1, 2026
Closing on the measured result above: no part passed the ship rule, so the current text stays.
kyle-sexton commentedon Nov 1, 2026
Reopening for
setuponly. Its frozen suite has 2 cases, and the noise report cannot call non-inferiority below 3, so the preregistered rule could never pass, whatever the text. Every case scored 1.00 on both versions and both models. Next: add a thirdsetupcase, then re-measure the setup cut. Theauditdescription result above (a VALID Sonnet trigger loss) stands.kyle-sexton commentedon Nov 2, 2026
Reopened (lane 3): the #12159 body cut failed a retroactive negative control, so its body part is being reverted. The description change stays.
Owner rule (2026-11-02): a cut ships only if its suite scores a deliberately broken copy clearly below the before version. #12159 merged before the rule existed.
Body part: FAIL. The broken copy is the setup body with its five procedure sections emptied (1753 → 725 words). It ran on Sonnet 5.5 against a fresh pass of main's body launched with it, on the 3 setup cases. The merged compare:
The mean drop is 0.058 against the 0.15 required. The noise report gave -0.06 (95% interval -0.14 to +0.02) and called no case drop. The broken copy's misses are real
retirements-checkedfailures, but too few for the rule, so the suite cannot reliably tell the body from one without its procedures. The two Gotchas bullets the cut removed come back in a revert PR.Description part: not applicable. The skill has
disable-model-invocation, so its description never reaches routing and no control can measure it. Reverting it would change nothing, so it stays.This issue stays open for setup cases that depend on the procedure sections. Cost of the control: 5.94 USD (list-price estimate, the sum of
costUsd).