Skip to content

docs: add ADR-1, the agentic delegation rubric - #990

Open
anadon wants to merge 14 commits into
masterfrom
claude/llm-task-rubric-github-analysis-9pdzp9
Open

anadon wants to merge 14 commits into
masterfrom
claude/llm-task-rubric-github-analysis-9pdzp9

Conversation

@anadon

@anadon anadon commented Sep 22, 2026

Copy link
Copy Markdown
Owner

Nine axes for judging whether an issue can be handed to an agentic LLM
system and finished without the finishing act itself creating a
maintenance liability. Seven additive (specification closure, oracle
strength, blast radius, horizon length, precedent density, context
footprint, reversibility), two capping (environmental determinism,
design authority).

Each axis is anchored to a measured effect rather than intuition:
SWE-bench Verified's 68.3% underspecification filter, the verification-
horizon result on proxy gaming, the ~2x single-file/multi-file success
gap, METR's time-horizon series and the 19%-slowdown RCT, long-horizon
per-step compounding, Chroma's context-rot measurements, GitClear's
duplication and moved-code trends, and the VibeCheck findings on weak
assertions in agent-written tests.

Bands are routing instructions (DELEGATE / DELEGATE-WITH-CHECKPOINT /
SPECIFY-FIRST / HUMAN-LED / HUMAN-ONLY), not quality judgments, and
every grade names the specific debt mode delegation would produce.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK

Nine axes for judging whether an issue can be handed to an agentic LLM
system and finished without the finishing act itself creating a
maintenance liability. Seven additive (specification closure, oracle
strength, blast radius, horizon length, precedent density, context
footprint, reversibility), two capping (environmental determinism,
design authority).

Each axis is anchored to a measured effect rather than intuition:
SWE-bench Verified's 68.3% underspecification filter, the verification-
horizon result on proxy gaming, the ~2x single-file/multi-file success
gap, METR's time-horizon series and the 19%-slowdown RCT, long-horizon
per-step compounding, Chroma's context-rot measurements, GitClear's
duplication and moved-code trends, and the VibeCheck findings on weak
assertions in agent-written tests.

Bands are routing instructions (DELEGATE / DELEGATE-WITH-CHECKPOINT /
SPECIFY-FIRST / HUMAN-LED / HUMAN-ONLY), not quality judgments, and
every grade names the specific debt mode delegation would produce.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
… per-comment one

A parent is graded before its children's bands exist, so a delegable
fraction printed in the parent's own comment would be stale on arrival.
Record the declared roster in the grade instead and derive the fraction
once, corpus-wide.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
…axis definition

The first corpus run produced a degenerate DA distribution (87% at
exactly 1, none above 3) while every other axis showed spread. Cause was
the grading instruction, not the axis: it treated a populated
'Open Questions & Decisions Needed' section as evidence of an open
decision, and that section is mandatory in the JLS templates.

A 66-issue stratified DA-only re-grade measures the bias at +1.23 mean,
strictly one-sided (41 raised, 25 same, 0 lowered). Band impact is 11%,
all D->C; nothing enters A or B and the F population is unaffected.

The axis definition now excludes evidence hygiene, bookkeeping, questions
the issue answers itself via 'Recommended default:', and decisions owned
by a different issue. The substantive finding is that JLS's
'Recommended default:' convention closes most of its own open questions
and materially raises delegability.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
Every open capstone, feature and task graded by an independent agent and
the filled rubric posted to the issue. 0 A-band, 8 B-band, 37 C, 421 D,
222 F.

Principal findings: ~24% of the backlog cannot be closed by any agent at
any capability level because its acceptance evidence requires another
person; 58% of predicted debt is one mechanism (executor authors the
artifact and the evidence certifying it in the same change); the
aggregate delegable fraction of all parent rosters is 8/632.

Includes the measured DA-axis defect and its corrected estimate, plus
three mechanically fixable findings: 42 issues whose deliverable targets
a doc deleted at 4882e93, 194 routing something to the maintainer, and
105 specified against artifacts that do not exist yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
Rates how safely an issue can be handed to an agentic LLM system, and
what debt delegating it as-is would create. Delegability is close to
orthogonal to quality: an issue can be excellent work and still band F
because closing it needs an FPGA on a desk. A low band is a routing
decision, not a criticism, and the section says so in every tier.

