Takedown relevance judge rejects ruled feature tickets as not relevant #1642
Labels
No labels
P0
P1
P2
P3
bug
category/code-change
category/cross-repo
category/eval-run
category/investigation
category/no-test-target
category/owner-ruling
category/prose-artifact
category/recurring-chore
category/structure
category/umbrella
crc-refactor
create
delete
enhancement
filed-by/agent
filed-by/user
frozen
lint-rule
needs-info
needs-triage
next
plugin/cc-architect
plugin/os
plugin/os-adr
plugin/os-aidd-lint
plugin/os-backlog
plugin/os-context
plugin/os-doc-hygiene
plugin/os-sdlc
plugin/os-vault
project/cc-os
ready-for-agent
ready-for-human
recurring
review
rule-proposal
update
waiting
wayfinder:grilling
wayfinder:map
wayfinder:map
wayfinder:research
wayfinder:task
wayfinder:task
wontfix
worklist/deviations
worklist/lint-rule
worklist/new-implement-build
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jared/cc-os#1642
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
The takedown relevance step judges current harm. A ruled feature increment has no current harm by design, so the judge returns
not_relevant. ticket-decompose step c routes every ticket that needs a new object to/os-sdlc:ticket-takedown. So every ruled feature that needs a new object stops at the relevance step, and nothing writes its Owner sketch.Observed
Run
docs/takedown/1634-20261108-125409on #1634 (test taxonomy classifier, increment 2 ofdocs/research/mutation-testing/plan-v1-2026-11-08.md, ruled by Jared 2026-11-07 and 2026-11-08). The relevance-judge returned"harm_path_live": false,"verdict": "not_relevant", with the reason: "No such pass runs today, so no one is harmed now." The judge named the future consumer itself ("A future whole-codebase redundant-test pass (plan increment 4) would call the classifier"). #1636 is that consumer.Reproduce
Run
plugins/os-sdlc/eval/ticket-takedown/bin/takedown-run --live 1634from the repo root. The run fails at step 02 withFAILED relevance: relevance: not relevant.Approach
Decision record: ADR-0309 (a
## Reproducebody that starts withn/a: featuremarks a feature ticket; amends ADR-0209). All paths below are underplugins/os-sdlc/eval/ticket-takedown(targettakedown).Ruby decides whether a ticket is a feature. The parsed ticket owns that fact:
TicketParts#feature?is true only when the ticket's## Reproducesection body starts withn/a: feature(any case).RunState#feature?parses the full ticket text it already holds (TicketMarkdown.parse(ticket_text).feature?).Relevancetakesfeature:, which defaults to false. The ADR check runs first for every ticket. After it, a defect still needs a live harm path; a feature is relevant unless a fix check shows the current code already has the behavior.live_and_fixed?(lib/takedown/model/relevance.rb:49) is defect-shaped; keep its refusal for a defect, and for a feature letfixed?decide the verdict instead.RelevanceSteppassesfeature: run.feature?. The relevance prompt's Code facts gain one line written by code:Ticket kind: featureorTicket kind: defect. The judge card tells the judge what to put in each field for a feature. The model'sverdictmust still agree with Ruby;verify!keeps refusing a disagreement, so the card's verdict rule andRelevance#verdictmust say the same thing in every case. Case mode never runs relevance (RunPlan#relevance?is false for a ruling plan), so the held-out and training sets do not score this card, and the grader digest does not include it.Required work:
TicketParts#feature?, true when a section with keyreproducehas a body that starts withn/a: feature(any case) — check: presentn/a: featureinplugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/ticket_parts.rbRunState#feature?, returningTicketMarkdown.parse(ticket_text).feature?— check: presentdef feature?inplugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/run_state.rbRelevance.newtakesfeature: false;verdictkeepsneeds_rulingfirst, then a feature givesrelevantunlessfixed?, and a defect givesrelevantonly whenlive?— check: presentfeature: falseinplugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/relevance.rbRelevanceStep#relevancebuildsRelevancewithfeature: run.feature?— check: presentfeature: run.feature?inplugins/os-sdlc/eval/ticket-takedown/lib/takedown/command/relevance_step.rbRunPrompts#code_factsaddsTicket kind: featurewhen@run.feature?is true, andTicket kind: defectotherwise — check: presentTicket kind:inplugins/os-sdlc/eval/ticket-takedown/lib/takedown/presenter/run_prompts.rbharmis what the named consumer cannot do without the new behavior;harm_pathnames that consumer (a command, skill, plan row, or ticket that the body names);harm_path_livekeeps its meaning and is false when the consumer is not built yet; a fix check is a commit that already added the behavior — check: presentFor a feature ticketinplugins/os-sdlc/eval/ticket-takedown/harness/cards/relevance-judge.mdneeds_rulingon an unresolved conflict; otherwise, for a feature ticket,not_relevantwhen anyfix_checksentry hascurrent_code_is_fixtrue, elserelevant; otherwisenot_relevantwhenharm_path_liveis false, elserelevant. The trust line names the ticket kind fact next to the plugin and label facts — check: presentTicket kindinplugins/os-sdlc/eval/ticket-takedown/harness/cards/relevance-judge.mdOrchestrator work, after merge: edit
plugins/os-backlog/references/templates/capture.md(line 19) andplugins/os-backlog/skills/capture/SKILL.md(line 28) so a feature ticket writesn/a: feature ticket.and other tickets with nothing to reproduce writen/a: <reason>(ADR-0309); runbin/refresh-plugins; re-runbin/takedown-run --live 1634-style on the next feature ticket (#1635) to prove the live path.Acceptance criteria
## Reproducereadsn/a: feature ticket.and a relevance reply withharm_path_livefalse, no ADR conflicts, no fix checks, and verdictrelevant, whentakedown-run --liveruns, then the relevance step passes, research runs, andrelevance-verdict.jsonrecordsrelevant.needs_ruling.current_code_is_fixtrue, when the relevance step judges it, then the verdict isnot_relevant.not_relevantwith no fix, when the relevance step judges it, then the reply is refused withrelevance: verdict not_relevant disagrees with relevant.## Reproducesection, or one that readsn/a: design ticket., or one that gives a command, when the harm path is not live, then the verdict isnot_relevant, as today.Ticket kind: feature; given any other ticket, they includeTicket kind: defect.Owner sketch
Takedown::TicketPartsfeature?, from the## Reproducemarker)Takedown::RunStatefeature?, from the full ticket text it holds)Takedown::RelevanceTakedown::RelevanceStepRelevanceTakedown::RunPromptsFailing tests; each is red today for the reason given.
plugins/os-sdlc/eval/ticket-takedown/test/parser/ticket_markdown_test.rb, add (red:NoMethodErrorforfeature?):plugins/os-sdlc/eval/ticket-takedown/test/model/relevance_test.rb, change the helper and add (red:ArgumentErrorfor the unknown keywordfeature; the existing truth tabletest_the_verdict_comes_from_the_fieldsstays and pins the defect path through the default):plugins/os-sdlc/eval/ticket-takedown/test/presenter/run_prompts_test.rb, add (red:NoMethodErrorforRunState#feature?):plugins/os-sdlc/eval/ticket-takedown/test/controller/run_cli_test.rb, changelive_cliand add (red onassert_equal 0, code: Ruby computesnot_relevantand refuses the reply, so the run exits 1):Out of scope
Relevance.plugin_absent, the frozen check,RelevanceComment.harness/schemas/relevance.json; no new fields.plugins/os-sdlc/lib/os_sdlc/crc/tickets/body.rb:15(n/a: structure-only refactor ...); it stays a defect, which is correct.ticket-decomposeroutes tickets to takedown.Origin
VERDICT: CREATE
Work started: /os-sdlc:implement on branch ticket-1642 (worktree .claude/worktrees/ticket-1642), map poodr-ticket-implementation, target takedown. Decision record ADR-0309.
Blocked: implementation 267 failed at node test-reviewer (dispatch 2616, verdict error, no gate steps, 13 s). Cause: a pre-open os-sdlc:blast-radius agent resumed while the run was open; the SubagentStart hook recorded it as dispatch 2615, the Runner waited until StallWatch (900 s), then directed a re-dispatch of test-reviewer, which had already passed in dispatch 2614; that second review ended in error. Root ticket: #773 (occurrence posted). The four red tests that test-reviewer passed in dispatch 2614 are committed on branch ticket-1642 (worktree .claude/worktrees/ticket-1642). Next: hand-finish test-first from those tests, or a fresh implementation-open after #773; then remove waiting.
Ruling 85 (Jared, 2026-11-08): increments 3-5 are built by hand and skip the takedown detour. This ticket stays closed and unfinished. Red tests remain on branch ticket-1642 (
a7486cb6) if the feature-ticket relevance change is wanted later. Labels waiting and ready-for-agent are stale; the CLI cannot remove them (#867).State of branch ticket-1642, checked 2026-11-10 (session 720a7477):
a7486cb61, red tests for feature-ticket relevance in plugins/os-sdlc/eval/ticket-takedown/test (run_cli_test, relevance_test, ticket_markdown_test, run_prompts_test). I merged main into the branch; no conflict.The worktree and branch stay until Jared decides: build the ADR-0309 implementation against these tests, or delete the branch.
Built by ruling 120 (2026-11-10): the takedown track runs again and ADR-0309 was Accepted but unbuilt. Commits
86c99b391(feature marker, Relevance feature:, Ticket kind line, judge card, capture template) and317a6c2cd(test helper drops the deleted git_repo_scenario require), merged in9018fa6ccand pushed. Takedown suite: 631 runs, 0 failures. Branch and worktree ticket-1642 removed. Open point: the relevance-judge card text changed, so compare takedown eval scores only against a new baseline.