Every task's `acceptance_criteria` get a parallel list of stable `acceptance_criteria_ids` — one id per criterion, generated automatically when a task is created. The ids are stable across edits, so other tasks can reference a specific criterion.
When a parent task is decomposed, each subtask declares which parent criteria it covers in `parent_ac_refs` (set from the `covers_parent_criteria` argument to `delegate`). That child→parent link is what lets the org guarantee a decomposition actually covers the parent's full intent. See `docs/rag/workflows/task-planning.md` for the coverage gates and the PM's coverage briefing.
Each role's handoff note is stored as a validated structured model in `notes_structured`. The legacy text columns (`dev_notes`, `qa_notes`, `doc_notes`, `pr_reviewer_notes`, `quick_context`) are DERIVED mirrors regenerated from it through a single chokepoint — never hand-authored.
When toolchain matching is enabled, the agent's workspace clone carries a `.git/.roboco-toolchain` marker recording the resolved Python and a status (`ok` / `broken` / `unknown`), and the WorkSession records the toolchain columns. A `broken` status blocks the delivery gates.