Takedown relevance judge rejects ruled feature tickets as not relevant #1642

Closed
opened 2026-11-08 17:56:42 +00:00 by jared · 5 comments
Owner

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-125409 on #1634 (test taxonomy classifier, increment 2 of docs/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 1634 from the repo root. The run fails at step 02 with FAILED relevance: relevance: not relevant.

Approach

Decision record: ADR-0309 (a ## Reproduce body that starts with n/a: feature marks a feature ticket; amends ADR-0209). All paths below are under plugins/os-sdlc/eval/ticket-takedown (target takedown).

Ruby decides whether a ticket is a feature. The parsed ticket owns that fact: TicketParts#feature? is true only when the ticket's ## Reproduce section body starts with n/a: feature (any case). RunState#feature? parses the full ticket text it already holds (TicketMarkdown.parse(ticket_text).feature?).

Relevance takes feature:, 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.

def verdict
  return "needs_ruling" if unresolved.any?

  wanted? ? "relevant" : "not_relevant"
end

def wanted? = @feature ? !fixed? : live?

live_and_fixed? (lib/takedown/model/relevance.rb:49) is defect-shaped; keep its refusal for a defect, and for a feature let fixed? decide the verdict instead. RelevanceStep passes feature: run.feature?. The relevance prompt's Code facts gain one line written by code: Ticket kind: feature or Ticket kind: defect. The judge card tells the judge what to put in each field for a feature. The model's verdict must still agree with Ruby; verify! keeps refusing a disagreement, so the card's verdict rule and Relevance#verdict must 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:

  1. Add TicketParts#feature?, true when a section with key reproduce has a body that starts with n/a: feature (any case) — check: present n/a: feature in plugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/ticket_parts.rb
  2. Add RunState#feature?, returning TicketMarkdown.parse(ticket_text).feature? — check: present def feature? in plugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/run_state.rb
  3. Relevance.new takes feature: false; verdict keeps needs_ruling first, then a feature gives relevant unless fixed?, and a defect gives relevant only when live? — check: present feature: false in plugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/relevance.rb
  4. RelevanceStep#relevance builds Relevance with feature: run.feature? — check: present feature: run.feature? in plugins/os-sdlc/eval/ticket-takedown/lib/takedown/command/relevance_step.rb
  5. RunPrompts#code_facts adds Ticket kind: feature when @run.feature? is true, and Ticket kind: defect otherwise — check: present Ticket kind: in plugins/os-sdlc/eval/ticket-takedown/lib/takedown/presenter/run_prompts.rb
  6. In the judge card, add rules for a feature ticket: a defect ticket matters while its harm path is live, and a feature ticket matters until the code already has the behavior; harm is what the named consumer cannot do without the new behavior; harm_path names that consumer (a command, skill, plan row, or ticket that the body names); harm_path_live keeps its meaning and is false when the consumer is not built yet; a fix check is a commit that already added the behavior — check: present For a feature ticket in plugins/os-sdlc/eval/ticket-takedown/harness/cards/relevance-judge.md
  7. Change the card's verdict rule and its trust line: needs_ruling on an unresolved conflict; otherwise, for a feature ticket, not_relevant when any fix_checks entry has current_code_is_fix true, else relevant; otherwise not_relevant when harm_path_live is false, else relevant. The trust line names the ticket kind fact next to the plugin and label facts — check: present Ticket kind in plugins/os-sdlc/eval/ticket-takedown/harness/cards/relevance-judge.md

Orchestrator work, after merge: edit plugins/os-backlog/references/templates/capture.md (line 19) and plugins/os-backlog/skills/capture/SKILL.md (line 28) so a feature ticket writes n/a: feature ticket. and other tickets with nothing to reproduce write n/a: <reason> (ADR-0309); run bin/refresh-plugins; re-run bin/takedown-run --live 1634-style on the next feature ticket (#1635) to prove the live path.

Acceptance criteria

  1. Given a live ticket whose ## Reproduce reads n/a: feature ticket. and a relevance reply with harm_path_live false, no ADR conflicts, no fix checks, and verdict relevant, when takedown-run --live runs, then the relevance step passes, research runs, and relevance-verdict.json records relevant.
  2. Given that feature ticket and a reply with an unresolved ADR conflict, when the relevance step judges it, then the verdict is needs_ruling.
  3. Given that feature ticket and a fix check with current_code_is_fix true, when the relevance step judges it, then the verdict is not_relevant.
  4. Given that feature ticket and a reply that claims not_relevant with no fix, when the relevance step judges it, then the reply is refused with relevance: verdict not_relevant disagrees with relevant.
  5. Given a ticket with no ## Reproduce section, or one that reads n/a: design ticket., or one that gives a command, when the harm path is not live, then the verdict is not_relevant, as today.
  6. Given a feature ticket, when the relevance prompt is built, then its Code facts include Ticket kind: feature; given any other ticket, they include Ticket kind: defect.

Owner sketch

Object Owns
Takedown::TicketParts whether the parsed ticket is a feature (feature?, from the ## Reproduce marker)
Takedown::RunState the run's ticket kind (feature?, from the full ticket text it holds)
Takedown::Relevance the verdict for each kind: ADR conflicts first, then a live harm path for a defect or "not built yet" for a feature
Takedown::RelevanceStep passes the run's ticket kind into Relevance
Takedown::RunPrompts states the ticket kind as a code fact in the relevance prompt

Failing tests; each is red today for the reason given.

plugins/os-sdlc/eval/ticket-takedown/test/parser/ticket_markdown_test.rb, add (red: NoMethodError for feature?):

  def test_only_a_reproduce_section_reading_n_a_feature_marks_a_feature
    bodies = ["n/a: feature ticket.", "n/a: design ticket.", "ruby a.rb"]
    kinds = bodies.map { Takedown::TicketMarkdown.parse("# T\n\n## Reproduce\n\n#{_1}\n").feature? }
    assert_equal [true, false, false], kinds
    refute Takedown::TicketMarkdown.parse("# T\n\n## Problem\n\nn/a: feature ticket.\n").feature?
  end

plugins/os-sdlc/eval/ticket-takedown/test/model/relevance_test.rb, change the helper and add (red: ArgumentError for the unknown keyword feature; the existing truth table test_the_verdict_comes_from_the_fields stays and pins the defect path through the default):

  def relevance(adrs: Takedown::AdrRecords.none, feature: false, **over)
    Takedown::Relevance.new(RunSupport::RELEVANCE.merge(over.transform_keys(&:to_s)), adrs: adrs, feature: feature)
  end

  BUILT = [{ "commit" => "abc1234", "file" => "a.rb", "current_code_is_fix" => true, "finding" => "f" }].freeze

  def test_a_feature_verdict_needs_no_live_harm_path_and_keeps_the_adr_and_fix_checks
    cases = { [false, [], []] => "relevant", [false, CONFLICT, []] => "needs_ruling",
              [false, [], BUILT] => "not_relevant", [true, [], []] => "relevant" }
    actual = cases.keys.map do |live, conflicts, fixes|
      relevance(feature: true, harm_path_live: live, adr_conflicts: conflicts, fix_checks: fixes).verdict
    end
    assert_equal cases.values, actual
  end

  def test_a_feature_reply_claiming_not_relevant_without_a_fix_is_refused
    reply = relevance(feature: true, harm_path_live: false, verdict: "not_relevant")
    error = assert_raises(Takedown::Failure) { reply.verify! }
    assert_equal "relevance: verdict not_relevant disagrees with relevant", error.message
  end

plugins/os-sdlc/eval/ticket-takedown/test/presenter/run_prompts_test.rb, add (red: NoMethodError for RunState#feature?):

  def relevance_prompt(full)
    views = Takedown::TicketViews.new(full: full, blind: "BLIND", redactions: 0)
    Takedown::Prompts.new(GradeInputs.new("", [], {})).for(:relevance, fresh_state(views))
  end

  def test_the_relevance_prompt_names_the_ticket_kind
    assert_includes relevance_prompt("# T\n\n## Reproduce\n\nn/a: feature ticket.\n"), "Ticket kind: feature"
    assert_includes relevance_prompt("# T\n\n## Reproduce\n\nn/a: design ticket.\n"), "Ticket kind: defect"
  end

plugins/os-sdlc/eval/ticket-takedown/test/controller/run_cli_test.rb, change live_cli and add (red on assert_equal 0, code: Ruby computes not_relevant and refuses the reply, so the run exits 1):

  FEATURE_TICKET = "# LIVE TITLE\n\n## Problem\n\nLIVE PROBLEM.\n\n## Reproduce\n\nn/a: feature ticket.\n"

  def live_cli(executor, work_dir: nil, labels: [], ticket: LIVE_TICKET)
    build_source
    live_paths = Takedown::RunPaths.new(repo_root: @src, work_dir: work_dir || @src, cases_root: @cases,
                                        scratch_root: scratch_root, results_root: results,
                                        grader_calibration: calibration)
    create_cli(executor, FakeTests.new, issues: FakeIssues.new(ticket, labels: labels), paths: live_paths)
  end

  def test_a_feature_with_no_live_harm_path_goes_on_to_research
    executor = passing_executor("relevance" => RunSupport::RELEVANCE.merge("harm_path_live" => false))
    code = live_cli(executor, ticket: FEATURE_TICKET).run(["--live", "907"])
    assert_equal 0, code
    assert_equal "relevant", relevance_verdict["verdict"]
    assert executor.by_name.key?("research")
    assert_empty @tracker.calls
  end

Out of scope

  • How a defect ticket is judged: Relevance.plugin_absent, the frozen check, RelevanceComment.
  • Checking that a feature's named consumer exists, is ruled, or is still open.
  • Re-labeling or rewriting existing tickets to carry the marker; a stored ticket without it stays a defect (ADR-0309).
  • The relevance schema 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.
  • How ticket-decompose routes tickets to takedown.

Origin

  • Trigger: takedown run docs/takedown/1634-20261108-125409
  • Improvised this session: none
  • Chain: #1634 has no Owner sketch ← ticket-decompose routes new-object tickets to takedown ← takedown relevance judges only live harm. End: CODE (relevance step)
  • Root candidate: none found; searched takedown, relevance, relevance judge, not_relevant, new object, decompose
  • Where: plugins/os-sdlc/eval/ticket-takedown (relevance step, its card and prompt)
  • Session: 87bc217f-61e2-4d4d-8470-9f3c8fd1ef43
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os-plugins-os-sdlc/87bc217f-61e2-4d4d-8470-9f3c8fd1ef43.jsonl

VERDICT: CREATE

## 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-125409` on #1634 (test taxonomy classifier, increment 2 of `docs/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 1634` from the repo root. The run fails at step 02 with `FAILED relevance: relevance: not relevant`. ## Approach Decision record: ADR-0309 (a `## Reproduce` body that starts with `n/a: feature` marks a feature ticket; amends ADR-0209). All paths below are under `plugins/os-sdlc/eval/ticket-takedown` (target `takedown`). Ruby decides whether a ticket is a feature. The parsed ticket owns that fact: `TicketParts#feature?` is true only when the ticket's `## Reproduce` section body starts with `n/a: feature` (any case). `RunState#feature?` parses the full ticket text it already holds (`TicketMarkdown.parse(ticket_text).feature?`). `Relevance` takes `feature:`, 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. ```ruby def verdict return "needs_ruling" if unresolved.any? wanted? ? "relevant" : "not_relevant" end def wanted? = @feature ? !fixed? : live? ``` `live_and_fixed?` (`lib/takedown/model/relevance.rb:49`) is defect-shaped; keep its refusal for a defect, and for a feature let `fixed?` decide the verdict instead. `RelevanceStep` passes `feature: run.feature?`. The relevance prompt's Code facts gain one line written by code: `Ticket kind: feature` or `Ticket kind: defect`. The judge card tells the judge what to put in each field for a feature. The model's `verdict` must still agree with Ruby; `verify!` keeps refusing a disagreement, so the card's verdict rule and `Relevance#verdict` must 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: 1. Add `TicketParts#feature?`, true when a section with key `reproduce` has a body that starts with `n/a: feature` (any case) — check: present `n/a: feature` in `plugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/ticket_parts.rb` 2. Add `RunState#feature?`, returning `TicketMarkdown.parse(ticket_text).feature?` — check: present `def feature?` in `plugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/run_state.rb` 3. `Relevance.new` takes `feature: false`; `verdict` keeps `needs_ruling` first, then a feature gives `relevant` unless `fixed?`, and a defect gives `relevant` only when `live?` — check: present `feature: false` in `plugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/relevance.rb` 4. `RelevanceStep#relevance` builds `Relevance` with `feature: run.feature?` — check: present `feature: run.feature?` in `plugins/os-sdlc/eval/ticket-takedown/lib/takedown/command/relevance_step.rb` 5. `RunPrompts#code_facts` adds `Ticket kind: feature` when `@run.feature?` is true, and `Ticket kind: defect` otherwise — check: present `Ticket kind: ` in `plugins/os-sdlc/eval/ticket-takedown/lib/takedown/presenter/run_prompts.rb` 6. In the judge card, add rules for a feature ticket: a defect ticket matters while its harm path is live, and a feature ticket matters until the code already has the behavior; `harm` is what the named consumer cannot do without the new behavior; `harm_path` names that consumer (a command, skill, plan row, or ticket that the body names); `harm_path_live` keeps its meaning and is false when the consumer is not built yet; a fix check is a commit that already added the behavior — check: present `For a feature ticket` in `plugins/os-sdlc/eval/ticket-takedown/harness/cards/relevance-judge.md` 7. Change the card's verdict rule and its trust line: `needs_ruling` on an unresolved conflict; otherwise, for a feature ticket, `not_relevant` when any `fix_checks` entry has `current_code_is_fix` true, else `relevant`; otherwise `not_relevant` when `harm_path_live` is false, else `relevant`. The trust line names the ticket kind fact next to the plugin and label facts — check: present `Ticket kind` in `plugins/os-sdlc/eval/ticket-takedown/harness/cards/relevance-judge.md` Orchestrator work, after merge: edit `plugins/os-backlog/references/templates/capture.md` (line 19) and `plugins/os-backlog/skills/capture/SKILL.md` (line 28) so a feature ticket writes `n/a: feature ticket.` and other tickets with nothing to reproduce write `n/a: <reason>` (ADR-0309); run `bin/refresh-plugins`; re-run `bin/takedown-run --live 1634`-style on the next feature ticket (#1635) to prove the live path. ## Acceptance criteria 1. Given a live ticket whose `## Reproduce` reads `n/a: feature ticket.` and a relevance reply with `harm_path_live` false, no ADR conflicts, no fix checks, and verdict `relevant`, when `takedown-run --live` runs, then the relevance step passes, research runs, and `relevance-verdict.json` records `relevant`. 2. Given that feature ticket and a reply with an unresolved ADR conflict, when the relevance step judges it, then the verdict is `needs_ruling`. 3. Given that feature ticket and a fix check with `current_code_is_fix` true, when the relevance step judges it, then the verdict is `not_relevant`. 4. Given that feature ticket and a reply that claims `not_relevant` with no fix, when the relevance step judges it, then the reply is refused with `relevance: verdict not_relevant disagrees with relevant`. 5. Given a ticket with no `## Reproduce` section, or one that reads `n/a: design ticket.`, or one that gives a command, when the harm path is not live, then the verdict is `not_relevant`, as today. 6. Given a feature ticket, when the relevance prompt is built, then its Code facts include `Ticket kind: feature`; given any other ticket, they include `Ticket kind: defect`. ## Owner sketch | Object | Owns | | --- | --- | | `Takedown::TicketParts` | whether the parsed ticket is a feature (`feature?`, from the `## Reproduce` marker) | | `Takedown::RunState` | the run's ticket kind (`feature?`, from the full ticket text it holds) | | `Takedown::Relevance` | the verdict for each kind: ADR conflicts first, then a live harm path for a defect or "not built yet" for a feature | | `Takedown::RelevanceStep` | passes the run's ticket kind into `Relevance` | | `Takedown::RunPrompts` | states the ticket kind as a code fact in the relevance prompt | Failing tests; each is red today for the reason given. `plugins/os-sdlc/eval/ticket-takedown/test/parser/ticket_markdown_test.rb`, add (red: `NoMethodError` for `feature?`): ```ruby def test_only_a_reproduce_section_reading_n_a_feature_marks_a_feature bodies = ["n/a: feature ticket.", "n/a: design ticket.", "ruby a.rb"] kinds = bodies.map { Takedown::TicketMarkdown.parse("# T\n\n## Reproduce\n\n#{_1}\n").feature? } assert_equal [true, false, false], kinds refute Takedown::TicketMarkdown.parse("# T\n\n## Problem\n\nn/a: feature ticket.\n").feature? end ``` `plugins/os-sdlc/eval/ticket-takedown/test/model/relevance_test.rb`, change the helper and add (red: `ArgumentError` for the unknown keyword `feature`; the existing truth table `test_the_verdict_comes_from_the_fields` stays and pins the defect path through the default): ```ruby def relevance(adrs: Takedown::AdrRecords.none, feature: false, **over) Takedown::Relevance.new(RunSupport::RELEVANCE.merge(over.transform_keys(&:to_s)), adrs: adrs, feature: feature) end BUILT = [{ "commit" => "abc1234", "file" => "a.rb", "current_code_is_fix" => true, "finding" => "f" }].freeze def test_a_feature_verdict_needs_no_live_harm_path_and_keeps_the_adr_and_fix_checks cases = { [false, [], []] => "relevant", [false, CONFLICT, []] => "needs_ruling", [false, [], BUILT] => "not_relevant", [true, [], []] => "relevant" } actual = cases.keys.map do |live, conflicts, fixes| relevance(feature: true, harm_path_live: live, adr_conflicts: conflicts, fix_checks: fixes).verdict end assert_equal cases.values, actual end def test_a_feature_reply_claiming_not_relevant_without_a_fix_is_refused reply = relevance(feature: true, harm_path_live: false, verdict: "not_relevant") error = assert_raises(Takedown::Failure) { reply.verify! } assert_equal "relevance: verdict not_relevant disagrees with relevant", error.message end ``` `plugins/os-sdlc/eval/ticket-takedown/test/presenter/run_prompts_test.rb`, add (red: `NoMethodError` for `RunState#feature?`): ```ruby def relevance_prompt(full) views = Takedown::TicketViews.new(full: full, blind: "BLIND", redactions: 0) Takedown::Prompts.new(GradeInputs.new("", [], {})).for(:relevance, fresh_state(views)) end def test_the_relevance_prompt_names_the_ticket_kind assert_includes relevance_prompt("# T\n\n## Reproduce\n\nn/a: feature ticket.\n"), "Ticket kind: feature" assert_includes relevance_prompt("# T\n\n## Reproduce\n\nn/a: design ticket.\n"), "Ticket kind: defect" end ``` `plugins/os-sdlc/eval/ticket-takedown/test/controller/run_cli_test.rb`, change `live_cli` and add (red on `assert_equal 0, code`: Ruby computes `not_relevant` and refuses the reply, so the run exits 1): ```ruby FEATURE_TICKET = "# LIVE TITLE\n\n## Problem\n\nLIVE PROBLEM.\n\n## Reproduce\n\nn/a: feature ticket.\n" def live_cli(executor, work_dir: nil, labels: [], ticket: LIVE_TICKET) build_source live_paths = Takedown::RunPaths.new(repo_root: @src, work_dir: work_dir || @src, cases_root: @cases, scratch_root: scratch_root, results_root: results, grader_calibration: calibration) create_cli(executor, FakeTests.new, issues: FakeIssues.new(ticket, labels: labels), paths: live_paths) end def test_a_feature_with_no_live_harm_path_goes_on_to_research executor = passing_executor("relevance" => RunSupport::RELEVANCE.merge("harm_path_live" => false)) code = live_cli(executor, ticket: FEATURE_TICKET).run(["--live", "907"]) assert_equal 0, code assert_equal "relevant", relevance_verdict["verdict"] assert executor.by_name.key?("research") assert_empty @tracker.calls end ``` ## Out of scope - How a defect ticket is judged: `Relevance.plugin_absent`, the frozen check, `RelevanceComment`. - Checking that a feature's named consumer exists, is ruled, or is still open. - Re-labeling or rewriting existing tickets to carry the marker; a stored ticket without it stays a defect (ADR-0309). - The relevance schema `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. - How `ticket-decompose` routes tickets to takedown. ## Origin - Trigger: takedown run docs/takedown/1634-20261108-125409 - Improvised this session: none - Chain: #1634 has no Owner sketch ← ticket-decompose routes new-object tickets to takedown ← takedown relevance judges only live harm. End: CODE (relevance step) - Root candidate: none found; searched takedown, relevance, relevance judge, not_relevant, new object, decompose - Where: plugins/os-sdlc/eval/ticket-takedown (relevance step, its card and prompt) - Session: 87bc217f-61e2-4d4d-8470-9f3c8fd1ef43 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os-plugins-os-sdlc/87bc217f-61e2-4d4d-8470-9f3c8fd1ef43.jsonl VERDICT: CREATE
jared 2026-11-08 19:25:46 +00:00
Author
Owner

Work started: /os-sdlc:implement on branch ticket-1642 (worktree .claude/worktrees/ticket-1642), map poodr-ticket-implementation, target takedown. Decision record ADR-0309.

Work started: /os-sdlc:implement on branch ticket-1642 (worktree .claude/worktrees/ticket-1642), map poodr-ticket-implementation, target takedown. Decision record ADR-0309.
Author
Owner

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.

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.
Author
Owner

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).

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).
Author
Owner

State of branch ticket-1642, checked 2026-11-10 (session 720a7477):

  1. The branch holds one commit that main does not have: 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.
  2. The tests are still red by design: main has ADR-0309 (the n/a: feature marker) but no implementation. eval/ticket-takedown/lib has no feature? method, no feature: argument on Takedown::Relevance, and no Ticket kind line in the relevance prompt.
  3. Ruling 85 (Jared, 2026-11-08): #1642 stays closed with the red tests on the branch, not finished.
  4. A merge of the branch as it is would put four failing tests on main, so it was not merged. The branch does not touch plugins/os-sdlc/lib or plugins/os-sdlc/test, so it has no effect on the mutation work.
    The worktree and branch stay until Jared decides: build the ADR-0309 implementation against these tests, or delete the branch.
State of branch ticket-1642, checked 2026-11-10 (session 720a7477): 1. The branch holds one commit that main does not have: 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. 2. The tests are still red by design: main has ADR-0309 (the n/a: feature marker) but no implementation. eval/ticket-takedown/lib has no feature? method, no feature: argument on Takedown::Relevance, and no Ticket kind line in the relevance prompt. 3. Ruling 85 (Jared, 2026-11-08): #1642 stays closed with the red tests on the branch, not finished. 4. A merge of the branch as it is would put four failing tests on main, so it was not merged. The branch does not touch plugins/os-sdlc/lib or plugins/os-sdlc/test, so it has no effect on the mutation work. The worktree and branch stay until Jared decides: build the ADR-0309 implementation against these tests, or delete the branch.
Author
Owner

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) and 317a6c2cd (test helper drops the deleted git_repo_scenario require), merged in 9018fa6cc and 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.

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) and 317a6c2cd (test helper drops the deleted git_repo_scenario require), merged in 9018fa6cc and 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.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#1642
No description provided.