Seven additive axes (specification closure, oracle strength, blast
radius, horizon length, precedent density, context footprint,
reversibility) and two capping axes (environmental determinism, design
authority), each anchored to a measured effect rather than intuition.
Each tier fills a yaml block and one prose line.

The canonical anchor table lives in scientific_task.md; feature.md and
capstone.md carry only their tier deltas and refer to it, following the
same cross-template convention the edge-legality matrix already uses.
Markdown issue templates have no include mechanism, so the alternative
was three copies that would drift.

Tier deltas: a feature scores its own integration evidence, not the union
of its children, and reports roster_delegable; a capstone is never a
single delegation, so its useful fields are ED on the system-level
acceptance criteria and roster_delegable over its features.

Three further findings from grading the 688 open issues are folded in as
task rules 11-13:
  11. Oracle custody -- name who authors the expected values and when.
      Same-change authorship of behaviour and golden was the single
      largest predicted debt source, 58% of the corpus.
  12. Artifact paths resolve at filing. 42 open issues name a deliverable
      whose target no longer exists.
  13. Open Questions carry an explicit marker: Recommended default:,
      BLOCKING:, or HYGIENE:. The templates already asked for a
      recommended default in prose; making it a marker is what lets a
      reader and the DA axis tell a made decision from an open one.
      Without that distinction, grading collapsed 87% of the corpus to
      DA=1; with it the axis moved by a measured +1.23.

Verified inert against scripts/validate-issue-template.py on all three
tiers: the new yaml block carries no `tier:` key so it is never mistaken
for the machine block, `band:` does not collide with the banned
`band_mw`, and the new heading shares no leading stem with any canonical
section. Baseline and with-ADR-1 bodies produce identical errors and
warnings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
Replaces the cross-template reference with three complete copies, so a
filer can score an issue from the one template in front of them. Markdown
issue templates have no include, transclusion or file-reference mechanism
in either the .md or the issue-forms .yml dialect, so single-sourcing
would have required generating the templates from a fragment at build
time. Drift risk is accepted deliberately: when an axis changes, it must
change in all three.

The copies are re-anchored per tier rather than duplicated verbatim,
because the task anchors are meaningless at the other two tiers -- "one
file, or one new file plus its test" does not describe a capstone's blast
radius.

  task      unchanged; scores the change itself.
  feature   scores the feature's OWN deliverable, the integration evidence
            in section 5 and the contract in section 3, never the union of
            its children. BR/HL/CF are re-anchored to the
            wait-then-reconcile-then-verify chain and are 0-1 for a
            composing feature by construction. OS calls out that "every
            child closed" is the roster, not an oracle. Adds
            roster_delegable over requires_tasks.
  capstone  scores section 4's system-level acceptance criteria. HL and CF
            are stated as 0-1 by construction with the honest two-value
            anchor; a score of 2-5 means this is not a capstone. RD notes
            that capstones are where irreversible-outside-the-repo
            concentrates, because capstones are what announce things. ED
            is marked the key field of the block, since it is invariant to
            model capability. Adds roster_delegable over
            requires_features.

Each copy now carries the full nine anchors, both deductions, the band
arithmetic, the debt-tag precedence, and the three filing checks the
scientific-task template states as rules 11-13.

Re-verified against scripts/validate-issue-template.py: synthetic
conforming bodies for all three tiers produce identical errors and
warnings with and without the section.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
The sections had specialized twice over: to this project's toolchain and
file formats, and to the one grading exercise that produced them. Both
kinds of detail rot, and neither belongs in a template a filer reads years
from now. Every domain-specific name and every corpus statistic is gone;
the anchors are now written against generic software concepts -- a
published format, a registry, an external toolchain, a repository-wide
invariant, the project's standard build-and-test command. A short
rationale block replaces the statistics with the general effects the axes
are anchored to, stated as effects rather than as numbers from one
backlog.

Six defects found by reviewing the generated result rather than the
generator:

