Takedown: an adr_causes entry that complies with its ADR must not stop the run for a ruling #1007

Open
opened 2026-10-15 14:15:08 +00:00 by jared · 0 comments
Owner

Problem

The ticket-takedown skill stops the run for a ruling on every adr_causes entry, even when the design complies with that ADR. The user rules "comply" and nothing changes. A ruling must be needed only when the design would violate or amend a heuristic or an ADR. ADR-0292 already removed this stop for a resolved relevance conflict (#1006). The adr_causes stop has the same shape.

A second defect is in the same field. Entries are not normalized or de-duplicated, and a designer cannot read ADRs (ADR-0280 to ADR-0282).

Observed

Run docs/takedown/1005-20261014-151342/final-design.json:

  • adr_causes names ADR-0290 only because the design enforces it. The why says: "Forbids model edits of placed design content, so ... the fix must move lint to design time".
  • adr_conflicts is null.
  • The AFK run stopped for a ruling. Jared ruled "comply" on 2026-10-15. The ruling changed nothing.
  • adr_causes lists ADR-0290 twice: as docs/adr/0290 and as ADR-0290.
  • One designer wrote "I could not read the ADR to check this".

Where the stop comes from:

  • plugins/os-sdlc/skills/ticket-takedown/SKILL.md:48: "WHEN adr_causes is not empty THEN show each ADR with its reason, and say that the user rules on each one (comply, amend, or supersede) before implementation."
  • plugins/os-sdlc/eval/ticket-takedown/harness/cards/critic.md:28 and :67: the critic names any ADR that causes the defect. The card does not say whether the design complies or amends.
  • plugins/os-sdlc/eval/ticket-takedown/harness/schemas/critique.json:131: the adr_causes schema has no stance field and no id pattern.
  • plugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/run_state.rb:77-78: adr_causes flat-maps all critiques and calls .uniq on whole entries. Two entries with different adr strings or different why text both survive.

Reproduce

n/a: the defect shows in a finished run. Read docs/takedown/1005-20261014-151342/final-design.json and its adr_causes list.

Approach

Required work:

  1. Add a stance to each adr_causes entry in the critique schema: the design complies with the ADR, or the design would amend it — check: present adr_causes in plugins/os-sdlc/eval/ticket-takedown/harness/schemas/critique.json
  2. Normalize each adr id to one form and de-duplicate by that id in RunState#adr_causes — check: present adr_causes in plugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/run_state.rb
  3. Change SKILL.md section 3 so that a complying cause is recorded and shown in the ticket body, and only an amending cause stops for a ruling — check: present adr_causes in plugins/os-sdlc/skills/ticket-takedown/SKILL.md
  4. Change the critic card so it sets the stance, and so it does not claim to read an ADR it cannot read — check: present adr_causes in plugins/os-sdlc/eval/ticket-takedown/harness/cards/critic.md

Orchestrator work: run /os-adr:find first. If the change reverses an Accepted ADR (ADR-0280 to ADR-0282 or ADR-0292), record a superseding ADR through the owner.

Acceptance criteria

  1. Given critiques that name ADR-0290 as docs/adr/0290 and as ADR-0290, when the run settles, then final-design.json lists ADR-0290 once.
  2. Given an adr_causes entry whose stance is comply, when the skill presents the design, then the entry appears in the ticket body and the run continues to implementation without a ruling.
  3. Given an adr_causes entry whose stance is amend, when the skill presents the design, then the run stops for the user's ruling.

Owner sketch

Takedown::Model::RunState#adr_causes owns the merge: it normalizes ids, de-duplicates, and keeps the strongest stance for each ADR.

Origin

  • Trigger: run docs/takedown/1005-20261014-151342 stopped for an adr_causes ruling on ADR-0290.
  • Improvised this session: none. Jared ruled "comply" on 2026-10-15.
  • Chain: AFK stop for a no-change ruling ← SKILL.md:48 rules on every adr_causes entry ← the critique schema has no stance field (critique.json:131).
  • Root candidate: none. Related: ADR-0292, #1006, #1005.
  • Where: plugins/os-sdlc/skills/ticket-takedown/SKILL.md
  • Session: 93a09338-354e-43e6-b66d-cd56100d574b
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-prism-architect/93a09338-354e-43e6-b66d-cd56100d574b.jsonl
## Problem The ticket-takedown skill stops the run for a ruling on every `adr_causes` entry, even when the design complies with that ADR. The user rules "comply" and nothing changes. A ruling must be needed only when the design would violate or amend a heuristic or an ADR. ADR-0292 already removed this stop for a resolved relevance conflict (#1006). The `adr_causes` stop has the same shape. A second defect is in the same field. Entries are not normalized or de-duplicated, and a designer cannot read ADRs (ADR-0280 to ADR-0282). ## Observed Run `docs/takedown/1005-20261014-151342/final-design.json`: - `adr_causes` names ADR-0290 only because the design enforces it. The `why` says: "Forbids model edits of placed design content, so ... the fix must move lint to design time". - `adr_conflicts` is null. - The AFK run stopped for a ruling. Jared ruled "comply" on 2026-10-15. The ruling changed nothing. - `adr_causes` lists ADR-0290 twice: as `docs/adr/0290` and as `ADR-0290`. - One designer wrote "I could not read the ADR to check this". Where the stop comes from: - `plugins/os-sdlc/skills/ticket-takedown/SKILL.md:48`: "WHEN `adr_causes` is not empty THEN show each ADR with its reason, and say that the user rules on each one (comply, amend, or supersede) before implementation." - `plugins/os-sdlc/eval/ticket-takedown/harness/cards/critic.md:28` and `:67`: the critic names any ADR that causes the defect. The card does not say whether the design complies or amends. - `plugins/os-sdlc/eval/ticket-takedown/harness/schemas/critique.json:131`: the `adr_causes` schema has no stance field and no id pattern. - `plugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/run_state.rb:77-78`: `adr_causes` flat-maps all critiques and calls `.uniq` on whole entries. Two entries with different `adr` strings or different `why` text both survive. ## Reproduce n/a: the defect shows in a finished run. Read `docs/takedown/1005-20261014-151342/final-design.json` and its `adr_causes` list. ## Approach Required work: 1. Add a stance to each `adr_causes` entry in the critique schema: the design complies with the ADR, or the design would amend it — check: present `adr_causes` in `plugins/os-sdlc/eval/ticket-takedown/harness/schemas/critique.json` 2. Normalize each `adr` id to one form and de-duplicate by that id in `RunState#adr_causes` — check: present `adr_causes` in `plugins/os-sdlc/eval/ticket-takedown/lib/takedown/model/run_state.rb` 3. Change `SKILL.md` section 3 so that a complying cause is recorded and shown in the ticket body, and only an amending cause stops for a ruling — check: present `adr_causes` in `plugins/os-sdlc/skills/ticket-takedown/SKILL.md` 4. Change the critic card so it sets the stance, and so it does not claim to read an ADR it cannot read — check: present `adr_causes` in `plugins/os-sdlc/eval/ticket-takedown/harness/cards/critic.md` Orchestrator work: run `/os-adr:find` first. If the change reverses an Accepted ADR (ADR-0280 to ADR-0282 or ADR-0292), record a superseding ADR through the owner. ## Acceptance criteria 1. Given critiques that name ADR-0290 as `docs/adr/0290` and as `ADR-0290`, when the run settles, then `final-design.json` lists ADR-0290 once. 2. Given an `adr_causes` entry whose stance is comply, when the skill presents the design, then the entry appears in the ticket body and the run continues to implementation without a ruling. 3. Given an `adr_causes` entry whose stance is amend, when the skill presents the design, then the run stops for the user's ruling. ## Owner sketch `Takedown::Model::RunState#adr_causes` owns the merge: it normalizes ids, de-duplicates, and keeps the strongest stance for each ADR. ## Origin - Trigger: run `docs/takedown/1005-20261014-151342` stopped for an `adr_causes` ruling on ADR-0290. - Improvised this session: none. Jared ruled "comply" on 2026-10-15. - Chain: AFK stop for a no-change ruling ← `SKILL.md:48` rules on every `adr_causes` entry ← the critique schema has no stance field (`critique.json:131`). - Root candidate: none. Related: ADR-0292, #1006, #1005. - Where: `plugins/os-sdlc/skills/ticket-takedown/SKILL.md` - Session: 93a09338-354e-43e6-b66d-cd56100d574b - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-prism-architect/93a09338-354e-43e6-b66d-cd56100d574b.jsonl
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#1007
No description provided.