Canonical handoff 2026-09-08 (epic #257, children #264-#277):
- ISSUE (deterministic issue-quality gate) replaces DEFINE as stage 0 —
the Gitea issue is the authoritative definition; no cognitive DEFINE stage
- APPLICABILITY added after OUTWARD with canonical candidate classifications
- INNOVATION precedes ADVERSARIAL (canonical order per §1)
- OUTWARD unified (OR1 preserved): discovery+reading are artifact subsections
- RETIRED_STAGES declared: DEFINE/OUTWARD_DISCOVERY/OUTWARD_READING cannot
be advanced or dispatched through the canonical path (RETIRED_STAGE status)
- more_research → targeted refinement routing to EARLIEST deficient stage;
external unknowns route to unified OUTWARD, never the retired split stages
- fake worker, integration/boundary/reliability tests rewritten for canonical
chain; legacy-state tree at a retired stage raises on advance
- new prompt templates: issue.md, applicability.md (with MUST NOT contracts)
Tests: 104 passed. Ruff clean. Pre-existing henxels digest failure unchanged
(missing henxels.contract module in env, fails identically on clean tree).
closes#264 (RP1 stage model); runner-placement enforcement (RP2/#265) next
One coherent MiMo external-research pass. Discovery and reading remain
visible as subsections inside the artifact, not separate top-level stages.
Artifact has discovery and reading subsections. Event relay streams both.
RSC1: ResearchTaskTree tracks issue+round+stage+completed+artifacts+blocking_unknowns.
Persists to task_tree.json per issue. advance/fail/more_research/capsule/get_prior_artifacts.
RSC2: compile_research_prompt(tree, stage) builds a task-specific prompt from
the stage template + process capsule + prior artifacts + blocking unknowns.
RSC3: run_research_stage.py executes ONE MiMo invocation for ONE stage.
Compiles prompt → invokes mimo → extracts text → advances tree → returns next stage.
The workflow dispatches per-stage (Gitea event model IS the scheduler).