1. GOLDEN-LOCK-IN contradicted its own trigger. It fires on RD=2 AND
   OS>=4, but it was described as an expected-output artifact authored by
   the work it certifies -- which fires the OS deduction, capping OS at 3,
   so the trigger could never fire for the case it described. Re-described
   to match: a load-bearing expected artifact later work is graded
   against, correct today, whose liability is entrenchment. The
   same-change case is HOLLOW-ORACLE, and the boundary is now spelled out
   in both tags.
2. Tags forced by a tier's structural bounds carried no information.
   PARTIAL-INTEGRATION fires on CF<=1 and SCOPE-EXHAUSTION on HL<=1, both
   of which the outcome tier declares bounded by construction, so both
   were guaranteed there and said nothing about the issue. Added the rule
   that a tag met only because of a tier bound reports the tier, not the
   issue.
3. Band A is unreachable at the outcome tier -- with two axes bounded at
   1, RAW cannot exceed 27 -- and nothing said so, leaving a filer to
   wonder why the top band never occurs. Now stated as intentional.
4. That tier's action enum omitted DELEGATE-WITH-CHECKPOINT even though
   band B is reachable at RAW 24-27.
5. "0-1 by construction" overstated the composition tier's horizon: a thin
   feature really can be a one-hour integration check. Softened to the
   ordinary case, with a prompt to justify a high score.
6. The version marker had no bump protocol, so drift between the three
   copies was undetectable by the one mechanism provided for it. Changing
   an axis now requires bumping the marker in every copy; a copy whose
   marker disagrees with its siblings is stale by definition.

Verified: no residual project vocabulary in any section, all nine axes and
all eight debt tags present in each, no ADR yaml block carries a `tier:`
key, and synthetic conforming bodies for all three tiers still produce
identical validator errors and warnings with and without the section.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
Band A was unreachable there, but not because anything said so: two axes
were bounded at 1, which caps RAW at 27 against a threshold of 30. That is
a numerical side effect standing in for a design statement, and it was
wrong twice over.

It contradicted the section directly above it. The header says to score
this tier's OWN deliverable and never the union of its features; the
horizon anchor then forced the score to reflect the composed multi-week
programme, which is exactly that union. The composition tier already had
the correct rule -- measured after the roster lands, not the sum of the
children's horizons -- and it simply was not applied one tier up.

It also made the rubric lie about real issues. A capstone whose features
have all landed and whose acceptance is one scripted walk-through against
a committed transcript has a short chain and a small footprint, and must
be allowed to score like one. Waiting on an unlanded roster is an ordering
dependency: it belongs in the roster and in blocked_by, not in a horizon
score.

Horizon Length and Context Footprint at that tier now carry full 0-5
anchors scoped to the acceptance pass -- demonstrate, reconcile, record --
with an explicit note that scoring high while the roster is incomplete
means the wrong thing was scored. Blast Radius likewise: acceptance that
only observes scores high, acceptance that must change production code to
become demonstrable scores low, and that is a signal the features did not
finish the job.

Every band is now reachable at every tier. The tier still tends to land
low, because acceptance criteria are the least likely to be closed and the
most likely to need a person -- but that now has to be earned by the
scores rather than imposed by the arithmetic. The action enum regains
DELEGATE, and the yaml axis comments no longer assert bounds they should
not.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
Nine reviewers -- three lenses (internal consistency, adversarial filer,
generality and rot) across all three templates, none told who wrote the
section -- returned 137 findings, 29 critical, and all nine verdicts were
"not fit to ship". The convergent findings were right.

Design Authority contradicted itself in three places at once. Anchor 3
scored a named decision carrying a stated preference as 3 (cap B) while
the exclusion list said that exact case does not lower the axis at all;
five reviewers found it independently. Since the templates instruct filers
to give every open question a recommended default, the anchor reading
capped essentially every conforming issue at B, and the section's own
advice -- that answering an open question is the cheapest way to raise a
band -- was false. Anchor 3 is now for a preference offered pending
someone else's confirmation; a preference an executor may act on is a
decision MADE and scores 4.

The axis also routed decisions owned by another issue to Horizon Length,
which has no anchor that can receive them and which now explicitly refuses
waiting; the case was scored nowhere. An unmade decision owned elsewhere
is anchor 1. Only an ANSWERED decision cited from elsewhere is excluded.

