86%

Tooling-cli bug fold — inspect, disposition, OBE

Goal

  • Fold every open subsystem: tooling-cli bug-tracker entry into this plan for inspection (149 at 2026-07-13 inspection; live snapshot at section entry).
  • Record exactly one disposition per bug: obe / absorb / release.
  • Feed workflow-population defects into the scenario oracle as behavior the new engine must not reproduce.

Execution rules

  • Use tracker APIs for the planned fold. Route newly discovered bugs and tooling friction through the normal routing.md §2 and tooling-first.md §0 workflows.

Implementation sketch

  • Snapshot the open set at section entry via query_open_bugs filtered to subsystem: tooling-cli; the snapshot is the coverage denominator.
  • Inspect each bug against spec/workflow-state-machines.md + the section roster; assign exactly one disposition:
    • obe — the engine supersedes the bug’s subject system; first ensure concrete absorbing work via /create-plan --inline, then call reclassify_obe(bug_id, evidence) with that section/spec anchor cited.
    • absorb — still-valid defect whose cure IS this plan’s work; stamp a SUBSUMED-BY: plans/workflow-engine-rework (<section-slug>) declaration via set_note per content/decisions/04-virtual-batch-supersession.md preserved-boundaries; bug stays open + owned.
    • release — valid but orthogonal to the workflow engine (ori_fmt formatter defects, ori test runner defects, test-all runtime internals, intel_repo test isolation); stamp mark_verified_valid; tracker entry otherwise untouched.
  • Verify /fix-next-bug queue selection excludes SUBSUMED-BY-stamped bugs; extend the canonical selector inline when it does not.
  • Emit machine-readable content/bug-fold-manifest.json: one row per snapshot bug with {bug_id, disposition, evidence, section_ref, scenario_ids[]}.
  • Append defect-scenario rows for workflow-population bugs to content/scenario-inventory.json; re-run verify_scenario_inventory.
  • Implement verify_bug_fold_manifest: reject snapshot bugs missing from the manifest, unknown dispositions, obe rows without evidence + section cite, absorb rows without a stamped note, release rows without a verified-valid stamp.

Spec references

  • routing.md §2 + state-discipline.md §4 (bug routing and tracker API ownership).
  • plans/workflow-engine-rework/spec/workflow-state-machines.md sec 0.1 (scenario oracle; target-semantic scenarios), sec 9 (bug flows share the engine).
  • content/decisions/04-virtual-batch-supersession.md (SUBSUMED-BY / coverage declarations as persistent ownership authority).

Test strategy / acceptance

Acceptance: verify_bug_fold_manifest proves every snapshot bug carries exactly one disposition with required evidence/stamps; obe closes appear in closed-bugs.json; absorbed bugs are excluded from /fix-next-bug selection; verify_scenario_inventory re-passes after the defect-scenario append.

Work Items

  • Snapshot the open tooling-cli bug set via query_open_bugs and emit the content/bug-fold-manifest.json skeleton
  • Implement verify_bug_fold_manifest with coverage, uniqueness, evidence, and stamp validation
  • Extend superseded_by_in_progress_plan_reason (scripts/plan_corpus/bug_markers.py), the exclusion predicate bug_queue_scan.scan calls, to also recognize the SUBSUMED-BY: marker that set_note stamps (alongside the existing Superseded by: marker) as one reconciled matcher family reading the note field — never a second, independent regex. Verify the fix through _select_dispatch (scripts/plan_orchestrator/fix_next_bug.py), the orchestrator that actually drives /fix-next-bug dispatch and consumes bug_queue_scan.scan. Do NOT extend scripts/fix_next_bug_runtime/queue.py:select_next_bugdecisions/04-virtual-batch-supersession.md marks it retire-after-canonical-selector-parity and it has no exclusion logic at all today.
  • Triage every snapshot bug to exactly one disposition (obe / absorb / release) with per-bug evidence and a superseding-or-owning section cite
  • Execute dispositions via tracker APIs only: reclassify_obe closes, SUBSUMED-BY set_note stamps, mark_verified_valid release stamps (never /add-bug)
  • Append workflow-defect scenario rows to content/scenario-inventory.json and re-run verify_scenario_inventory

Fresh intel (regenerated)

This section is NOT a mechanical “loop the bugs and stamp a disposition” task. The graph + code reads place it on top of a live two-part selector defect the section’s own work item (w-7c4fc37d) exists to close, and decision 04-virtual-batch-supersession has already ruled on WHERE the fix lands:

  1. The absorb disposition writes a marker the canonical /fix-next-bug selector does not read. The section body stamps absorbed bugs with SUBSUMED-BY: plans/workflow-engine-rework (<section-slug>) via set_note. The canonical queue exclusion path — bug_queue_scan.scan (scripts/plan_orchestrator/bug_queue_scan.py:213) → superseded_by_in_progress_plan_reason (scripts/plan_corpus/bug_markers.py:335) → extract_supersede_targetBUG_SUPERSEDED_TARGET_RE — matches ONLY the Superseded by: <plan> marker vocabulary. A bug stamped SUBSUMED-BY: is therefore NOT excluded from /fix-next-bug selection today. [JOIN] the acceptance criterion (“absorbed bugs are excluded from /fix-next-bug selection”) against the code reads: the section CANNOT pass acceptance without reconciling the two marker vocabularies. This is the section’s central verification defect, not a side note.

  2. There are THREE selectors, and w-7c4fc37d’s extension must NOT land in two of them. bug_queue_scan.scan (canonical), scripts/plan_orchestrator/fix_next_bug.py:_select_dispatch (orchestrator, consumes the scan), and scripts/fix_next_bug_runtime/queue.py:select_next_bug (a parallel API-wiring stub that filters status/severity/subsystem ONLY, with zero note/exclusion logic). Decision 04 explicitly rules: bug_queue_scan.py selector ownership → “port to one canonical selector component”; queue.py parallel selector → “retire after canonical selector parity.” Extending the queue.py stub re-fragments a duplication decision 04 already committed to collapsing.

Decisions this package forces before any work item is executed:

  1. Reconcile the marker vocabulary FIRST. Either the absorb stamp writes the marker the selector already reads (Superseded by:), OR superseded_by_in_progress_plan_reason is extended to also honor SUBSUMED-BY: — but there must be ONE marker-string SSOT, not a writer/reader disagreement (DESIGN:connascence-nonlocal + LEAK:scattered-knowledge; §3H).
  2. Land the selector extension in bug_queue_scan.scan (or its ported successor), NEVER queue.py:select_next_bug. The stub is decision-04-slated-for-retirement; touching it is the wrong surface (constrained; §9).
  3. obe closes route through reclassify_obe only (scripts/plan_corpus/bug_tracker/api.py:273) — the shared OBE-close primitive already consumed by review-bugs / fix-bug / triage-bugs. Never hand-edit open-bugs.json / closed-bugs.json; never touch flip_bug_status internals (constrained; §9).
  4. verify_bug_fold_manifest and verify_scenario_inventory coverage denominators must fail-closed. They are validators over a ~152-bug snapshot; ship positive AND negative pins BEFORE trusting them (INVERTED-TDD risk; §3H).
  5. Normal routing applies during this section: route newly discovered bugs through /add-bug and tooling friction through /improve-tooling; use /fix-bug or /fix-next-bug according to routing.md §2.
["select_next_bug", "flip_bug_status"]

DIG DEEPER

sed -n '1,34p' plans/workflow-engine-rework/content/tooling-cli-bug-fold-inspect-disposition-obe--s-9ee1f68b.md
sed -n '11,27p' plans/workflow-engine-rework/content/decisions/04-virtual-batch-supersession.md

(full dossier: tooling-cli-bug-fold-inspect-disposition-obe—s-9ee1f68b.intel.md)