Both capping axes were monotone in disclosure: every penalty keyed on what
the filer wrote down, so an issue that named no decisions and demanded no
awkward evidence scored best. That is the exact inverse of the intent.
Both now say to score what the work requires, not what the text lists, and
an "N/A -- fully specified" no longer supports a high score by itself.

Environmental Determinism banded F on "a second maintainer holding
approval rights" -- ordinary branch protection in most projects, and the
literal definition of band B's checkpoint. It now scores only people whose
participation produces evidence; review and merge approval are explicitly
not ED factors.

Oracle Strength gave 4 for any standing project-wide gate, which every
change already passes, so the axis was pre-inflated on every code-touching
issue. It now requires a gate this change would fail before the fix.

The tag boundary fixed last commit only held for the 2-point deduction;
the 1-point deduction left both GOLDEN-LOCK-IN and HOLLOW-ORACLE firing at
once. HOLLOW-ORACLE is now keyed to the 2-point deduction specifically.
The yaml also could not record which deduction fired, though two tags
depend on it; added os_deduction.

At the outcome tier, the Horizon Length 2-anchor restated the tier's own
entry condition -- criteria no single feature covers -- so every legal
issue of that tier matched it and the axis was pinned low by a second
route. Removed. Its two horizon instructions also contradicted each other
on whether an incomplete roster forbids a high score; the rule is now to
score the pass as it will be once the roster lands and never to count
waiting. And the acceptance pass could be emptied on paper by assigning
its harness to a feature; unbuilt machinery is now scored wherever the
work sits.

Rejected one finding: tier-adjusted band thresholds. It was written
against wording that called two axes structurally bounded, which the
previous commit removed; with every axis unbounded at every tier the
shared 0-35 thresholds are correct.

Verified: no residual project vocabulary, all nine axes and eight tags
present in each copy, and synthetic conforming bodies still produce
identical validator diagnostics with and without the section.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
Round 2 of independent adversarial review -- 15 agents, five lenses, blind
to round 1 -- returned 230 findings and 15 of 15 "not fit to ship". The
number that mattered was not the count but the trend: defect density per
agent was flat (15.2 -> 15.3 findings, 3.2 -> 2.9 critical), and 80% of
the new criticals quoted wording introduced by the round-1 FIX commit.
Patching was creating defects about as fast as it removed them, because
every clarification added prose and prose was the substrate the
contradictions lived in.

The structural cause was two places to score one fact. Each capping axis
had an anchor ladder AND a parallel exclusion list, and four of the top
clusters were the two disagreeing: an unmarked open question scored 2 by
the filing check and 5 by the hygiene exclusion and 1 by the BLOCKING
marker; a decision owned elsewhere was anchor 1 and simultaneously
excluded; a self-answered question was anchor 3 and simultaneously
excluded.

v2 folds every exclusion into the ladder it contradicted, so each fact
pattern is scored in exactly one place, and states that rule explicitly.
The sections drop from ~300 lines to ~95 of rubric, and from 61-65% of
each template to 34-50%.

Substantive fixes carried in the rewrite:
  - DA anchors now name the marker that produces them, and rule 13 gains
    the fourth marker the ladder needed: PROPOSED, a preference the filer
    may draft but not land. Anchor 3 previously described a state the
    marker vocabulary could not express.
  - DA anchor 4 no longer self-certifies: a stated preference clears the
    cap only when forced by existing code, by a declared contract, or by
    the filer's own authority.
  - An unmarked open question is scored on its substance and the marker
    fixed, rather than scored worse than the same entry marked honestly,
    which had inverted the incentive the marker rule exists to create.
  - ED distinguishes reviewing a diff, which is the band-B checkpoint and
    does not score, from running the software and reporting what happened,
    which is evidence production and does.
  - OS deductions are cumulative with a stated floor; os_deduction records
    the total 0-3, since both can fire at once and a 0|1|2 field could not
    say so.
  - New tag IRREVERSIBLE-PUBLICATION for RD<=1, which no tag covered.
  - Debt tags are selected by first trigger in a fixed order, replacing
    "most severe applicable", which required a severity judgment the list
    never supplied.
  - roster_delegable takes `pending` when children are unscored, which is
    the common case at filing.

Verified: all nine axes and all nine tags present in each copy, no
residual project vocabulary, no parallel exclusion list remaining, and
synthetic conforming bodies still produce identical validator diagnostics
with and without the section.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
Two checkboxes and a machine field recording whether an adversarial read
and a peer read of the issue itself left anything substantial outstanding.
This is the cheap filter the scores could not provide on their own: an
ADR-1 band describes the issue as written, and says nothing about whether
anyone has tried to break it.

Self-ticked by design, per the maintainer's call: the implementer is
assumed competent, so a separate reviewer is not required and the gate
stays fast. "Substantial" is defined so the box means the same thing
across filers -- a finding is substantial when acting on it would change a
score, a completion criterion, a prediction, or the scope; wording is not.
Unticked means not yet reviewed, which is neither a defect nor a bar to
filing; it means the band is still unvalidated. review_evidence points at
a review comment where one exists, and is optional.

Placement checked rather than assumed: the boxes sit in the delegability
section, and validate_hygiene's H09 scopes its ticked-box audit to
section_content(DOD_HEADING[tier]), so these cannot be mistaken for
Definition-of-Done items. The validator remains inert -- synthetic
conforming bodies produce identical diagnostics with and without the
section.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
Eight of fifteen independent reviewers cited one sentence added in the v2
cut: 'where two rules could apply to one fact, the anchor ladder wins'.
Read literally it nullifies the specification-closure cap and both oracle
deductions, since every non-anchor rule in the section speaks to facts an
anchor also speaks to. It was introduced as the fix for the contradiction
problem and became the document's most-cited defect. Scoped to anchor-vs-
anchor, with caps and deductions applying on top.

Also: GOLDEN-LOCK-IN could not fire. Its trigger required OS>=4, whose
anchors describe comparison against a PRE-EXISTING artifact, while RD=2
describes this work COMMITTING the load-bearing one -- the two could not
hold together. Trigger reduced to RD=2; the tag ladder's first-match order
already routes self-certified cases to HOLLOW-ORACLE above it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
The previous commit landed them on the task template only: the preamble
wraps differently in the other two copies and the replacement did not
match, which is the drift cost of three standalone copies arriving on
schedule. All three now carry the same rule.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
A control run settled how these review numbers should be read. The same
twelve agents, same four lenses, same instructions, pointed at the mature
pre-existing templates -- written by the maintainer, iterated for months,
governing 688 open issues -- returned 13.9 findings and 2.4 criticals per
agent, and twelve of twelve "not fit to ship". The new section reads 16.6
and 3.0, also twelve of twelve. A ratio of 1.19.

The instrument does not discriminate. Three rounds of density measurement
said almost nothing about this section's quality, and the reasoning built
on that trend -- that patching was not converging, and that length was the
cause -- rested on an uncalibrated measurement. That is the same error as
the design-authority axis, one level up, and it ran for three rounds
instead of one.

What does discriminate is convergence: how many independent reviewers
quote the same text. Thirteen of fifteen cited the tie-break sentence, and
it was a real defect. One of fifteen cited an undefined term, and it was
not. Applying a three-reviewer bar to round three leaves three findings,
all fixed here:

  ED anchors 2, 1 and 0 overlapped (9/15): a platform-dependent test
  matched all three, so the same evidence capped at C or at F depending on
  the reader. They are now disjoint on a single question -- could
  automation ever produce this unattended -- answered yes-but-not-
  provisioned, no-because-physical, no-because-human.

  DA anchors 3 and 1 both claimed a PROPOSED entry (7/15). Split on
  whether work can begin: BLOCKING stops a start and is 1, PROPOSED lets
  work proceed against the stated preference and is 3.

  roster_delegable ignored unfiled planned entries and, at the outcome
  tier, requires_capstones (3/15). Now defined over every filed
  composition entry, with unfiled planned entries making the fraction
  provisional.

Findings below the bar are left alone deliberately. On this evidence they
are indistinguishable from what the same lenses produce against a document
already in production.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KuwcuCS5Uv5C8ZRXMXMKdK
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants