{
  "version": 1,
  "repository": "Knuckles-Team/agent-utilities",
  "revision": "50c313ab01871ff7e10aee2a9d0254fa55d71f07",
  "captured_at": "2026-10-12T03:21:27.478158+00:00",
  "records": [
    {
      "id": "AU-CONTEXT",
      "kind": "spec",
      "parent": null,
      "source": "specs/agent-context-and-finance/status.json",
      "title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/agent-context-and-finance/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/agent-context-and-finance/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/core/contextual_model.py:752",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/core/contextual_model.py#L752"
        },
        {
          "declared_in": "specs/agent-context-and-finance/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/knowledge_graph/retrieval/context_compiler.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/knowledge_graph/retrieval/context_compiler.py"
        },
        {
          "declared_in": "specs/agent-context-and-finance/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/knowledge_graph/retrieval/context_knapsack.py:303",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/knowledge_graph/retrieval/context_knapsack.py#L303"
        },
        {
          "declared_in": "specs/agent-context-and-finance/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-context-and-finance/requirements.md"
        },
        {
          "declared_in": "specs/agent-context-and-finance/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-context-and-finance/status.json"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/agent-context-and-finance/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "AU-SEC-01",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-security-policy/spec.md"
        }
      ],
      "plan_diagrams": [
        "flowchart LR\n  Host[graph-os schedule/UI] --> Role[AU agent role]\n  Role --> Context[AU context compiler]\n  Context --> EG[\"EG retrieval, Decide, finance-core\"]\n  Role --> Claims[Evidence-labelled explanation]\n  Role --> SDK[SDK read feed and governed effects]\n  SDK --> EG\n  EG --> Context\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "AU-CONTEXT-R001",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "RetrievalPath templates feed EG-DECISION-ENGINE-R029 as candidates",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "88c61dc9164c",
        "c563cef1f530"
      ],
      "verified_by": [
        "tests/unit/decide/test_retrieval_consumer.py:15",
        "tests/unit/decide/test_retrieval_consumer.py:30"
      ],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**RetrievalPath templates feed EG-DECISION-ENGINE-R029 as candidates.** agent-utilities keys RetrievalPath templates by task class and composed schema digest and submits them as candidates to EG-DECISION-ENGINE-R029 rather than self-promoting from its own unverified outcomes. Topology-to-skill edges support plan assembly, with ranking, optimization, and feedback owned by epistemic-graph. | Integration tests confirm a submitted RetrievalPath candidate reaches epistemic-graph's decision engine and that agent-utilities performs no local self-promotion.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-CONTEXT-R002",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Corpus re-embedding uses a governed shadow ANN swap",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "88c61dc9164c",
        "f0f5e51f6b47"
      ],
      "verified_by": [
        "tests/unit/decide/test_generation_cycle.py:187"
      ],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Corpus re-embedding uses a governed shadow ANN swap.** A corpus re-embedding request runs as a governed agent-utilities workflow under a capacity lease: it asks epistemic-graph to build a shadow approximate-nearest-neighbor generation, checks population-stability and retrieval-quality receipts, and proposes activation. epistemic-graph performs the atomic swap and can roll it back. | A fault-injection test triggers rollback on a failed stability or quality receipt and confirms the prior ANN generation remains active.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-CONTEXT-R003",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Embedding admission changes come from reviewed proposals only",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "88c61dc9164c",
        "c563cef1f530"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/ingestion/test_admission_feedback.py:25",
        "tests/unit/knowledge_graph/ingestion/test_admission_feedback.py:67"
      ],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Embedding admission changes come from reviewed proposals only.** agent-utilities observes never-retrieved content classes and proposes changes to the embedding admission table from that independently observed feedback. It never writes the durable admission policy directly; only epistemic-graph or a human reviewer can accept the proposal. | A unit test confirms a never-retrieved content class produces a proposal record without any direct admission-table write.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-CONTEXT-R004",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Context sizing solves a certified multi-resolution knapsack",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "88c61dc9164c",
        "c563cef1f530"
      ],
      "verified_by": [
        "tests/retrieval/test_context_knapsack.py:143",
        "tests/retrieval/test_context_knapsack.py:40"
      ],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Context sizing solves a certified multi-resolution knapsack.** agent-utilities sizes context packages by solving a certified multi-resolution knapsack over exact tokenizer-weighted items against model window, cost, and latency capacity, preserving cited range and source identifiers. It abstains when no admissible package fits the budget. | Unit tests assert correct selection against known-optimal knapsack cases and confirm abstention when no package satisfies all budgets.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-CONTEXT-R004.1",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Model.** `WindowFit` in `agent_utilities/knowledge_graph/retrieval/context_knapsack.py` carries `fits`, counted prompt tokens, received capacity tokens, overage and a closed `verdict`. The context policy and window budget arrive as a received `ContextBudget` from EG-DECISION-ENGINE. `ContextSizer` at `context_knapsack.py:303` lacks this type. | `tests/unit/knowledge_graph/retrieval/test_context_window_fit.py::test_window_fit_fields`",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-CONTEXT-R004.2",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Behavior.** The sizer must count the whole prompt with its tokenizer. It must compare the count to the received `Capacity.tokens` (`context_knapsack.py:98`). The over-window margin is received from the engine; fallback default 0. A prompt without a countable tokenizer must yield `uncountable`. | `tests/unit/knowledge_graph/retrieval/test_context_window_fit.py::test_over_window_margin_default`",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-CONTEXT-R004.3",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Wiring.** `compile_model_context` (`agent_utilities/core/contextual_model.py:752`) must apply the received budget inside `sizing_scope`. Its production callers are `contextual_model.py:903` and `context_compiler_serving.py:565`. No production caller checks whole-prompt fit today. | `tests/unit/knowledge_graph/retrieval/test_context_window_fit.py::test_compile_model_context_checks_fit`",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-CONTEXT-R004.4",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Refusal.** An `over_window` verdict must not truncate silently. The sizer must return a typed `ContextOverWindow` result that names the overage. It must return the prompt to the caller for the engine's plan. An `uncountable` verdict must abstain. | `tests/unit/knowledge_graph/retrieval/test_context_window_fit.py::test_over_window_returns_typed_handoff`",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-CONTEXT-R004.5",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Evidence.** Each check must write five fields to the run trace: prompt tokens, capacity, overage, verdict and tokenizer identity. The trace must not store the prompt text. | `tests/unit/knowledge_graph/retrieval/test_context_window_fit.py::test_fit_verdict_in_trace`",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-CONTEXT-R004.6",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Hot-path proof.** The entry point is the served context-compile operation in `context_compiler_serving.py:565`. A prompt larger than the received window must return `ContextOverWindow`. A fitting prompt must compile unchanged. Test path: `tests/integration/test_context_window_fit_served.py`. | `tests/integration/test_context_window_fit_served.py::test_served_over_window_prompt`",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-CONTEXT-R005",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Finance scheduling and a sourced flip-explainer agent",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "88c61dc9164c",
        "f0f5e51f6b47"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Finance scheduling and a sourced flip-explainer agent.** agent-utilities schedules finance backfill and scan work and provides a flip-explainer agent that computes its answer from math first and attaches every claim to a cited source. Scheduling surfaces presented to users are hosted by graph-os. | Unit tests verify the explainer's output always derives from the computed math and that every claim cites a source.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-CONTEXT-R005.1",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Retrieval/decide-layer work lands under a commit that disclaims this row. No finance-scheduling or flip-explainer code ships",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "88c61dc9164c"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Retrieval/decide-layer work lands under a commit that disclaims this row. No finance-scheduling or flip-explainer code ships.** `status.json`'s `landed_in` commit `88c61dc9164c` delivers `AU-CONTEXT-R001`-`R004` (the retrieval/decide consumer layer) and its own commit message states `AU-CONTEXT-R005..R008` are \"not part of this slice\". No `flip_explainer.py`, finance backfill scheduler, or finance scan scheduler exists anywhere in the tree at `origin/main`. | Commit `88c61dc9164c`'s message names R005..R008 as out of scope. `git ls-tree -r origin/main` contains no `flip_explainer.py`.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-CONTEXT-R005.2",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Build finance scheduling and the sourced flip-explainer agent",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0209a00db1f0",
        "0c09b35ea390"
      ],
      "verified_by": [
        "tests/unit/finance_agents/test_flip_explainer.py:19"
      ],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Build finance scheduling and the sourced flip-explainer agent.** agent-utilities implements `flip_explainer.py`, a flip-explainer agent that computes its answer from math first and attaches every claim to a cited source, plus the finance backfill and scan scheduler the parent row describes; scheduling surfaces presented to users remain hosted by graph-os. | Unit tests verify the explainer's output always derives from the computed math and that every claim cites a source.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-CONTEXT-R006",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Paper trading is isolated; live orders need governed approval",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0cd7be250b3d",
        "88c61dc9164c"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Paper trading is isolated; live orders need governed approval.** agent-utilities exposes read-only positions and an isolated paper-trading simulation account. Live orders require the SDK's governed write-back contract, a verified human approval lease, account capability, and an exact idempotency key; no agent-utilities model output or UI payload can grant that authority. A finance widget replaces the placeholder widget, and duplicated finance math is removed from agent-utilities. | Negative tests confirm a live order is rejected without an approval lease and idempotency key, and that paper and live paths use isolated accounts.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 18
    },
    {
      "id": "AU-CONTEXT-R006.1",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "agent-utilities keeps finance agent roles only; paper trading stays isolated",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0cd7be250b3d",
        "636c91a16136",
        "dbe03a6687ca",
        "f474735cab25"
      ],
      "verified_by": [
        "tests/unit/finance/test_quant_live_order_refusal.py:36",
        "tests/unit/finance/test_quant_live_order_refusal.py:61"
      ],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**agent-utilities keeps finance agent roles only; paper trading stays isolated.** agent-utilities exposes read-only positions and an isolated paper-trading simulation account, deletes duplicated finance math/connector modules, and documents that no local model output or UI payload can grant live-order authority. | A negative test confirms the paper path uses an isolated account and that no agent-utilities code path can authorize a live order.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 19
    },
    {
      "id": "AU-CONTEXT-R007",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Finance math and feeds move out of agent-utilities",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "703c3eb9d88d",
        "88c61dc9164c",
        "af11c84309ee"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Finance math and feeds move out of agent-utilities.** agent-utilities deletes its deterministic finance math and quant tooling, moving the equivalent calculations to epistemic-graph's finance core. Market data, market feeds, crypto, exchange, banking, and payments connectors move to SDK connector packages; agent-utilities retains only the finance agent roles: trading_swarm, debate_engine, investor_debate, research_autopilot, and persona_heuristics. Split: `engine_finance.py` is still the live implementation today, so this lands in two steps; see `AU-CONTEXT-R007.1`/`.2`. | An import census confirms no finance math or connector modules remain in agent-utilities, and parity tests cover the migrated calculations at their new owner.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 22
    },
    {
      "id": "AU-CONTEXT-R007.1",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "A boundary test pins the finance-math module set, and a typed delegation seam prefers EG when available",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0209a00db1f0",
        "4eac8c6dc419",
        "af11c84309ee",
        "f474735cab25"
      ],
      "verified_by": [
        "tests/unit/finance/test_finance_delegation.py:16",
        "tests/unit/finance/test_finance_delegation.py:23",
        "tests/unit/finance/test_finance_delegation.py:41"
      ],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**A boundary test pins the finance-math module set, and a typed delegation seam prefers EG when available.** `tests/unit/finance/test_r007_finance_module_boundary.py` pins the current `agent_utilities/domains/finance/*.py` module set so it may only shrink, never grow, and `api/finance_delegation.py` gives callers one typed seam (`kelly_size_via_eg_or_local`) that calls EG's finance-core primitives when `resolve_finance_primitives_client()` finds them installed, falling back to the caller-supplied local calculation otherwise. | A test confirms the current module set is a subset of the pinned baseline, confirms the delegation seam falls back to the local calculation while EG's finance-core client is absent, and confirms it would delegate to EG's client if one were installed.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 23
    },
    {
      "id": "AU-CONTEXT-R007.2",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "The local finance-math modules and the fallback branch are deleted after cutover",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "9effc03d5c99",
        "f0f5e51f6b47"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**The local finance-math modules and the fallback branch are deleted after cutover.** Once epistemic-graph's finance core has documented, per-method parity evidence for every calculation the pinned module set names, `agent_utilities/domains/finance/**` (excluding the five retained agent-role modules) and `engine_finance.py` are deleted, the delegation seam's local-fallback branch in `finance_delegation.py` is removed, and the pinned baseline in the boundary test shrinks to match, closing `AU-CONTEXT-R007`. | An import census confirms no finance math or connector modules remain in agent-utilities, and parity tests cover the migrated calculations at their new owner.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 24
    },
    {
      "id": "AU-CONTEXT-R007.2.1",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Delete the local finance-math modules and fallback branch once EG parity evidence exists",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Delete the local finance-math modules and fallback branch once EG parity evidence exists.** `agent_utilities/domains/finance/**` (excluding the five retained agent-role modules: `trading_swarm`, `debate_engine`, `investor_debate`, `research_autopilot`, `persona_heuristics`) and `agent_utilities/knowledge_graph/orchestration/engine_finance.py` are still present on `origin/main` post-claimed-cutover; the local-fallback branch in `agent_utilities/api/finance_delegation.py` is not removed; `tests/unit/finance/test_r007_finance_module_boundary.py` still pins the pre-cutover module set. This remains blocked on epistemic-graph: `EG-FINANCE-PRIMITIVES-R016` has Pine-parity fixtures only for ATR/SuperTrend, missing SMA, EMA, 200-week SMA, the 20/21 band, and Heikin-Ashi. | An import census confirms no finance math or connector modules remain in agent-utilities beyond the five retained role modules; parity tests cover every migrated calculation at its new owner in epistemic-graph, gated on `EG-FINANCE-PRIMITIVES-R016` delivering full Pine-parity fixtures.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 25
    },
    {
      "id": "AU-CONTEXT-R008",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Finance recommendations are calibrated, cited, and informational",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0cd7be250b3d",
        "88c61dc9164c"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Finance recommendations are calibrated, cited, and informational.** agent-utilities produces a calibrated recommendation for each holding or watchlist item, to accumulate, hold, or de-risk, that may abstain when evidence is inadequate and cites its strategy version and supporting evidence. Each recommendation is recorded as an informational-only AnalysisSnapshot, with per-strategy scorecards tracked for comparison. | Unit tests confirm recommendations abstain below a calibration threshold and that every AnalysisSnapshot cites a strategy version and evidence identifiers.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 26
    },
    {
      "id": "AU-CONTEXT-R008.1",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Typed, calibrated AnalysisSnapshot model with abstention",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0cd7be250b3d",
        "af11c84309ee",
        "f474735cab25"
      ],
      "verified_by": [
        "tests/unit/finance/test_analysis_snapshot_recommendation.py:27",
        "tests/unit/finance/test_analysis_snapshot_recommendation.py:47",
        "tests/unit/finance/test_analysis_snapshot_recommendation.py:64"
      ],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Typed, calibrated AnalysisSnapshot model with abstention.** agent-utilities defines the `AnalysisSnapshot`/`StrategyScorecard` typed model and a `recommend()` builder that abstains when evidence is missing or confidence is below a calibration threshold; `informational_only` is fixed `True` and not settable, and no order-submission entry point exists here. | Unit tests confirm abstention below the calibration threshold and when no evidence is cited, and that a non-abstaining snapshot always carries its strategy version and evidence identifiers.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 27
    },
    {
      "id": "AU-CONTEXT-R008.2",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "A real entry point produces recommendations from live holdings",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "9effc03d5c99"
      ],
      "verified_by": [
        "tests/unit/finance/test_recommend_entrypoint.py:57",
        "tests/unit/finance/test_recommend_entrypoint.py:78"
      ],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**A real entry point produces recommendations from live holdings.** agent-utilities wires `recommend()` to the real holdings/watchlist read path (positions, market observations) and a registered tool/agent entry point, replacing any placeholder recommendation output. | An integration test confirms a recommendation for a real holding ID flows through the registered entry point and returns an `AnalysisSnapshot`.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 28
    },
    {
      "id": "AU-CONTEXT-R008.3",
      "kind": "requirement",
      "parent": "AU-CONTEXT",
      "source": "specs/agent-context-and-finance/status.json",
      "title": "Per-strategy scorecards persist for comparison",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "9effc03d5c99"
      ],
      "verified_by": [
        "tests/unit/finance/test_recommend_entrypoint.py:122",
        "tests/unit/finance/test_recommend_entrypoint.py:92"
      ],
      "parent_title": "AU-CONTEXT \u2014 Agent context, retrieval feedback and finance roles",
      "definition": "**Per-strategy scorecards persist for comparison.** Each strategy version's `StrategyScorecard` is persisted (not recomputed in-memory per call) so multiple strategies can be compared over time. | A test confirms scorecard state for a strategy version survives across separate `recommend()` calls and is queryable per strategy version.",
      "definition_source": "specs/agent-context-and-finance/requirements.md",
      "definition_line": 29
    },
    {
      "id": "AU-CONTROL",
      "kind": "spec",
      "parent": null,
      "source": "specs/agent-control-plane/status.json",
      "title": "AU-CONTROL \u2014 Agent control plane",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/agent-control-plane/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/agent/factory.py:529",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/agent/factory.py#L529"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/capabilities/fleet_tool_search.py:198",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/capabilities/fleet_tool_search.py#L198"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/capabilities/fleet_tool_search.py:54",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/capabilities/fleet_tool_search.py#L54"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/capabilities/fleet_tool_search.py:84",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/capabilities/fleet_tool_search.py#L84"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/core/cgroup_resources.py:52",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/core/cgroup_resources.py#L52"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/decide/consumers/task_planner.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/decide/consumers/task_planner.py"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/deployment/skill_validation.py:590",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/deployment/skill_validation.py#L590"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/graph/builder.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/graph/builder.py"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/graph/coordination.py:255",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/graph/coordination.py#L255"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/graph/coordination.py:51",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/graph/coordination.py#L51"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/graph/hierarchical_coordination.py:65",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/graph/hierarchical_coordination.py#L65"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/graph/planning/__init__.py:165",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/graph/planning/__init__.py#L165"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/knowledge_graph/enrichment/writeback/approval.py:47",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/knowledge_graph/enrichment/writeback/approval.py#L47"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/mcp/tools/engine_surface_tools.py:1694",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/mcp/tools/engine_surface_tools.py#L1694"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/orchestration/agent_library.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/orchestration/agent_library.py"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/rlm/sandboxes/_bridge.py:287",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/rlm/sandboxes/_bridge.py#L287"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/rlm/sandboxes/container_fork_backend.py:54",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/rlm/sandboxes/container_fork_backend.py#L54"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/runtime/run_vcs/carrier.py:101",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/runtime/run_vcs/carrier.py#L101"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/runtime/run_vcs/kernel.py:145",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/runtime/run_vcs/kernel.py#L145"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/runtime/run_vcs/run_commit.py:30",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/runtime/run_vcs/run_commit.py#L30"
        },
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/runtime/run_vcs/run_session.py:39",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/runtime/run_vcs/run_session.py#L39"
        },
        {
          "declared_in": "specs/agent-control-plane/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-control-plane/requirements.md"
        },
        {
          "declared_in": "specs/agent-control-plane/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-control-plane/status.json"
        },
        {
          "declared_in": "specs/agent-control-plane/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/unit/decide/test_task_planner.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/tests/unit/decide/test_task_planner.py"
        },
        {
          "declared_in": "specs/agent-control-plane/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/unit/knowledge_graph/test_virtual_graph.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/tests/unit/knowledge_graph/test_virtual_graph.py"
        },
        {
          "declared_in": "specs/agent-control-plane/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/unit/test_intent_fleet_ranking_and_ties.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/tests/unit/test_intent_fleet_ranking_and_ties.py"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/agent-control-plane/plan.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "harness-evolution",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/harness-evolution/spec.md"
        }
      ],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "AU-CONTROL-R001",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Layered agent execution stack from task mapping to harness run",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c049e325e91d",
        "e0420bc5ba59"
      ],
      "verified_by": [
        "tests/unit/layers/test_harness_port.py:115",
        "tests/unit/layers/test_harness_port.py:124",
        "tests/unit/layers/test_harness_port.py:504"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Layered agent execution stack from task mapping to harness run.** agent-utilities implements agent layers L0 through L5 that turn a task into a committed plan obtained from epistemic-graph and execute it through a harness and sandbox abstraction, so the same committed plan can run across different underlying agent harnesses. | Proven by a conformance kit that exercises every layer end to end across each supported harness adapter.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-CONTROL-R002",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Component routing through one committed graph-engine decision",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4351f26b3d3b",
        "c049e325e91d",
        "e0420bc5ba59"
      ],
      "verified_by": [
        "tests/unit/decide/test_routing_consumers.py:52"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Component routing through one committed graph-engine decision.** agent-utilities selects the model, prompt, skill, tool, harness, account mode, and sandbox for a run by requesting a single committed decision from epistemic-graph rather than choosing them itself, and binds the selected component digests into the resulting run. | Proven by a generated-client contract test asserting routing requests produce one committed decision with bound component digests.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-CONTROL-R003",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Agent graph composition via epistemic-graph assembly, not an LLM",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c049e325e91d",
        "e0420bc5ba59"
      ],
      "verified_by": [
        "tests/unit/decide/test_assembly_consumer.py:46"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Agent graph composition via epistemic-graph assembly, not an LLM.** agent-utilities builds its agent execution graph by calling epistemic-graph's assembly interface through the generated client, and must not compose the graph with a language model or a local shadow solver. | Proven by a source-level gate plus a deterministic fixture test confirming graph construction only calls the generated assembly client.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-CONTROL-R004",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Abstention escalations re-enter as labelled claims, not proofs",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c049e325e91d",
        "e0420bc5ba59"
      ],
      "verified_by": [
        "tests/unit/decide/test_runner.py:68"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Abstention escalations re-enter as labelled claims, not proofs.** When agent-utilities abstains on an unknown or unverified premise and escalates to a model or a human for input, that response is recorded as a labelled claim fed back into epistemic-graph, not treated as an authoritative decision or proof. | Proven by a negative test asserting an escalation response cannot authorize execution without a subsequent committed decision.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-CONTROL-R005",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Advisory pre-tool risk scoring",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "47a52e7442bd",
        "c049e325e91d",
        "e0420bc5ba59"
      ],
      "verified_by": [
        "tests/unit/decide/test_risk_consumer.py:11",
        "tests/unit/decide/test_risk_consumer.py:24"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Advisory pre-tool risk scoring.** agent-utilities computes an advisory risk score for a proposed tool call before it executes. It surfaces that score to the caller and to epistemic-graph's decision. It never authorizes or blocks the call itself. | Proven by a unit test. It asserts a high-risk score is advisory only. The score never substitutes for a committed decision or policy check.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-CONTROL-R006",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Cost-aware routing informed by usage accounting",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4351f26b3d3b",
        "a1dd4111f04f",
        "c049e325e91d"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Cost-aware routing informed by usage accounting.** agent-utilities' routing requests include accumulated usage and cost accounting from its own event layer as an input to epistemic-graph's decision, so a later run can be routed with awareness of prior spend rather than ignoring it. | Proven by an integration test showing recorded usage data changes a subsequent routing decision's cost inputs.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-CONTROL-R006.1",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "A production ObservedCost implementer and a caller in routing",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "6a43f914f823"
      ],
      "verified_by": [
        "tests/unit/decide/test_routing_consumers.py:78"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**A production ObservedCost implementer and a caller in routing.** `agent_utilities/decide/consumers/routing.py` defines the `ObservedCost` protocol. No production implementer backed by the usage/cost event layer exists. The functions `route_by_cost`, `route_choice` and `route_model` never receive a real `observed` argument. Routing therefore never sees real usage cost. | An integration test wires a real `ObservedCost` implementer into a routing call. The implementer reads recorded usage events. The test asserts the decision's cost inputs change.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-CONTROL-R007",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Swarm topology selection routed through Decide",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a1dd4111f04f",
        "c049e325e91d"
      ],
      "verified_by": [
        "tests/unit/decide/test_topology_consumer.py:145",
        "tests/unit/decide/test_topology_consumer.py:156"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Swarm topology selection routed through Decide.** agent-utilities selects multi-agent swarm topology, including width, rounds, stop rule, and subagent caps, by requesting a decision from epistemic-graph instead of a local heuristic, covering the topology families delivered under AU-CONTROL-R009 through AU-CONTROL-R020. | Proven by integration tests across the supported topology families confirming each selection traces to a committed decision.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-CONTROL-R008",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Free-text task mapping accepted only as a labelled claim",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a1dd4111f04f",
        "c049e325e91d",
        "fdd333b5545a"
      ],
      "verified_by": [
        "tests/unit/test_task_classification.py:30",
        "tests/unit/test_task_classification.py:37",
        "tests/unit/test_task_classification.py:65"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Free-text task mapping accepted only as a labelled claim.** When agent-utilities proposes a mapping from a free-text task description to a task IRI, epistemic-graph accepts it only as a labelled claim requiring evidence, never as an authoritative proof of task identity. | Proven by mapping and refusal tests confirming an unproven free-text mapping cannot authorize execution.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-CONTROL-R009",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Swarm topology ontology and schema publication",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a1dd4111f04f",
        "c049e325e91d",
        "da99e968d6c7"
      ],
      "verified_by": [
        "tests/unit/decide/test_swarm_topology_schema.py:136",
        "tests/unit/decide/test_swarm_topology_schema.py:94"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Swarm topology ontology and schema publication.** agent-utilities publishes a swarm-topology ontology and SHACL shapes (agent_utilities/knowledge_graph/ontology/swarm_topology/topology.ttl and shapes.ttl) through epistemic-graph's schema attachment interface, with positive and negative fixtures validating the published shapes. | Proven by SHACL positive and negative fixture tests against the published topology shapes.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-CONTROL-R010",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Reference swarm topology templates",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a1dd4111f04f",
        "c049e325e91d",
        "da99e968d6c7"
      ],
      "verified_by": [
        "tests/unit/decide/test_swarm_topology_schema.py:164",
        "tests/unit/decide/test_swarm_topology_schema.py:95"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Reference swarm topology templates.** agent-utilities provides a fixed set of reference agent-graph templates in decide/topology/templates.py, covering single agent, pipeline, fan-out/join, supervisor with workers, critique loop, and council, each carrying topology facts consumed by epistemic-graph's decision. | Proven by unit tests confirming each template produces topology facts accepted by the decision contract.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-CONTROL-R011",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Consume the generated topology contract via a pinned dependency",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c049e325e91d",
        "da99e968d6c7"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Consume the generated topology contract via a pinned dependency.** agent-utilities consumes epistemic-graph's topology contract types, including assembly topology requirements and topology facts, through the generated Python client, and updates its pinned epistemic-graph dependency to the revision that introduces them. | Proven by a contract test against the generated client's golden fixtures for the topology types.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-CONTROL-R012",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Agent-graph templates validated against topology shape at publish",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c049e325e91d"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Agent-graph templates validated against topology shape at publish.** When agent-utilities publishes an agent-graph template, epistemic-graph validates it against the template topology shape and rejects it immediately if the shape check fails, so an invalid template can never become available. | Proven by a negative test publishing a malformed template and asserting fail-closed rejection before availability.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-CONTROL-R013",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Topology options filtered by admissibility derivation",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "148ef73124d2",
        "c049e325e91d"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Topology options filtered by admissibility derivation.** agent-utilities submits a composed-schema digest as part of its topology request and relies on epistemic-graph's derivation of admissible topology options to eliminate any option that is not entailed as admissible before selection. | Proven by a fixture test where an inadmissible topology option is excluded from the candidate set returned to agent-utilities.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 18
    },
    {
      "id": "AU-CONTROL-R014",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "No local topology solver, defer to the validated graph-engine model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "148ef73124d2",
        "c049e325e91d",
        "f764531c7dd3"
      ],
      "verified_by": [
        "tests/gates/test_topology_authority_gate.py:25",
        "tests/gates/test_topology_authority_gate.py:30"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**No local topology solver, defer to the validated graph-engine model.** agent-utilities does not implement its own topology constraint solver. It relies entirely on epistemic-graph's precomputed, oracle-validated model. That model covers feasible width, rounds, lease, deadline, demand and capacity. AU applies it when selecting a topology. | Proven by a source gate confirming no local topology solver exists. A second test cross-checks a brute-force oracle result for small instances.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 19
    },
    {
      "id": "AU-CONTROL-R015",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Topology consumer asks the graph engine, not a local success store",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "148ef73124d2",
        "c049e325e91d"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Topology consumer asks the graph engine, not a local success store.** agent-utilities' topology consumer in decide/consumers/topology.py requests its topology decision from epistemic-graph and builds its admission limits from the resulting decision; the previous local outcome-recording, moving-average, and success-rate reuse logic is removed, and a source gate prevents any component from writing a topology template directly into the graph store. | Proven by a source gate test that fails if a direct topology-template write or the removed local success-rate logic reappears.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 20
    },
    {
      "id": "AU-CONTROL-R016",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Topology decisions respect capacity headroom at request priority",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "148ef73124d2",
        "c049e325e91d"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Topology decisions respect capacity headroom at request priority.** agent-utilities' topology requests factor in epistemic-graph's capacity status as a headroom observation scoped to the request's priority, and treat an infeasible-lease result as a refusal rather than retrying with a heuristic fallback. | Proven by a negative test asserting a request is refused, not silently retried, when capacity status reports an infeasible lease.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 21
    },
    {
      "id": "AU-CONTROL-R017",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Single re-decision on capacity denial for topology admission",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "6d8865040871",
        "e78a5cf3de4e"
      ],
      "verified_by": [
        "tests/unit/decide/test_topology_consumer.py:209",
        "tests/unit/decide/test_topology_consumer.py:223"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Single re-decision on capacity denial for topology admission.** When agent-utilities requests topology capacity admission and it is denied, it requests at most one fresh decision before giving up, and releases any acquired capacity as soon as the run stops rather than holding it until timeout. | Proven by an integration test asserting exactly one re-decision attempt on denial and capacity release on stop.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 22
    },
    {
      "id": "AU-CONTROL-R018",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Subagent allowance negotiated into the run specification",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "bd37ae7764a6",
        "d008da7e66d1"
      ],
      "verified_by": [
        "tests/unit/layers/test_harness_port.py:199",
        "tests/unit/layers/test_harness_port.py:246",
        "tests/unit/layers/test_harness_port.py:258"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Subagent allowance negotiated into the run specification.** agent-utilities adds a subagent allowance field to its run specification and negotiates it against each harness adapter's enforcement capability in agent_utilities/layers/contracts.py and negotiation.py, so a harness that cannot enforce a child cap is flagged accordingly before launch. | Proven by the adapter conformance kit asserting the negotiated allowance matches each adapter's actual enforcement flag.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 23
    },
    {
      "id": "AU-CONTROL-R019",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Swarm continuation restricted to narrow-only decisions",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "21ccce45c2d7",
        "c049e325e91d"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Swarm continuation restricted to narrow-only decisions.** agent-utilities' swarm continuation point in decide/consumers/continuation.py evaluates only whether to stop or narrow a run in progress. It checks a stop rule over the run's usage data and never widens the run. It releases capacity whenever the run narrows. | Proven by a unit test. It asserts the continuation point refuses a widen request and releases capacity on narrow.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 24
    },
    {
      "id": "AU-CONTROL-R020",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Learned topology routing term with a benchmark gold set",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "21ccce45c2d7",
        "33dc0f5e9908",
        "75dc28c16382",
        "c049e325e91d"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Learned topology routing term with a benchmark gold set.** agent-utilities defines a feature schema and a work-market crediting mechanism for an optional learned topology-routing term. It evaluates the term against a benchmark gold set in tests/benchmarks/swarm_topology/. The term is promoted only through the decision engine's promotion gate (EG-DECISION-ENGINE-R040). Its cost offer depends on the expected-cost capability defined by AU-HARNESS-R003. | Proven by the synthetic width-quality benchmark and a promotion gate that blocks use of the learned term before it passes evaluation.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 25
    },
    {
      "id": "AU-CONTROL-R021",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Harness and sandbox access via direct typed ports, not a registrar",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "d8e0d2e999e1"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Harness and sandbox access via direct typed ports, not a registrar.** agent-utilities accesses a harness and sandbox through direct, typed port methods. It uses no registrar indirection and no legacy adapter layer. | Proven by focused unit tests exercising the direct port methods and a source check confirming no registrar or legacy adapter path remains.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 26
    },
    {
      "id": "AU-CONTROL-R022",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Model selection routed through the committed decision, not ad hoc",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4351f26b3d3b",
        "c049e325e91d"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Model selection routed through the committed decision, not ad hoc.** agent-utilities selects which model to use for a run by requesting it from epistemic-graph's committed decision interface, rather than applying an ad hoc or locally hard-coded selection policy. | Proven by the generated-client contract test confirming model selection is bound to the decision's selected component digest.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 27
    },
    {
      "id": "AU-CONTROL-R023",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Catalog entries attributed to their originating server",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "0d62109b2c36"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Catalog entries attributed to their originating server.** agent-utilities' component catalog used for routing records which server each tool or skill entry originates from, so a routing decision and its audit trail can be traced to the correct source server rather than attributed ambiguously. | Proven by a unit test asserting each catalog entry's selection and audit record carries its correct originating-server attribution.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 28
    },
    {
      "id": "AU-CONTROL-R024",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Durable Agent Library with list, get and save",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8d94e1c97b28",
        "d10020c23444"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Durable Agent Library with list, get and save.** agent-utilities stores each built agent as one Agent Library record in the knowledge graph. A record holds the system prompt, tools, skills, model profile, context policy and role. The record reuses the existing `CallableResource` node and the runnable-skill field contract, so delegation runs a saved agent by name. The agent-webui `/api/enhanced/agent-library` routes and the `agent_library` intent tool read and write through one `AgentLibrary` class. | Proven by unit tests: an agent saved through the library is listed and read back with every field. The intent router lists it through `ask` and saves through a previewed `manage` plan. `ask` cannot save.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 29
    },
    {
      "id": "AU-CONTROL-R025",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Pre-built role agents from packaged fleet prompts",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8d94e1c97b28",
        "d10020c23444"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Pre-built role agents from packaged fleet prompts.** agent-utilities generates one `role` Agent Library record for each packaged prompt blueprint that names an `identity.role` and a directive. The `:Prompt` corpus supplies the blueprints, so generation reads no filesystem path. The shipping package is the record's MCP server. Its ingested tools bind on save. | Proven by unit tests: a role blueprint becomes a saved role agent with its package tools; a blueprint without a role produces no agent.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 30
    },
    {
      "id": "AU-CONTROL-R026",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Assembled agent graphs are committed, published and saved for reuse",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8d94e1c97b28",
        "d10020c23444"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Assembled agent graphs are committed, published and saved for reuse.** After a solved L3 assembly, agent-utilities commits the decision through the bound `commit_context` provider. It then publishes the graph through the bound `publish_context` provider with the committed record as evidence. It saves every solved graph as an `agent_graph` Agent Library record. The record holds the graph draft, the agents, the decision record id and the publish receipt. An uncommitted graph is saved but never published. | Proven by unit tests over the scripted EG client: commit, publish and library save all run for a committed graph. An uncommitted graph is saved and not published. A publish failure keeps the assembled agent.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 31
    },
    {
      "id": "AU-CONTROL-R027",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Task planner answers \"How can I execute task X?\" as one structured plan",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5301b427a6a5",
        "543b8157705e",
        "c44206e0d856"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Task planner answers \"How can I execute task X?\" as one structured plan.** The plan lists steps, agent count and types, reuse, guardrails, workflow and the DAG. A mapper proposes native task IRIs as a labelled claim. EG assembly supplies the skills, tools, prompt and model of each agent. The EG topology decision supplies the template, the DAG and the slot widths. A capability search finds Agent Library templates and external A2A agents per step. A guardrail source adds policy rules to the control-plane invariants. Every plan element cites its evidence class and its record. A missing port or an EG abstention becomes a named gap. A model never composes a substitute. | Unit tests over scripted EG answers cover a decided plan, an abstention, an unmapped goal and a plan without ports.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 32
    },
    {
      "id": "AU-CONTROL-R028",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "The ask intent routes planning questions to the task planner",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5301b427a6a5",
        "543b8157705e",
        "c44206e0d856"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**The ask intent routes planning questions to the task planner.** A bare `ask` that starts with \"how can I\", \"what steps\", \"which agents should\" or \"plan how\" returns the task plan. The result is read-only and carries its routing record. Any caller hint keeps the declared route of the caller. | Routing tests on the intent surface cover planning, non-planning and hinted questions.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 33
    },
    {
      "id": "AU-CONTROL-R029",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Cross-source reports select sources by ontology and read them live",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5301b427a6a5",
        "543b8157705e",
        "c44206e0d856"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Cross-source reports select sources by ontology and read them live.** The ontology names the classes in the question. Ontology relations link those classes into one path. Each class on the path uses its approved virtual mapping. The report joins live rows through bind joins along the path. No entity row enters the graph. A row budget marks the report incomplete and never truncates it. A bare `ask` routes such a question to this report when a catalog is installed. | A test with two fake sources proves source selection, live-only reads and fail-closed unapproved and over-budget cases.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 34
    },
    {
      "id": "AU-CONTROL-R030",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Virtual-graph contracts materialize metadata and hot subsets only",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5301b427a6a5",
        "543b8157705e",
        "c44206e0d856"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Virtual-graph contracts materialize metadata and hot subsets only.** A source connection names its endpoint by reference and refuses credentials. A metadata contract records discovered entities, fields, relationships and operations under a digest. A virtual mapping names discovered entities and fields only. A mapping serves reads only after approval. Connection, contract and mapping facts become graph facts. Entity rows stay at the source unless a hot subset meets the copy policy. EG-UNIFIED-DATA-PLANE-R037 owns the vocabulary. | Unit tests cover credential refusal, undiscovered-field refusal, metadata-only triples and the hot-subset decision.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 35
    },
    {
      "id": "AU-CONTROL-R031",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "`find` ranks fleet tools with native capabilities",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1ff1099e5d57",
        "4c334b7fc9ad",
        "b4c99c73265c",
        "df00e9a0b560",
        "e822fa6bb112"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**`find` ranks fleet tools with native capabilities.** A `find(intent=...)` call scores each fleet discovery hit with the native lexical scorer. Fleet hits and native capabilities share one `results` list. Each fleet row names its server and kind. A fleet tool row carries a `how_to_call` that `act(action='fleet.call')` executes. A failed fleet probe appears as `fleet_error`; it never disappears silently. | Unit tests in `tests/unit/test_intent_fleet_ranking_and_ties.py` rank a Docker fleet tool first, check its `how_to_call` and report a failed probe.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 36
    },
    {
      "id": "AU-CONTROL-R032",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "`act` calls a fleet tool by its server and tool id",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1ff1099e5d57",
        "28eb7b647b57",
        "e822fa6bb112"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**`act` calls a fleet tool by its server and tool id.** `act(action='<server>.<tool>')` resolves the catalog server and its tool. It mounts the child lazily through the multiplexer. It previews and executes through the same governed path as `fleet.call`. An unknown server or tool returns an actionable error. | Unit tests over a fake multiplexer cover preview, execute, unknown server and unknown tool.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 37
    },
    {
      "id": "AU-CONTROL-R033",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "A read-only action tie runs the declared default action",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1ff1099e5d57",
        "78a53983ae0b"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**A read-only action tie runs the declared default action.** When read actions tie for an unpinned `ask` or `why`, the router runs the default of the tool's own `action` parameter. The default must be a declared read action. The tied alternatives stay in the routing record. A tool without a read default still refuses the tie. | Unit tests cover a `graph_explain` tie that runs `explain` and a tie without a read default that refuses.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 38
    },
    {
      "id": "AU-CONTROL-R034",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "An unmatched read intent falls back to the NL planner",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1ff1099e5d57",
        "78a53983ae0b"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**An unmatched read intent falls back to the NL planner.** When the top capability matches no descriptor term, an unpinned `ask` routes to `nl_query`. The routing record sets `fell_back_to_nl_planner` and states the reason. A pinned tool or an explicit action never falls back. | Unit tests cover the unmatched fallback and the pinned and explicit-action exclusions.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 39
    },
    {
      "id": "AU-CONTROL-R035",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "The signed agent-dispatch envelope carries an enforced allowed-tool-subset field",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "8c6fb318c5d3"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**The signed agent-dispatch envelope carries an enforced allowed-tool-subset field.** The signed `AgentTurnEnvelope` produced by `enqueue_agent_turn` carries an explicit allowed-tool-subset field naming the exact tools a caller-filtered assembly admitted, bound into the signature. A harness or carrier reading the envelope enforces that subset at execution time rather than treating it as advisory. An envelope with no allowed-tool-subset field never authorizes a caller-filtered exposure claim by a consumer. This is the dependency a budget-constrained admission door (such as GraphOS's `GRAPHOS-A2A-002`) requires before it can enforce tool-subset exposure end to end. | Proven by a unit test asserting the envelope's signature covers the allowed-tool-subset field and a negative test asserting a consumer cannot claim caller-filtered exposure from an envelope lacking the field.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 40
    },
    {
      "id": "AU-CONTROL-R035.1",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Open the AU-CONTROL-R035 owner row",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "79a0b3968c7c"
      ],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Open the AU-CONTROL-R035 owner row.** Agent Utilities records, in `requirements.md` and `spec.md`, that the signed agent-dispatch envelope is missing an allowed-tool-subset field and that graph-os's `GRAPHOS-A2A-002` admission door depends on this row closing. | The row exists in `requirements.md` and is cross-referenced from `spec.md`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 41
    },
    {
      "id": "AU-CONTROL-R035.2",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Add and enforce the allowed-tool-subset field",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "018e9824140f"
      ],
      "verified_by": [
        "tests/unit/test_agent_dispatch.py:1309",
        "tests/unit/test_agent_dispatch.py:1345",
        "tests/unit/test_agent_dispatch.py:1363"
      ],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Add and enforce the allowed-tool-subset field.** Agent Utilities adds an `allowed_tool_subset` field to `AgentTurnEnvelope` (`agent_utilities/orchestration/agent_dispatch.py`), binds it into the `DispatchCarrier` signature payload alongside the envelope's other signed fields, and makes the carrier's consumer-side check reject execution when a tool outside that subset is invoked or when the field is absent from a caller-filtered claim. | A unit test asserts the envelope's signature covers `allowed_tool_subset`; a negative test asserts a consumer cannot claim caller-filtered exposure from an envelope lacking the field \u2014 both passing against real code, not just the spec text.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 42
    },
    {
      "id": "AU-CONTROL-R035.3",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Typed `harness_config` envelope field",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Typed `harness_config` envelope field.** `AgentTurnEnvelope` (`agent_utilities/orchestration/agent_dispatch.py:471`) gains a `harness_config` field of type `HarnessConfig` (`AU-HARNESS-R012.1`). The field sits next to `allowed_tool_subset` (`agent_dispatch.py:509`). The default is `None`. | `tests/unit/test_agent_dispatch.py::test_envelope_carries_harness_config`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 43
    },
    {
      "id": "AU-CONTROL-R035.4",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Sign the field",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Sign the field.** `DispatchCarrier` (`agent_dispatch.py:180`) must bind a digest of `harness_config` into its signature payload beside `allowed_tool_subset` (`agent_dispatch.py:210`, `:263`). A changed config must change the signature. | `tests/unit/test_agent_dispatch.py::test_signature_covers_harness_config`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 44
    },
    {
      "id": "AU-CONTROL-R035.5",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Reject a changed field",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Reject a changed field.** `DispatchCarrier.verify` (`agent_dispatch.py:350`) must accept an expected `harness_config` and reject a mismatch. The worker passes the config it applies. | `tests/unit/test_agent_dispatch.py::test_verify_rejects_tampered_harness_config`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 45
    },
    {
      "id": "AU-CONTROL-R035.6",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Refuse an absent field",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Refuse an absent field.** A harness-run job whose envelope has no `harness_config` must be refused at claim time with reason `harness_config_absent`. The worker must not substitute a default. | `tests/unit/test_agent_dispatch_worker.py::test_absent_harness_config_refused`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 46
    },
    {
      "id": "AU-CONTROL-R035.7",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Producers set the field",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Producers set the field.** The three envelope producers (`core/sessions.py:1231`, `mcp/tools/job_tools.py:89`, `integrations/git_resolver.py:234`) must pass the committed `HarnessConfig` into the envelope. A producer with no committed answer must refuse to enqueue. | `tests/unit/test_agent_dispatch.py::test_producers_enqueue_with_committed_config`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 47
    },
    {
      "id": "AU-CONTROL-R036",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Obtain `harness_config` from the engine's `HarnessConfig` decision",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Obtain `harness_config` from the engine's `HarnessConfig` decision.** AU must request the configuration from the engine's `HarnessConfig` decision on the same path that model selection uses. AU must apply the committed answer unchanged and must never compute a configuration locally. An abstention or refusal from the engine must stop the enqueue with a typed reason. | The end-to-end row proves the engine answer reaches the signed envelope.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 48
    },
    {
      "id": "AU-CONTROL-R036.1",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Name the shared path",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Name the shared path.** Model selection today runs `route_model` (`agent_utilities/decide/consumers/routing.py:58`), `decide.choose` (`decide/__init__.py:67`), `DecisionRunner.choose` (`decide/runner.py:218`) and the transport `decide` call (`decide/transport.py:28`). The new consumer must use the same runner and transport. | `tests/unit/test_decide_harness_config.py::test_consumer_uses_shared_runner_and_transport`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 49
    },
    {
      "id": "AU-CONTROL-R036.2",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Typed answer model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Typed answer model.** `agent_utilities/decide/consumers/harness_config.py` defines `HarnessConfigAnswer` with `context_policy`, the thresholds, `recent_window_fraction`, `plan_scaffold`, `action_space`, the allowed tool subset, premises, why-not entries, resolution kind and typed abstention. Field names must match the engine contract. | `tests/unit/test_decide_harness_config.py::test_answer_model_matches_contract_fixture`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 50
    },
    {
      "id": "AU-CONTROL-R036.3",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Request function",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Request function.** `decide_harness_config` must send the model profile reference, the task class, the usable context budget and the request priority. It returns a `HarnessConfig` or a typed abstention. | `tests/unit/test_decide_harness_config.py::test_request_inputs_and_answer_mapping`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 51
    },
    {
      "id": "AU-CONTROL-R036.4",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Abstention is not a guess",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Abstention is not a guess.** When the answer abstains because a model fact is unmeasured, the consumer must return the abstention with the missing fact name. It must not fill any part from a default. | `tests/unit/test_decide_harness_config.py::test_abstention_carries_missing_fact`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 52
    },
    {
      "id": "AU-CONTROL-R036.5",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Wire into the producers",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Wire into the producers.** The producers in `AU-CONTROL-R035.7` must call `decide_harness_config` before they build the envelope. They must pass the usable budget from the admitted task. | `tests/unit/test_agent_dispatch.py::test_producer_calls_decision_before_envelope`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 53
    },
    {
      "id": "AU-CONTROL-R036.6",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Trace the decision",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Trace the decision.** The committed decision identifier must travel in the envelope and into the run trace, so the `EG` run-trace row can link a run to its decision. | `tests/unit/test_decide_harness_config.py::test_decision_id_in_envelope_and_trace`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 54
    },
    {
      "id": "AU-CONTROL-R036.7",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "End-to-end proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**End-to-end proof.** A fake engine answers `HarnessConfig`. A producer must enqueue a signed envelope carrying the answer, and the run must apply it. A second case with an abstention must refuse the enqueue. | `tests/harness/test_runloop_envelope_e2e.py::test_decision_to_signed_envelope_to_run`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 55
    },
    {
      "id": "AU-CONTROL-R037",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Skill workflow templates run through one orchestrate call and fill tool gaps by search",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Skill workflow templates run through one orchestrate call and fill tool gaps by search.** AU must instantiate a skill workflow's agent team and fan-out template as one agent graph. AU must fill each unmet tool slot from the installed fleet. AU must refuse the run when no admissible tool exists. | The end-to-end row proves a gap is filled and a second gap refuses.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 56
    },
    {
      "id": "AU-CONTROL-R037.1",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Typed gap model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Typed gap model.** `agent_utilities/decide/consumers/workflow_gaps.py` defines `WorkflowGap` with slot name, required capability, candidate tool ids and resolution kind. | `tests/unit/test_workflow_gaps.py::test_gap_model_fields`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 57
    },
    {
      "id": "AU-CONTROL-R037.2",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Detect unmet slots",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Detect unmet slots.** `find_workflow_gaps` must compare the template's tool slots with the installed fleet catalog. It must return one `WorkflowGap` per unmet slot. | `tests/unit/test_workflow_gaps.py::test_unmet_slot_becomes_gap`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 58
    },
    {
      "id": "AU-CONTROL-R037.3",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Fill from the committed ranking",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Fill from the committed ranking.** `fill_workflow_gaps` must take candidates from the `find` ranking and apply the engine's committed choice unchanged. It must not rank candidates locally. | `tests/unit/test_workflow_gaps.py::test_fill_applies_committed_choice`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 59
    },
    {
      "id": "AU-CONTROL-R037.4",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Refuse instead of inventing a tool",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Refuse instead of inventing a tool.** When no candidate is admissible, AU must stop the run before graph build. The typed reason must name the slot. AU must not ask a model to invent a tool. | `tests/unit/test_workflow_gaps.py::test_no_candidate_refuses_with_slot`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 60
    },
    {
      "id": "AU-CONTROL-R037.5",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Wire into workflow execution",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Wire into workflow execution.** Locate where `graph_orchestrate` hands a workflow to `execute_workflow`. That call must run `find_workflow_gaps` and `fill_workflow_gaps` before graph assembly. | `tests/unit/test_workflow_gaps.py::test_execute_workflow_fills_gaps_first`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 61
    },
    {
      "id": "AU-CONTROL-R037.6",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "End-to-end proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**End-to-end proof.** A fake engine and a fake fleet catalog serve a workflow with a missing pull-request tool slot. The run must fill the slot and execute. A second workflow with no matching tool must refuse. | `tests/harness/test_workflow_gap_e2e.py::test_gap_filled_then_refused`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 62
    },
    {
      "id": "AU-CONTROL-R038",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Model-written code runs only in a restricted interpreter",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Model-written code runs only in a restricted interpreter.** Code that a model writes runs in an embedded interpreter that cannot reach the filesystem, environment or network. Only host-controlled external functions give access, and resource limits apply to every run. | See children `AU-CONTROL-R038.1` to `AU-CONTROL-R038.6`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 63
    },
    {
      "id": "AU-CONTROL-R038.1",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Model.** `SandboxCapabilities` in `agent_utilities/rlm/sandboxes/base.py:44` gains a closed `isolation` field with values `restricted_interpreter`, `wasm`, `container` and `microvm`. Each run carries a `ResourceLimits` record with wall time, memory and call count. | `tests/unit/rlm/test_sandbox_capabilities.py::test_isolation_values_closed`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 64
    },
    {
      "id": "AU-CONTROL-R038.2",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Behavior.** The restricted interpreter must expose only the helpers in `SandboxEnv.helpers`. Each helper is a named, replaceable default and counts its calls against the limit. Filesystem, environment and network names must be absent from the interpreter namespace. | `tests/unit/rlm/test_restricted_interpreter.py::test_only_host_helpers_reachable`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 65
    },
    {
      "id": "AU-CONTROL-R038.3",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Wiring.** `Router.select` at `agent_utilities/rlm/sandboxes/router.py:59` orders the restricted interpreter first for code that needs no library access. Production callers are `agent_utilities/harness/online_scoring.py:106` and `agent_utilities/knowledge_graph/research/change_synthesis.py:276`, which iterate over the chain. | `tests/unit/rlm/test_router.py::test_restricted_interpreter_first`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 66
    },
    {
      "id": "AU-CONTROL-R038.4",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Refusal.** A syntax element the interpreter does not support must raise `SandboxRejected` (`agent_utilities/rlm/sandboxes/base.py:133`) with a reason naming the element. A call over its limit must return a typed `limit_exceeded` result. The router must escalate to the next tier. It must not run the code unrestricted. | `tests/unit/rlm/test_restricted_interpreter.py::test_unsupported_construct_rejected`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 67
    },
    {
      "id": "AU-CONTROL-R038.5",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Evidence.** Each run must record the backend name, the limits applied, the helpers called and the rejection reason in the run trace. A reviewer can then tell which tier ran the code and why it escalated. | `tests/unit/rlm/test_restricted_interpreter.py::test_trace_fields_recorded`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 68
    },
    {
      "id": "AU-CONTROL-R038.6",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Hot-path proof.** The entry point is the metric-scoring run loop at `agent_utilities/harness/online_scoring.py`. A snippet that opens a file must be rejected at the restricted tier. It must then escalate through the router. The trace must name both tiers. | `tests/harness/test_online_scoring_isolation.py::test_file_access_snippet_escalates`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 69
    },
    {
      "id": "AU-CONTROL-R039",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Fan-out sandboxes branch from a warmed parent and refuse typed",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Fan-out sandboxes branch from a warmed parent and refuse typed.** Child sandboxes start from one warmed parent through copy-on-write memory snapshots. A running sandbox may branch into a new parent with a layered diff snapshot. Each child stays isolated and each branch is audited. | See children `AU-CONTROL-R039.1` to `AU-CONTROL-R039.6`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 70
    },
    {
      "id": "AU-CONTROL-R039.1",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Model.** `BranchRequest` and `BranchResult` in `agent_utilities/rlm/sandboxes/base.py` carry the child identifier, a tag, a mode of `full`, `diff` or `live`, and the new parent handle. A `BranchRefusal` carries a closed reason: `no_snapshot_support`, `unknown_child` or `host_unavailable`. | `tests/unit/rlm/test_branch_models.py::test_branch_models_closed_reasons`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 71
    },
    {
      "id": "AU-CONTROL-R039.2",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Behavior.** A branch must snapshot the running child and register the result as a parent in the warm registry. The source child must keep running. Each child must start with its own namespace and no shared writable state. The default mode is `diff`. | `tests/unit/rlm/test_branch_behavior.py::test_branch_registers_parent`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 72
    },
    {
      "id": "AU-CONTROL-R039.3",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Wiring.** `ForkableSandbox.branch` is defined at `agent_utilities/rlm/sandboxes/base.py:222` and has no production caller today. This row creates the call site in `_fork_fanout` (`agent_utilities/mcp/tools/engine_surface_tools.py:1694`), which calls `branch` when a fan-out branch asks to continue from a running child. | `tests/unit/test_fork_fanout_branch.py::test_fanout_calls_branch`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 73
    },
    {
      "id": "AU-CONTROL-R039.4",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Refusal.** A rung that cannot snapshot must return `BranchRefusal` with reason `no_snapshot_support`. `_fork_fanout` must report the refusal in its payload and must not fall back to a cold start without saying so. | `tests/unit/test_fork_fanout_branch.py::test_unsupported_rung_refuses_typed`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 74
    },
    {
      "id": "AU-CONTROL-R039.5",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Evidence.** Each branch must write an audit record and a metric with the source child, the tag, the mode and the snapshot size. Each refusal must write the closed reason. | `tests/unit/rlm/test_branch_behavior.py::test_branch_audit_and_metric`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 75
    },
    {
      "id": "AU-CONTROL-R039.6",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Hot-path proof.** The entry point is the served fork fan-out operation backed by `_fork_fanout`. A fake rung with snapshot support serves two branches. The test observes a registered parent, an audit record per branch and a typed refusal on a rung without support. | `tests/integration/test_fork_fanout_served.py::test_branch_through_served_fanout`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 76
    },
    {
      "id": "AU-CONTROL-R040",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "The harness holds run output uncommitted and applies the verdict it receives",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**The harness holds run output uncommitted and applies the verdict it receives.** Each run writes workspace changes into a held layer. The harness adapts the received `HeldItemVerdict` from graph-os. It applies admitted proposals, drops rejected local layers, and keeps abstained proposals held. The run's durable record is an engine fact (EG-DECISION-ENGINE). | See children `AU-CONTROL-R040.1` to `AU-CONTROL-R040.6`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 77
    },
    {
      "id": "AU-CONTROL-R040.1",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Model.** `WorkspaceProposal` in `agent_utilities/runtime/run_vcs/proposal.py` (new) holds the run id, the base `FsSnapshot` id and the changed paths with digests. It receives `HeldItemVerdict` from GRAPHOS-A2A-R006, with `outcome` (`admitted`, `rejected`, `abstained`) and `verdict_ref`. The harness preserves these wire values and stores no decision. | `tests/unit/runtime/test_workspace_proposal.py::test_holds_paths_and_digests`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 78
    },
    {
      "id": "AU-CONTROL-R040.2",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Behavior.** The run writes into a layer over the base tree. `FsCarrier.snapshot` (`runtime/run_vcs/carrier.py:121`) captures the layer. The adapter maps `admitted` to apply and `rejected` to drop only the local uncommitted layer. It maps `abstained` to keep held. An unavailable producer or typed refusal also keeps the proposal held, with no filesystem effect. The engine retains its authoritative held-item record. | `tests/unit/runtime/test_workspace_proposal.py::test_admission_outcome_adapter`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 79
    },
    {
      "id": "AU-CONTROL-R040.3",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Wiring.** `RunSession` (`run_session.py:39`) and `FsCarrier` (`carrier.py:101`) have no production caller today. This row creates the call site in the served `execute_agent` operation. The call site holds the layer before the first tool call. `RunSessionRegistry` (`run_session.py:201`) is reached today only by replay at `mcp/tools/state_tools.py:1570`. | `tests/unit/test_execute_agent_proposal.py::test_run_holds_layer`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 80
    },
    {
      "id": "AU-CONTROL-R040.4",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Refusal.** The harness must refuse to apply a verdict whose base snapshot changed. It must return a typed `base_moved` refusal. A missing, unknown or refused verdict must keep the proposal held with no filesystem effect. The adapter must never map `abstained` to `rejected`. | `tests/unit/runtime/test_workspace_proposal.py::test_base_moved_refused`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 81
    },
    {
      "id": "AU-CONTROL-R040.5",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Evidence.** The harness must append a `RunEvent` (`runtime/run_vcs/kernel.py:76`) to the run's `RunEventLog` when it holds, applies or drops a layer. The event carries the original outcome, `verdict_ref`, adapter action and changed-set digest. An unavailable response records its reason without inventing a verdict. The engine stores the durable record. | `tests/unit/runtime/test_workspace_proposal.py::test_apply_events_emitted`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 82
    },
    {
      "id": "AU-CONTROL-R040.6",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Hot-path proof.** The entry point is the served `execute_agent` operation. A run that edits a file must leave the base tree unchanged. A received `admitted` outcome must then apply it. A `rejected` outcome must discard only the local layer. An `abstained` outcome, unavailable response or typed refusal must preserve the held layer and the base tree. | `tests/integration/test_execute_agent_proposal_served.py::test_no_change_before_verdict`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 83
    },
    {
      "id": "AU-CONTROL-R041",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "The harness runs agent runtimes isolated and enforces the quota it receives",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**The harness runs agent runtimes isolated and enforces the quota it receives.** The harness provides sandbox isolation, quota enforcement and graceful termination. The engine supplies the quota values (EG-DECISION-ENGINE). | See children `AU-CONTROL-R041.1` to `AU-CONTROL-R041.6`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 84
    },
    {
      "id": "AU-CONTROL-R041.1",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Model.** `RuntimeQuota` in `agent_utilities/rlm/sandboxes/base.py` (new, next to `SandboxCapabilities` at `:44`) holds wall time, memory bytes, process count and grace seconds. The harness receives it from EG-DECISION-ENGINE. The fallback default grace is 10 seconds. `StopReason` is closed: `completed`, `signal`, `quota_exceeded` and `grace_expired`. | `tests/unit/rlm/test_runtime_quota.py::test_stop_reasons_closed`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 85
    },
    {
      "id": "AU-CONTROL-R041.2",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Behavior.** On `SIGTERM` the runtime must stop accepting calls and let the current call finish. After the received grace period it must kill the process group. The runtime must stop a run that exceeds a received limit. | `tests/unit/rlm/test_runtime_quota.py::test_term_then_kill_after_grace`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 86
    },
    {
      "id": "AU-CONTROL-R041.3",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Wiring.** The container backend (`rlm/sandboxes/container_fork_backend.py:54`) already ends its PID 1 by timeout. Cgroup readers exist at `core/cgroup_resources.py:52`. No quota record reaches either today. This row passes the received `RuntimeQuota` from `_fork_fanout` (`mcp/tools/engine_surface_tools.py:1694`) into the backend start call. | `tests/unit/test_fork_fanout_quota.py::test_quota_reaches_backend`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 87
    },
    {
      "id": "AU-CONTROL-R041.4",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Refusal.** A quota above the host's cgroup limit must return a typed `quota_unavailable` refusal before launch. The runtime must not start unlimited. | `tests/unit/rlm/test_runtime_quota.py::test_over_host_limit_refused`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 88
    },
    {
      "id": "AU-CONTROL-R041.5",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Evidence.** Each run must emit the applied quota, the stop reason and the time from signal to exit as trace events. Unavailable usage stays `unavailable` and never becomes zero. | `tests/unit/rlm/test_runtime_quota.py::test_stop_evidence_recorded`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 89
    },
    {
      "id": "AU-CONTROL-R041.6",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Hot-path proof.** The entry point is the served fork fan-out operation. A fake runtime ignores `SIGTERM`. The test observes a kill after the grace period, the stop reason `grace_expired` and the trace fields. | `tests/integration/test_fork_fanout_served.py::test_signal_ignored_is_killed`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 90
    },
    {
      "id": "AU-CONTROL-R042",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "The harness loads only the tools it is given during a run",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**The harness loads only the tools it is given during a run.** The tool registry and on-demand disclosure belong to graph-os (GRAPHOS-FLEET). Tool choice belongs to the engine (EG-DECISION-ENGINE). The harness loads the given tools and refuses a call to any other tool. | See children `AU-CONTROL-R042.1` to `AU-CONTROL-R042.6`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 91
    },
    {
      "id": "AU-CONTROL-R042.1",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Model.** `DisclosureSet` in `agent_utilities/capabilities/fleet_tool_search.py` (new type) holds the run id and the tool ids the harness was given. It receives each tool id with its schema from GRAPHOS-FLEET. The harness adds no id itself. | `tests/unit/capabilities/test_disclosure_set.py::test_only_received_ids_added`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 92
    },
    {
      "id": "AU-CONTROL-R042.2",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Behavior.** The harness must load each given tool's schema into the run. It must hold the set for the run's lifetime. It ranks and selects nothing. | `tests/unit/capabilities/test_disclosure_set.py::test_loads_given_tools`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 93
    },
    {
      "id": "AU-CONTROL-R042.3",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Wiring.** `fleet_tool_search_capability` (`capabilities/fleet_tool_search.py:198`) has no production caller today. `_apply_defer_tool_loading` (`agent/factory.py:529`) is called at `agent/factory.py:973` for local toolsets only. This row feeds the given tools into the set at `factory.py:973` for every agent built with deferred loading. | `tests/unit/test_agent_factory_disclosure.py::test_given_tools_loaded`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 94
    },
    {
      "id": "AU-CONTROL-R042.4",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Refusal.** A call to a tool id outside the `DisclosureSet` must return a typed `tool_not_disclosed` refusal. The call must not reach the tool. | `tests/unit/capabilities/test_disclosure_set.py::test_undisclosed_call_refused`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 95
    },
    {
      "id": "AU-CONTROL-R042.5",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Evidence.** The harness must emit the number of tools loaded and the number of refused calls as trace events. The engine receives them for its own records. | `tests/unit/capabilities/test_disclosure_set.py::test_disclosure_counts_traced`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 96
    },
    {
      "id": "AU-CONTROL-R042.6",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Hot-path proof.** The entry point is the served `execute_agent` operation. A fake graph-os gives the run one tool. The test observes a successful call to that tool and a refusal for an undisclosed tool. | `tests/integration/test_execute_agent_disclosure_served.py::test_undisclosed_tool_refused`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 97
    },
    {
      "id": "AU-CONTROL-R043",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "The harness runs the given fan-out in parallel and returns results",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**The harness runs the given fan-out in parallel and returns results.** Decomposition and routing are engine decisions (EG-DECISION-ENGINE). The harness runs the given subtasks in parallel and returns the results for aggregation. [arXiv:2605.15132] | See children `AU-CONTROL-R043.1` to `AU-CONTROL-R043.6`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 98
    },
    {
      "id": "AU-CONTROL-R043.1",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Model.** `SubtaskSet` in `agent_utilities/graph/coordination.py` (new type) holds subtasks with an id, a role and an input digest. The harness receives it from EG-DECISION-ENGINE with the `independence` flag already set. The harness decomposes and routes nothing. | `tests/unit/graph/test_subtask_set.py::test_received_set_holds_flag`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 99
    },
    {
      "id": "AU-CONTROL-R043.2",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Behavior.** The runner must start each received subtask on its own sandbox. It must pass no message between them. It must return all results in one `FanoutResult` for aggregation. The fallback width cap is received from the engine. | `tests/unit/graph/test_subtask_set.py::test_no_cross_agent_messages`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 100
    },
    {
      "id": "AU-CONTROL-R043.3",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Wiring.** `AggregationOperator` (`graph/coordination.py:51`) exists at `graph/coordination.py:255` and `graph/hierarchical_coordination.py:65`. No served path hands it parallel results today. This row attaches the runner in `_fork_fanout` (`mcp/tools/engine_surface_tools.py:1694`), after the width AU-CONTROL-R007 receives. | `tests/unit/test_fork_fanout_aggregate.py::test_results_returned`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 101
    },
    {
      "id": "AU-CONTROL-R043.4",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Refusal.** A subtask set without the `independence` flag must return a typed `not_independent` refusal. A failed subtask must appear as a named gap in the result. It must not be dropped. | `tests/unit/graph/test_subtask_set.py::test_unflagged_set_refused`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 102
    },
    {
      "id": "AU-CONTROL-R043.5",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Evidence.** The harness must emit each subtask id, its sandbox and its wall time as trace events. The result must list which subtask produced each part. | `tests/unit/graph/test_subtask_set.py::test_result_provenance`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 103
    },
    {
      "id": "AU-CONTROL-R043.6",
      "kind": "requirement",
      "parent": "AU-CONTROL",
      "source": "specs/agent-control-plane/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-CONTROL \u2014 Agent control plane",
      "definition": "**Hot-path proof.** The entry point is the served fork fan-out operation. Three subtasks run on fake rungs. The test observes parallel start, no inter-agent message, one returned result set and a refusal for an unflagged set. | `tests/integration/test_fork_fanout_served.py::test_parallel_subtasks_returned`.",
      "definition_source": "specs/agent-control-plane/requirements.md",
      "definition_line": 104
    },
    {
      "id": "AU-SEC",
      "kind": "spec",
      "parent": null,
      "source": "specs/agent-security-policy/status.json",
      "title": "AU-SEC \u2014 Agent security and governed policy",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/agent-security-policy/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/agent-security-policy/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/agent/factory.py:1054",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/agent/factory.py#L1054"
        },
        {
          "declared_in": "specs/agent-security-policy/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/capabilities/kg_audit_sink.py:113",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/capabilities/kg_audit_sink.py#L113"
        },
        {
          "declared_in": "specs/agent-security-policy/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/security/request_identity.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/security/request_identity.py"
        },
        {
          "declared_in": "specs/agent-security-policy/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/security/tool_guard.py:383",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/security/tool_guard.py#L383"
        },
        {
          "declared_in": "specs/agent-security-policy/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-security-policy/requirements.md"
        },
        {
          "declared_in": "specs/agent-security-policy/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-security-policy/status.json"
        }
      ],
      "relations": [],
      "plan_diagrams": [
        "flowchart LR\n  P[Principal] --> G[graph-os verified public boundary]\n  G --> A[AU actor and session projection]\n  A --> T[AU tool policy and decision]\n  T --> E[epistemic-graph final authorization]\n  E --> L[Durable lease and audit]\n  S[SDK connector sync] --> E\n  E --> I[Invalidation event]\n  I --> C[AU cache]\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "AU-SEC-R001",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Tiny profile grants scoped authority, not blanket admin",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "19109362ddd4",
        "2acbf25f8bb2",
        "51b4b7155fdc",
        "c7483960ebb0"
      ],
      "verified_by": [
        "tests/integration/profiles/test_tiny_profile_admin_scope.py:64"
      ],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Tiny profile grants scoped authority, not blanket admin.** The tiny profile issues bounded, scope-checked authority to a local process rather than an unconditional kg:admin grant. Access is restricted to a packaged, process-private, short-lived local channel with no external endpoint or identity, and expired grants are denied on renewal attempts. | Positive and negative profile tests confirm a tiny local process receives only its granted scope and that an admin-level operation outside that scope is denied.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-SEC-R002",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Control view failure never falls back to the content graph",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2acbf25f8bb2",
        "51b4b7155fdc",
        "c7483960ebb0",
        "caeeff7c3ef9"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/test_control_backend_binding.py:90"
      ],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Control view failure never falls back to the content graph.** When agent-utilities cannot open the __control__ view, knowledge_graph/core/engine.py raises a typed ControlGraphUnavailable error instead of silently continuing against the content graph. No operation can target the content graph as a substitute for an unavailable control view. | An injected control-view failure test confirms a ControlGraphUnavailable error is raised and no content-graph fallback write occurs.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-SEC-R003",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Caches subscribe to invalidation with volatility-bounded TTL",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2acbf25f8bb2",
        "45f3c3459198",
        "51b4b7155fdc",
        "c7483960ebb0"
      ],
      "verified_by": [
        "tests/unit/caching/test_freshness.py:113",
        "tests/unit/caching/test_freshness.py:128"
      ],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Caches subscribe to invalidation with volatility-bounded TTL.** agent-utilities caches subscribe to authoritative invalidation events and bound their time-to-live by a declared volatility class. A learned change-rate signal may only shorten that TTL, never lengthen it. | Event, loss, and clock-based tests confirm invalidation is observed and that a learned rate never increases TTL beyond its declared bound.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-SEC-R004",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "AU treats schema drift as a fail-closed typed result",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2acbf25f8bb2",
        "51b4b7155fdc",
        "9cc9e08c1a0e",
        "c7483960ebb0"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/schema_drift/test_gate.py:107"
      ],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**AU treats schema drift as a fail-closed typed result.** agent-utilities treats a schema-drift classification from the connector SDK as a typed, fail-closed result at the SDK boundary: an incompatible or breaking report quarantines the affected work without advancing its SourceCheckpoint, following the declared schema evolution policy. agent-utilities never treats its own SHACL shapes as schema authority. | Connector contract tests feed a breaking SchemaDriftReport through the boundary and confirm the SourceCheckpoint does not advance.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-SEC-R005",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "AU proposes schema-repair mappings; EG alone activates them",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "2acbf25f8bb2",
        "9cc9e08c1a0e",
        "c7483960ebb0",
        "c7fc09d3d2f6"
      ],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**AU proposes schema-repair mappings; EG alone activates them.** agent-utilities' governed decision path proposes a repair mapping for quarantined schema drift. It does not construct a candidate GraphSchema or pack, validate instances, run a shadow ingest, or activate a repair. Those steps belong exclusively to epistemic-graph after explicit approval. | A policy test confirms a proposed mapping reaches epistemic-graph for candidate construction. It also confirms that no AU code path performs direct activation.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-SEC-R006",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Elevation can be requested, approved, and revoked",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "2acbf25f8bb2",
        "c7483960ebb0",
        "d1b9fc6dc5e5"
      ],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Elevation can be requested, approved, and revoked.** agent-utilities exposes typed, tenant-scoped operations to request, approve, and revoke a temporary capability elevation. They are reachable from UI, A2A, and chat surfaces hosted by graph-os. The requesting agent and any learned policy cannot approve their own elevation; expiry and revocation are enforced at the authorization chokepoint before every protected action. | End to end policy tests cover request, approval by a distinct actor, revocation, and expiry. Each produces an auditable decision record.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-SEC-R007",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Guardrail tightening is automatic; loosening needs approval",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "0b70fad31246",
        "2acbf25f8bb2",
        "c7483960ebb0"
      ],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Guardrail tightening is automatic; loosening needs approval.** agent-utilities evolves guardrail profiles through its governed decision path: a change that tightens the profile within declared bounds may apply automatically, while any loosening requires a live human approval. A request with missing bounds or stale evidence is rejected. | Decision and replay tests confirm automatic tightening within bounds, blocked loosening without approval, and rejection of stale or unbounded proposals.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-SEC-R008",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "AU allowlist is generated from the canonical scope registry",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2acbf25f8bb2",
        "c7483960ebb0",
        "eba6b8e9a661",
        "f63aeb608cc2"
      ],
      "verified_by": [
        "tests/unit/security/test_scope_registry.py:62",
        "tests/unit/security/test_scope_registry.py:83"
      ],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**AU allowlist is generated from the canonical scope registry.** agent-utilities consumes the canonical, classified scope registry covering user, domain, service-only, approver, and admin classes. It generates its request-identity allowlist directly from it. Documented scopes such as admin:cluster-read, fleet:events, and finance scopes match the registry exactly. An unknown or service-only scope cannot be smuggled through a human-issued token. | A generator-diff test confirms the AU allowlist matches the registry output. It also confirms that scope parity holds between public surfaces and the engine.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-SEC-R009",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Learned scores never grant security authority",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2acbf25f8bb2",
        "4a5540dd2e3d",
        "8a7a9e0e3fbe"
      ],
      "verified_by": [
        "tests/unit/security/test_authority_audit.py:25"
      ],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Learned scores never grant security authority.** No learned probability, similarity score, or other model-derived confidence value can itself grant or extend authorization in agent-utilities or epistemic-graph. Every authorization decision traces to an explicit policy or approval record. | A static review of authorization code paths confirms no learned-score input participates in a grant decision.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-SEC-R010",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "The shared tenant hierarchy reads as the service identity",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3fb99d2ff295",
        "e2b2152f1396",
        "f63aeb608cc2"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/core/test_tenant_registry_control_graph.py:187"
      ],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**The shared tenant hierarchy reads as the service identity.** The process-wide tenant hierarchy snapshot reads `__control__` under the process service session. A request caller never decides it. Callers keep their own tenant scoping in `accessible_graphs`. | `tests/unit/knowledge_graph/core/test_tenant_registry_control_graph.py` proves a `kg:read` user without a `__control__` grant still resolves the chain, and the read runs as the service identity.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-SEC-R011",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Task and tool text is screened before it enters a prompt",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Task and tool text is screened before it enters a prompt.** User input and tool output are validated against typed schemas and screened for injection patterns before they enter a prompt. Sensitive tools stay behind approval. A failed screen refuses the call with a typed reason. | See children `AU-SEC-R011.1` to `AU-SEC-R011.6`.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-SEC-R011.1",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Model.** `ScreenVerdict` in `agent_utilities/orchestration/task_guard.py` carries a source of `user_input` or `tool_output`, a closed reason of `injection_pattern`, `schema_invalid` or `none`, and the matched rule identifier. | `tests/unit/orchestration/test_task_guard.py::test_screen_verdict_fields`.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-SEC-R011.2",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Behavior.** The screen must validate structured text against its typed schema first, then scan free text with the injection scanner. Each rule set is a named, replaceable default. Redaction of personal data must run after a pass only. | `tests/unit/orchestration/test_task_guard.py::test_schema_then_scan_order`.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-SEC-R011.3",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Wiring.** User input is screened by `screen_and_redact_agent_task` (`agent_utilities/orchestration/task_guard.py:32`), called from `_prepare_agent_task` at `agent_utilities/api/agent_control_plane.py:355`. This row creates the call site that screens tool output in `agent_utilities/capabilities/composition.py:147`, beside the existing input guardrail. | `tests/unit/capabilities/test_tool_output_screen.py::test_tool_output_screened`.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 18
    },
    {
      "id": "AU-SEC-R011.4",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Refusal.** A failed screen must raise `TaskInjectionRejected` with the closed reason and must not call the model or the tool. A sensitive tool must refuse without a recorded approval, with reason `approval_required`. | `tests/unit/orchestration/test_task_guard.py::test_failed_screen_refuses_typed`.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 19
    },
    {
      "id": "AU-SEC-R011.5",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Evidence.** Each screen must write the source, the verdict, the rule identifier and the tool name to the run trace. The trace must not store the rejected text. | `tests/unit/orchestration/test_task_guard.py::test_screen_trace_has_no_text`.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 20
    },
    {
      "id": "AU-SEC-R011.6",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Hot-path proof.** The entry point is the served `execute_agent` operation. A task with an injection pattern must be refused before capability resolution. A tool result with the same pattern must be refused before the next model step. The trace must show both verdicts. | `tests/integration/test_screen_served.py::test_execute_agent_refuses_injection`.",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 21
    },
    {
      "id": "AU-SEC-R012",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Tool actions after untrusted content pause until the harness receives an approval, and the run records the influence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Tool actions after untrusted content pause until the harness receives an approval, and the run records the influence.** agent-utilities carries the engine's taint mark through the run. It pauses each gated tool action until graph-os returns an approval. It records which content influenced the action. | `See children `AU-SEC-R012.1` to `AU-SEC-R012.6`.`",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 22
    },
    {
      "id": "AU-SEC-R012.1",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Model.** `ContentInfluence` in `agent_utilities/security/tool_guard.py` carries the content identifier, its source and a received taint mark. The taint mark comes from EG-SRC-AUTH. The approval comes from GRAPHOS-A2A. `ActionClass` reuses the producer values exactly: `egress`, `privileged_call` or `delegation`. No local alias is accepted. | `tests/unit/security/test_tainted_action_gate.py::test_influence_model_fields`",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 23
    },
    {
      "id": "AU-SEC-R012.2",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Behavior.** The run must carry each received taint mark forward. A run holding a tainted mark must pause an action of a received class until it receives an approval. The class list is received; fallback default is all three. | `tests/unit/security/test_tainted_action_gate.py::test_tainted_run_pauses_for_approval`",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 24
    },
    {
      "id": "AU-SEC-R012.3",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Wiring.** The pause at `_requires_approval` (`agent_utilities/security/tool_guard.py:383`) must read the carried taint. Its production caller is `apply_tool_guard_approvals` at `agent_utilities/agent/factory.py:1054`. No taint input reaches that pause today. | `tests/unit/security/test_tainted_action_gate.py::test_requires_approval_reads_taint`",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 25
    },
    {
      "id": "AU-SEC-R012.4",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Refusal.** A gated action without a received approval must raise `ApprovalRequired` with the closed reason `untrusted_influence`. A missing taint mark must count as tainted, never as clean. An unknown action class, including `privileged`, must return typed `invalid_action_class` before any tool effect. | `tests/unit/security/test_tainted_action_gate.py::test_missing_taint_fails_closed`",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 26
    },
    {
      "id": "AU-SEC-R012.5",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Evidence.** Each gated action must write the action class, the identifiers of the influencing content and the approval outcome to the tool-call record (`capabilities/kg_audit_sink.py:113`). The record must not store content text. | `tests/unit/security/test_tainted_action_gate.py::test_influence_in_tool_call_record`",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 27
    },
    {
      "id": "AU-SEC-R012.6",
      "kind": "requirement",
      "parent": "AU-SEC",
      "source": "specs/agent-security-policy/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEC \u2014 Agent security and governed policy",
      "definition": "**Hot-path proof.** The entry point is the served `execute_agent` operation. A run reads tainted tool output, then requests each canonical action class. It must pause until it receives approval. The trace must name the influencing content. Test path: `tests/integration/test_tainted_action_served.py`. | `tests/integration/test_tainted_action_served.py::test_served_tainted_egress_pauses`",
      "definition_source": "specs/agent-security-policy/requirements.md",
      "definition_line": 28
    },
    {
      "id": "AU-BOUNDARY",
      "kind": "spec",
      "parent": null,
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/au-boundary-deconstruction/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "`au-boundary-deconstruction`",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-deconstruction/spec.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/knowledge_graph/backends/epistemic_graph_backend.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/knowledge_graph/backends/epistemic_graph_backend.py"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/knowledge_graph/retrieval/context_compiler.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/knowledge_graph/retrieval/context_compiler.py"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-context-and-finance/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-control-plane/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-security-policy/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-quality/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-developer-environment/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-engine-duplicate-retirement/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-integration-reliability/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-semantic-client/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/harness-evolution/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "architecture/component-registry.yml",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/architecture/component-registry.yml"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "deletion and relocation inventory",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-deconstruction/plan.md#deletion-and-relocation-inventory"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "deliverable matrix",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-deconstruction/cutover-matrix.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-deconstruction/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-deconstruction/status.json"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "`agent-control-plane`",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-control-plane/spec.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "`agent-security-policy`",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-security-policy/spec.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "`au-boundary-quality`",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-quality/spec.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "`au-developer-environment`",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-developer-environment/spec.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "`au-engine-duplicate-retirement`",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-engine-duplicate-retirement/spec.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "`au-integration-reliability`",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-integration-reliability/spec.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "`au-semantic-client`",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-semantic-client/spec.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/plan.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "`harness-evolution`",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/harness-evolution/spec.md"
        },
        {
          "declared_in": "specs/au-boundary-deconstruction/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "`agent-context-and-finance`",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-context-and-finance/spec.md"
        }
      ],
      "plan_diagrams": [
        "flowchart LR\n  Client[\"Browser, CLI, agent package\"] --> Host[graph-os served host]\n  Host --> API[agent_utilities.api]\n  API --> App[AU agent application]\n  App --> EGC[Generated EG client]\n  Host --> EGC\n  Host --> SDK[Connector SDK runner]\n  SDK --> EGC\n  EGC --> EG[EG durable authority]\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "AU-BOUNDARY-R001",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire AU's duplicated gateway module",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "aa5eba73e0f7"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire AU's duplicated gateway module.** Agent Utilities deletes `agent_utilities/gateway/` once graph-os serves equivalent routes and widgets, including the AU-only behavior in `api.py`, `artifacts_api.py`, `registry_api.py`, `registry.py`, `schemas/graph_analyze.py`, `widgets/genius_agent.py`, and `widgets/_optional_client.py`. AU reconciles its drifted `schemas/graph_core` and `ontology_api` files with their graph-os counterparts and removes the `graph-os-daemon` script and the `gateway-widgets` extra. | Route-parity and artifact-tenancy integration tests on graph-os, plus an import census, confirm no AU gateway import remains before the AU gateway tests are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-BOUNDARY-R001.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Record what actually landed for the gateway retirement",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "65d9961401fd"
      ],
      "verified_by": [
        "tests/gates/test_boundary_landed_records.py:51"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Record what actually landed for the gateway retirement.** PR #23 (merge commit `aa5eba73e0f7`) shipped only the boundary ownership and coverage gate scripts (`scripts/check_boundary_owners.py`, `scripts/check_boundary_coverage.py`, `scripts/boundary_inventory.py`) and moved `AU-BOUNDARY-R001` to LANDED in `status.json`. It deleted none of `agent_utilities/gateway/{api.py,artifacts_api.py,registry_api.py,registry.py,schemas/graph_analyze.py,widgets/genius_agent.py,widgets/_optional_client.py}`, all seven of which are still present at `origin/main`. | `git show --stat aa5eba73e0f7` lists only gate scripts and config, and `git ls-tree -r origin/main -- agent_utilities/gateway` shows all seven files still present.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-BOUNDARY-R001.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/gateway/api.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0eb67c99cf0a"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r001_r010_deletion_census.py:54"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/gateway/api.py`.** Agent Utilities removes the file and repoints or deletes its importers. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_gateway_api_deleted` passes once the file and its production imports are gone.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-BOUNDARY-R001.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/gateway/artifacts_api.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "902f906cac97"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r001_3_deleted.py:28",
        "tests/gates/test_boundary_r001_3_deleted.py:35"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/gateway/artifacts_api.py`.** Agent Utilities removes the file and repoints or deletes its importers. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_gateway_artifacts_api_deleted` passes once the file and its production imports are gone.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-BOUNDARY-R001.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/gateway/registry_api.py` (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/gateway/registry_api.py` (rollup).** Agent Utilities removes the file and repoints or deletes its importers. Split because `agent_utilities/mcp/kg_server.py` drains the fleet catalog through six private `registry_api` functions for `GET /api/tools` and AU has no replacement for that read, so the deletion needs its own repoint step. Satisfied when `AU-BOUNDARY-R001.4.1` through `AU-BOUNDARY-R001.4.3` are VERIFIED. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_gateway_registry_api_deleted` passes once the children land.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-BOUNDARY-R001.4.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Stop mounting `registry_api` routes from `agent_utilities/gateway/graph_api.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8bc78cbdfda1"
      ],
      "verified_by": [
        "tests/unit/gateway/test_remote_oauth_api.py:194"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Stop mounting `registry_api` routes from `agent_utilities/gateway/graph_api.py`.** Agent Utilities removes the `register_registry_routes` mount (and the matching monkeypatch in `tests/unit/gateway/test_remote_oauth_api.py`), since graph-os serves `/api/registry/*`. | `git grep -n 'registry_api' agent_utilities/gateway/graph_api.py tests/unit/gateway/test_remote_oauth_api.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-BOUNDARY-R001.4.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "ROLLUP: repoint the `GET /api/tools` catalog read in `agent_utilities/mcp/kg_server.py` off `registry_api`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**ROLLUP: repoint the `GET /api/tools` catalog read in `agent_utilities/mcp/kg_server.py` off `registry_api`.** Rejected as not bite-sized: `_read_catalog_kind_sync` has no AU replacement and drains the `servers` kind through six private `registry_api` functions (`_KIND_SPECS`, `_MAX_LIMIT`, `_authorized_page`, `_get_catalog_engine`, `_require_catalog_authority`, `_row_key`) that carry the tenant/principal scoping, redaction and SQL construction, and `tests/unit/mcp/test_collapse_tool_endpoints.py` patches those privates. Split into a reader decision, a new tenant-scoped reader with refusal tests, the call-site repoint, and the test update. | Satisfied when children `AU-BOUNDARY-R001.4.2.1` through `AU-BOUNDARY-R001.4.2.4` are VERIFIED.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-BOUNDARY-R001.4.2.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Record the owner of the `servers` catalog read for `GET /api/tools`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Record the owner of the `servers` catalog read for `GET /api/tools`.** Name the graph-os registry operation to call, or record that AU reads the engine catalog directly, and state how tenant/principal scoping and redaction are preserved. | The decision is recorded in `specs/au-boundary-deconstruction/design.md` and cites the graph-os owner by ID.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-BOUNDARY-R001.4.2.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Add one typed `servers`-kind catalog reader that does not import `registry_api`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Add one typed `servers`-kind catalog reader that does not import `registry_api`.** One new module under `agent_utilities/mcp/` returning validated rows, fail-closed on missing tenant/principal authority, with refusal tests. Depends on `AU-BOUNDARY-R001.4.2.1`; if the decision is a graph-os registry call, the graph-os endpoint is a graph-os repo change. | New unit tests bound to this ID prove a missing-authority refusal and a paged drain bounded by `_TOOLS_CATALOG_DRAIN_MAX_PAGES`.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-BOUNDARY-R001.4.2.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Call the new reader from `_read_catalog_kind_sync` in `agent_utilities/mcp/kg_server.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Call the new reader from `_read_catalog_kind_sync` in `agent_utilities/mcp/kg_server.py`.** Remove the `..gateway.registry_api` import and the docstring references. | `git grep -n 'registry_api' agent_utilities/mcp/kg_server.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-BOUNDARY-R001.4.2.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Update `tests/unit/mcp/test_collapse_tool_endpoints.py` to patch the new reader instead of `registry_api` privates",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Update `tests/unit/mcp/test_collapse_tool_endpoints.py` to patch the new reader instead of `registry_api` privates.** | `git grep -n 'registry_api' tests/unit/mcp/test_collapse_tool_endpoints.py` finds no match and the file passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-BOUNDARY-R001.4.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete the `registry_api` module and its tests",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete the `registry_api` module and its tests.** Agent Utilities runs `git rm agent_utilities/gateway/registry_api.py`, deletes `tests/unit/gateway/test_registry_api.py` and `tests/unit/gateway/test_registry_catalog_count_scope.py`, and drops the module from `docs/concepts.yaml` and `scripts/check_openapi_coverage.py`. This also removes its `agent_utilities/mcp/multiplexer.py` import (`AU-BOUNDARY-R004.7`). | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_gateway_registry_api_deleted` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-BOUNDARY-R001.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/gateway/registry.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/gateway/registry.py`.** Agent Utilities removes the file and repoints or deletes its importers. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_gateway_registry_deleted` passes once the file and its production imports are gone.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-BOUNDARY-R001.6",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/gateway/schemas/graph_analyze.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/gateway/schemas/graph_analyze.py`.** Agent Utilities removes the file and repoints or deletes its importers. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_gateway_schemas_graph_analyze_deleted` passes once the file and its production imports are gone.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 18
    },
    {
      "id": "AU-BOUNDARY-R001.7",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/gateway/widgets/genius_agent.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "7717d2e627ab"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r001_7_deleted.py:22",
        "tests/gates/test_boundary_r001_7_deleted.py:29"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/gateway/widgets/genius_agent.py`.** Agent Utilities removes the file and repoints or deletes its importers. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_gateway_widgets_genius_agent_deleted` passes once the file and its production imports are gone.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 19
    },
    {
      "id": "AU-BOUNDARY-R001.8",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/gateway/widgets/_optional_client.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/gateway/widgets/_optional_client.py`.** Agent Utilities removes the file and repoints or deletes its importers. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_gateway_widgets_optional_client_deleted` passes once the file and its production imports are gone.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 20
    },
    {
      "id": "AU-BOUNDARY-R002",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire AU's deployment and skill-certification tooling",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "db29b2da626e",
        "fca0c5ee42b3"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire AU's deployment and skill-certification tooling.** Agent Utilities deletes `deployment/**` once graph-os owns installation, environment diagnostics, environment-sync, certification, and skill validation and runtime-harness behavior, including `backends.py`, `certification_oidc.py`, `skill_validation*.py`, and the moved `skills/` subpackages. AU removes the console scripts that collide with graph-os entry points or target the moved modules, leaving graph-os as the sole owner of the packaging entry points for this behavior. | Dry-run install and certification tests against the graph-os entry points confirm no AU console script still targets a moved module.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 21
    },
    {
      "id": "AU-BOUNDARY-R002.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Record what actually landed for the deployment/skill-certification retirement",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "db29b2da626e"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Record what actually landed for the deployment/skill-certification retirement.** PR #26 (merge commit `fca0c5ee42b3`) edited `agent_utilities/deployment/{config_generator.py,doctor.py,genesis_environments.py,repo_templates.py}` and moved skill content, and moved `AU-BOUNDARY-R002` to LANDED in `status.json`. It deleted neither `agent_utilities/deployment/backends.py` nor `agent_utilities/deployment/certification_oidc.py`, both of which are still present at `origin/main`. | `git show --stat fca0c5ee42b3` shows no removal of `backends.py`/`certification_oidc.py`, and `git ls-tree -r origin/main -- agent_utilities/deployment` shows both files still present.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 22
    },
    {
      "id": "AU-BOUNDARY-R002.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/deployment/backends.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "db29b2da626e"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r002_2_backends_deleted.py:34"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/deployment/backends.py`.** Agent Utilities removes the file and repoints or deletes its importers. | `tests/gates/test_boundary_r002_2_backends_deleted.py::test_deployment_backends_deleted` passes once the file and its production imports are gone.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 23
    },
    {
      "id": "AU-BOUNDARY-R002.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "ROLLUP: delete `agent_utilities/deployment/certification_oidc.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**ROLLUP: delete `agent_utilities/deployment/certification_oidc.py`.** Rejected as not bite-sized: the module is the live ephemeral HTTPS loopback OIDC authority (`EphemeralLoopbackOidcAuthority`, `AUTHORITY_MODE`, `validated_token_ttl_seconds`) that `deployment/skill_validation.py` and `deployment/skill_validation_assets.py` call at runtime, with no replacement in AU; it is also a `main()` entry for `scripts/certification/loopback_oidc.py` and is named in three release/egress gate path lists. Split into a replacement decision, importer repoints, script/gate-list cleanup, and a final deletion. | Satisfied when children `AU-BOUNDARY-R002.3.1` through `AU-BOUNDARY-R002.3.5` are VERIFIED.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 24
    },
    {
      "id": "AU-BOUNDARY-R002.3.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Record the graph-os owner of the ephemeral loopback OIDC certification authority",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Record the graph-os owner of the ephemeral loopback OIDC certification authority.** Name the graph-os module or operation that replaces `EphemeralLoopbackOidcAuthority`, `AUTHORITY_MODE`, `DEFAULT_TOKEN_TTL_SECONDS` and `validated_token_ttl_seconds`, or record a reviewed deletion reason for the skill-certification flow that consumes them. **Finding: graph-os `main` has no replacement (no `loopback`/`certification_oidc` match in `graph_os`); cross-repo, blocked on a graph-os owner or a reviewed deletion decision. See design.md.** | The replacement (or deletion reason) is recorded in `specs/au-boundary-deconstruction/design.md` and cites the graph-os owner by ID.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 25
    },
    {
      "id": "AU-BOUNDARY-R002.3.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint or remove the `certification_oidc` import in `agent_utilities/deployment/skill_validation.py` and `agent_utilities/deployment/skill_validation_assets.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint or remove the `certification_oidc` import in `agent_utilities/deployment/skill_validation.py` and `agent_utilities/deployment/skill_validation_assets.py`.** Both import the authority symbols named in `AU-BOUNDARY-R002.3.1`. | `git grep -n certification_oidc -- agent_utilities/deployment/skill_validation.py agent_utilities/deployment/skill_validation_assets.py` prints nothing and `tests/gates/test_skill_validation_deployment.py` and `tests/gates/test_skill_certification_assets.py` pass.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 26
    },
    {
      "id": "AU-BOUNDARY-R002.3.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `scripts/certification/loopback_oidc.py` and `tests/unit/scripts/test_loopback_oidc.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `scripts/certification/loopback_oidc.py` and `tests/unit/scripts/test_loopback_oidc.py`.** The script only wraps `certification_oidc.main`; the test exercises only the module. | Neither file exists and `git grep -n loopback_oidc -- scripts tests` shows no import of them.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 27
    },
    {
      "id": "AU-BOUNDARY-R002.3.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Remove `agent_utilities/deployment/certification_oidc.py` from the path lists in `scripts/check_http_egress_boundary.py` and `scripts/release/check_release_wheel.py`, and its docstring mention in `scripts/security/check_http_egress_boundary_gate.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Remove `agent_utilities/deployment/certification_oidc.py` from the path lists in `scripts/check_http_egress_boundary.py` and `scripts/release/check_release_wheel.py`, and its docstring mention in `scripts/security/check_http_egress_boundary_gate.py`.** | `git grep -n certification_oidc -- scripts` prints nothing and the egress-boundary and release-wheel checks pass.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 28
    },
    {
      "id": "AU-BOUNDARY-R002.3.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/deployment/certification_oidc.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/deployment/certification_oidc.py`.** Also remove it from the three lists in `tests/gates/test_exact_local_release_contract.py`. | `tests/gates/test_boundary_r002_3_certification_oidc_deleted.py::test_deployment_certification_oidc_deleted` passes once the file and its production imports are gone.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 29
    },
    {
      "id": "AU-BOUNDARY-R003",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire AU's legacy MCP host and action manifest",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "2456745c1e4d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire AU's legacy MCP host and action manifest.** Agent Utilities deletes `mcp/kg_server.py`, `mcp/tools/**`, and `mcp/_graphos_action_manifest.py` once every behavior they implement is mapped to an approved graph-os operation or has a recorded, reviewed deletion reason. AU also removes the `_ingest_capabilities` function from `sdd/watcher.py`, deletes or relocates the tests that import these modules, and removes the AU `graph-os` console script. | An action-to-operation parity audit against the approved operation registry, with authorization checks exercised on the real graph-os entry points, shows no unmapped behavior is lost.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 30
    },
    {
      "id": "AU-BOUNDARY-R003.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Record what actually landed for the legacy MCP host retirement",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "65d9961401fd"
      ],
      "verified_by": [
        "tests/gates/test_boundary_landed_records.py:57"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Record what actually landed for the legacy MCP host retirement.** Commit `2456745c1e4d` (\"feat(gates): boundary ownership and coverage checks\") shipped only `scripts/check_boundary_owners.py`, `scripts/check_boundary_coverage.py`, and `scripts/boundary_inventory.py`, and moved `AU-BOUNDARY-R003` to LANDED in `status.json`. It deleted neither `agent_utilities/mcp/kg_server.py` nor `agent_utilities/mcp/_graphos_action_manifest.py`, and left `_ingest_capabilities` in `agent_utilities/sdd/watcher.py`. | `git show --stat 2456745c1e4d` shows only the three gate scripts, and `git ls-tree -r origin/main -- agent_utilities/mcp/kg_server.py agent_utilities/mcp/_graphos_action_manifest.py` lists both files. `git grep -n _ingest_capabilities origin/main -- agent_utilities/sdd/watcher.py` finds the function.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 31
    },
    {
      "id": "AU-BOUNDARY-R003.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Decide the per-behavior graph-os operation mapping for `kg_server.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Decide the per-behavior graph-os operation mapping for `kg_server.py`.** Agent Utilities records, for every behavior `kg_server.py` implements, which approved graph-os operation it maps to, or a reviewed deletion reason if none is needed. | The mapping is recorded in this spec as an added table from `kg_server.py` behavior to graph-os operation (or deletion reason).",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 33
    },
    {
      "id": "AU-BOUNDARY-R003.6",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/mcp/tools/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/mcp/tools/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/mcp/tools/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 34
    },
    {
      "id": "AU-BOUNDARY-R003.7",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/mcp/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/mcp/** (excluding tools/)` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/mcp/** (excluding tools/)` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 35
    },
    {
      "id": "AU-BOUNDARY-R003.8",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/gateway/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/gateway/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/gateway/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 36
    },
    {
      "id": "AU-BOUNDARY-R003.9",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/knowledge_graph/core/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/knowledge_graph/core/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/knowledge_graph/core/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 37
    },
    {
      "id": "AU-BOUNDARY-R003.10",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/gateway/schemas/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/gateway/schemas/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/gateway/schemas/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 38
    },
    {
      "id": "AU-BOUNDARY-R003.11",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/deployment/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/deployment/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/deployment/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 39
    },
    {
      "id": "AU-BOUNDARY-R003.12",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/security/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/security/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/security/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 40
    },
    {
      "id": "AU-BOUNDARY-R003.13",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/orchestration/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/orchestration/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/orchestration/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 41
    },
    {
      "id": "AU-BOUNDARY-R003.14",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/knowledge_graph/ingestion/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/knowledge_graph/ingestion/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/knowledge_graph/ingestion/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 42
    },
    {
      "id": "AU-BOUNDARY-R003.15",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/knowledge_graph/retrieval/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/knowledge_graph/retrieval/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/knowledge_graph/retrieval/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 43
    },
    {
      "id": "AU-BOUNDARY-R003.16",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/knowledge_graph/backends/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/knowledge_graph/backends/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/knowledge_graph/backends/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 44
    },
    {
      "id": "AU-BOUNDARY-R003.17",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/core/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/core/** (excluding registry/)` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/core/** (excluding registry/)` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 45
    },
    {
      "id": "AU-BOUNDARY-R003.18",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/cli/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/cli/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/cli/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 46
    },
    {
      "id": "AU-BOUNDARY-R003.19",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/server/routers/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/server/routers/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/server/routers/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 47
    },
    {
      "id": "AU-BOUNDARY-R003.20",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/sdd/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/sdd/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/sdd/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 48
    },
    {
      "id": "AU-BOUNDARY-R003.21",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/observability/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/observability/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/observability/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 49
    },
    {
      "id": "AU-BOUNDARY-R003.22",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/messaging/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/messaging/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/messaging/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 50
    },
    {
      "id": "AU-BOUNDARY-R003.23",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/media/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/media/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/media/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 51
    },
    {
      "id": "AU-BOUNDARY-R003.24",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/knowledge_graph/live_artifacts/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/knowledge_graph/live_artifacts/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/knowledge_graph/live_artifacts/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 52
    },
    {
      "id": "AU-BOUNDARY-R003.25",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/harness/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/harness/** (including memorydata/)` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/harness/** (including memorydata/)` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 53
    },
    {
      "id": "AU-BOUNDARY-R003.26",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/ecosystem/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/ecosystem/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/ecosystem/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 54
    },
    {
      "id": "AU-BOUNDARY-R003.27",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/core/registry/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/core/registry/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/core/registry/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 55
    },
    {
      "id": "AU-BOUNDARY-R003.28",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `agent_utilities/claude_harness/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `agent_utilities/claude_harness/**` importers off `agent_utilities/mcp/kg_server.py`.** Agent Utilities calls the graph-os operations decided in AU-BOUNDARY-R003.5 instead. | `git grep -l kg_server agent_utilities/claude_harness/**` finds no match outside tests.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 56
    },
    {
      "id": "AU-BOUNDARY-R003.29",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/mcp/kg_server.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/mcp/kg_server.py`.** Every behavior is mapped and every importing package is repointed. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_mcp_kg_server_deleted` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 57
    },
    {
      "id": "AU-BOUNDARY-R003.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/mcp/_graphos_action_manifest.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/mcp/_graphos_action_manifest.py`.** Agent Utilities removes the file and repoints or deletes its importers. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_mcp_graphos_action_manifest_deleted` passes once the file and its production imports are gone.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 58
    },
    {
      "id": "AU-BOUNDARY-R003.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Remove `_ingest_capabilities` from `agent_utilities/sdd/watcher.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "908c5080c0b5"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r003_4.py:29",
        "tests/gates/test_boundary_r003_4.py:55"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Remove `_ingest_capabilities` from `agent_utilities/sdd/watcher.py`.** Agent Utilities deletes the function and repoints or deletes its callers. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_sdd_watcher_ingest_capabilities_removed` passes once the function and its callers are gone.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 59
    },
    {
      "id": "AU-BOUNDARY-R004",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire AU's multiplexer family duplicated in graph-os",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "2456745c1e4d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire AU's multiplexer family duplicated in graph-os.** Agent Utilities deletes its multiplexer modules, including `multiplexer.py`, `child_resilience`, `protocol_compat`, `shared_multiplexer`, `co_service_supervisor`, and `catalog_reconciliation`, once graph-os's fleet module provides equivalent behavior. Host-only modules such as `remote_oauth_broker`, `tasks_extension`, `eunomia_principal`, `harness_server`, `middlewares`, and `skill_coverage` move into graph-os, while `toolset_factory`, `tool_specs`, and `agent_manager` remain in AU. | Per-server attribution and failover tests against the graph-os fleet module confirm no duplicate multiplexer state remains in AU.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 60
    },
    {
      "id": "AU-BOUNDARY-R004.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Record what actually landed for the multiplexer-family retirement",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "65d9961401fd"
      ],
      "verified_by": [
        "tests/gates/test_boundary_landed_records.py:70"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Record what actually landed for the multiplexer-family retirement.** Commit `2456745c1e4d` shipped only the boundary ownership and coverage gate scripts and moved `AU-BOUNDARY-R004` to LANDED in `status.json`. It deleted none of the multiplexer family, and `agent_utilities/mcp/multiplexer.py` (plus `agent_utilities/mcp/shared_multiplexer.py`) are still present at `origin/main`. | `git show --stat 2456745c1e4d` shows only gate scripts, and `git ls-tree -r origin/main -- agent_utilities/mcp/multiplexer.py agent_utilities/mcp/shared_multiplexer.py` lists both files.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 61
    },
    {
      "id": "AU-BOUNDARY-R004.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Confirm graph-os's fleet module provides parity for `multiplexer.py`'s routing/dispatch API",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Confirm graph-os's fleet module provides parity for `multiplexer.py`'s routing/dispatch API.** The parent row names graph-os's fleet module as the replacement; Agent Utilities verifies the equivalent behavior exists there before any importer is repointed. | A per-server attribution and failover test against the graph-os fleet module passes for every behavior `multiplexer.py` provides.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 63
    },
    {
      "id": "AU-BOUNDARY-R004.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/mcp/kg_server.py, agent_utilities/mcp/shared_multiplexer.py, and agent_utilities/mcp/tools/intent_tools.py off `agent_utilities/mcp/multiplexer.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/mcp/kg_server.py, agent_utilities/mcp/shared_multiplexer.py, and agent_utilities/mcp/tools/intent_tools.py off `agent_utilities/mcp/multiplexer.py`.** Agent Utilities imports the graph-os fleet module instead, per AU-BOUNDARY-R004.3. | `git grep -n 'mcp.multiplexer\\|mcp\\.multiplexer' agent_utilities/mcp/kg_server.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 64
    },
    {
      "id": "AU-BOUNDARY-R004.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/capabilities/fleet_tool_search.py off `agent_utilities/mcp/multiplexer.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/capabilities/fleet_tool_search.py off `agent_utilities/mcp/multiplexer.py`.** Agent Utilities imports the graph-os fleet module instead, per AU-BOUNDARY-R004.3. | `git grep -n 'mcp.multiplexer\\|mcp\\.multiplexer' agent_utilities/capabilities/fleet_tool_search.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 65
    },
    {
      "id": "AU-BOUNDARY-R004.6",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/deployment/doctor.py off `agent_utilities/mcp/multiplexer.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/deployment/doctor.py off `agent_utilities/mcp/multiplexer.py`.** Agent Utilities imports the graph-os fleet module instead, per AU-BOUNDARY-R004.3. | `git grep -n 'mcp.multiplexer\\|mcp\\.multiplexer' agent_utilities/deployment/doctor.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 66
    },
    {
      "id": "AU-BOUNDARY-R004.7",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/gateway/registry_api.py off `agent_utilities/mcp/multiplexer.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/gateway/registry_api.py off `agent_utilities/mcp/multiplexer.py`.** Agent Utilities imports the graph-os fleet module instead, per AU-BOUNDARY-R004.3. | `git grep -n 'mcp.multiplexer\\|mcp\\.multiplexer' agent_utilities/gateway/registry_api.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 67
    },
    {
      "id": "AU-BOUNDARY-R004.8",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/orchestration/agent_runner.py off `agent_utilities/mcp/multiplexer.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/orchestration/agent_runner.py off `agent_utilities/mcp/multiplexer.py`.** Agent Utilities imports the graph-os fleet module instead, per AU-BOUNDARY-R004.3. | `git grep -n 'mcp.multiplexer\\|mcp\\.multiplexer' agent_utilities/orchestration/agent_runner.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 68
    },
    {
      "id": "AU-BOUNDARY-R004.9",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/tools/dynamic_tool_orchestrator.py off `agent_utilities/mcp/multiplexer.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/tools/dynamic_tool_orchestrator.py off `agent_utilities/mcp/multiplexer.py`.** Agent Utilities imports the graph-os fleet module instead, per AU-BOUNDARY-R004.3. | `git grep -n 'mcp.multiplexer\\|mcp\\.multiplexer' agent_utilities/tools/dynamic_tool_orchestrator.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 69
    },
    {
      "id": "AU-BOUNDARY-R004.10",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/mcp/multiplexer.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/mcp/multiplexer.py`.** Parity is confirmed and every importer is repointed. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_mcp_multiplexer_deleted` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 70
    },
    {
      "id": "AU-BOUNDARY-R005",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Migrate connector packages A-E onto the SDK",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "a754f1299033",
        "f0f5e51f6b47"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Migrate connector packages A-E onto the SDK.** Connector packages in the A-E range stop importing AU's `mcp`, `core.config`, `core.exceptions`, `core.transport_security`, and `base_utilities` modules and import the agent connector SDK instead. Each package replaces its use of `native_ingest` with the epistemic graph client and drops its dependency on `agent-utilities`. | A per-package import census plus a real read and write receipt against the SDK and the graph client prove each connector no longer depends on AU.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 71
    },
    {
      "id": "AU-BOUNDARY-R005.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "A-E connector import census lands, naming its own blind spot",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**A-E connector import census lands, naming its own blind spot.** PR #150 (commit `79dc21bab`) adds a fleet census scanning connector packages in the A-E range for the banned AU imports and moves `AU-BOUNDARY-R005` to LANDED on a zero-unsanctioned-violator finding; `status.json`'s `landed_in` for the row is itself wrong, pointing at the unrelated `AU-HARNESS-R005.1` merge commit `a754f1299033`, not at any A-E connector change. | The census artifact and PR #150 exist at `origin/main`; `git show --stat a754f1299033` shows only `agent_utilities/harness/generative_model_policy.py`, no connector-package change.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 72
    },
    {
      "id": "AU-BOUNDARY-R005.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Fix the A-E census blind spot and finish the migration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Fix the A-E census blind spot and finish the migration.** `census(fleet_root,'a','e')` still flags `ansible-tower-mcp`, `audiobookshelf-mcp`, `ciso-assistant-api`, and `data-science-mcp` importing banned AU modules (`mcp`, `core.config`, `core.exceptions`, `core.transport_security`, `base_utilities`); each of these four connector packages drops the banned imports and its `native_ingest` call in favor of the agent connector SDK and the epistemic graph client. | A per-package import census over `ansible-tower-mcp`, `audiobookshelf-mcp`, `ciso-assistant-api`, and `data-science-mcp` shows zero banned imports, plus a real read and write receipt against the SDK and the graph client for each.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 73
    },
    {
      "id": "AU-BOUNDARY-R006",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Migrate connector packages F-J onto the SDK",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Migrate connector packages F-J onto the SDK.** Connector packages in the F-J range stop importing AU's `mcp`, `core.config`, `core.exceptions`, `core.transport_security`, and `base_utilities` modules and import the agent connector SDK instead. Each package replaces its use of `native_ingest` with the epistemic graph client and drops its dependency on `agent-utilities`. | A per-package import census plus a real read and write receipt against the SDK and the graph client prove each connector no longer depends on AU.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 74
    },
    {
      "id": "AU-BOUNDARY-R006.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Ship AU's F-J connector import-census gate",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "105559f760c3",
        "5a00da215c55",
        "fe5ca4e239ec"
      ],
      "verified_by": [
        "tests/gates/test_connector_sdk_import_census_gate.py:35",
        "tests/gates/test_connector_sdk_import_census_gate.py:55"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Ship AU's F-J connector import-census gate.** Agent Utilities owns and ships the per-package import census instrument that the F-J connector repos' own migration PRs will be checked against, scanning each sibling connector package in the F-J range for the banned `mcp`, `core.config`, `core.exceptions`, `core.transport_security`, and `base_utilities` imports. The per-package migrations themselves (removing the banned imports in each connector repo) are tracked as further `AU-BOUNDARY-R006.n` rows against those repos and are out of scope for this child. | The census gate correctly classifies a known-compliant package and a known-still-importing package in the F-J range.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 75
    },
    {
      "id": "AU-BOUNDARY-R007",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Migrate connector packages K-O onto the SDK",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "a754f1299033",
        "f0f5e51f6b47"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Migrate connector packages K-O onto the SDK.** Connector packages in the K-O range stop importing AU's `mcp`, `core.config`, `core.exceptions`, `core.transport_security`, and `base_utilities` modules and import the agent connector SDK instead. Each package replaces its use of `native_ingest` with the epistemic graph client and drops its dependency on `agent-utilities`. | A per-package import census plus a real read and write receipt against the SDK and the graph client prove each connector no longer depends on AU.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 76
    },
    {
      "id": "AU-BOUNDARY-R007.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "K-O connector import census lands, naming its own blind spot",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**K-O connector import census lands, naming its own blind spot.** PR #150 (commit `79dc21bab`) adds a fleet census scanning connector packages in the K-O range for the banned AU imports and moves `AU-BOUNDARY-R007` to LANDED on a zero-unsanctioned-violator finding; `status.json`'s `landed_in` for the row is itself wrong, pointing at the unrelated `AU-HARNESS-R005.1` merge commit `a754f1299033`, not at any K-O connector change. | The census artifact and PR #150 exist at `origin/main`; `git show --stat a754f1299033` shows only `agent_utilities/harness/generative_model_policy.py`, no connector-package change.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 77
    },
    {
      "id": "AU-BOUNDARY-R007.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Fix the K-O census blind spot and finish the migration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Fix the K-O census blind spot and finish the migration.** `census(fleet_root,'k','o')` still flags `keycloak-agent`, `langfuse-agent`, `leanix-agent`, `microsoft-agent`, and `opensearch-mcp` importing banned AU modules (`mcp`, `core.config`, `core.exceptions`, `core.transport_security`, `base_utilities`); each of these five connector packages drops the banned imports and its `native_ingest` call in favor of the agent connector SDK and the epistemic graph client. | A per-package import census over `keycloak-agent`, `langfuse-agent`, `leanix-agent`, `microsoft-agent`, and `opensearch-mcp` shows zero banned imports, plus a real read and write receipt against the SDK and the graph client for each.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 78
    },
    {
      "id": "AU-BOUNDARY-R008",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Migrate connector packages P-S onto the SDK",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "a754f1299033",
        "f0f5e51f6b47"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Migrate connector packages P-S onto the SDK.** Connector packages in the P-S range, including repository-manager, stop importing AU's `mcp`, `core.config`, `core.exceptions`, `core.transport_security`, and `base_utilities` modules and import the agent connector SDK instead, replacing `native_ingest` with the epistemic graph client and dropping the `agent-utilities` dependency. Repository-manager's own use of merge-queue and concept-reservation governance is covered by a separate requirement and is out of scope here. | A per-package import census plus a real read and write receipt against the SDK and the graph client prove each connector, including repository-manager, no longer depends on AU for transport.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 79
    },
    {
      "id": "AU-BOUNDARY-R008.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "P-S connector import census lands, naming its own blind spot",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**P-S connector import census lands, naming its own blind spot.** PR #150 (commit `79dc21bab`) adds a fleet census scanning connector packages in the P-S range for the banned AU imports and moves `AU-BOUNDARY-R008` to LANDED on a zero-unsanctioned-violator finding; `status.json`'s `landed_in` for the row is itself wrong, pointing at the unrelated `AU-HARNESS-R005.1` merge commit `a754f1299033`, not at any P-S connector change. | The census artifact and PR #150 exist at `origin/main`; `git show --stat a754f1299033` shows only `agent_utilities/harness/generative_model_policy.py`, no connector-package change.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 80
    },
    {
      "id": "AU-BOUNDARY-R008.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Fix the P-S census blind spot and finish the migration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Fix the P-S census blind spot and finish the migration.** `census(fleet_root,'p','s')` still flags `paperless-ngx-mcp`, `pulselink-mcp`, `repository-manager`, `rom-manager`, and `systems-manager` importing banned AU modules (`mcp`, `core.config`, `core.exceptions`, `core.transport_security`, `base_utilities`); each of these five connector packages drops the banned imports and its `native_ingest` call in favor of the agent connector SDK and the epistemic graph client, with repository-manager's merge-queue/concept-reservation governance remaining out of scope per the parent row. | A per-package import census over `paperless-ngx-mcp`, `pulselink-mcp`, `repository-manager`, `rom-manager`, and `systems-manager` shows zero banned imports, plus a real read and write receipt against the SDK and the graph client for each.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 81
    },
    {
      "id": "AU-BOUNDARY-R009",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Migrate connector packages T-Z onto the SDK",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Migrate connector packages T-Z onto the SDK.** Connector packages in the T-Z range stop importing AU's `mcp`, `core.config`, `core.exceptions`, `core.transport_security`, and `base_utilities` modules and import the agent connector SDK instead, replacing `native_ingest` with the epistemic graph client and dropping the `agent-utilities` dependency. The universal-skills `agent-package-builder` templates are retargeted onto the SDK for every connector package, not only this range. | A per-package import census plus a real read and write receipt against the SDK and the graph client confirm no connector package, including those generated from the retargeted templates, still imports AU.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 82
    },
    {
      "id": "AU-BOUNDARY-R009.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Ship AU's T-Z connector import-census gate",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5a00da215c55"
      ],
      "verified_by": [
        "tests/gates/test_connector_sdk_import_census_gate.py:45"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Ship AU's T-Z connector import-census gate.** Agent Utilities owns and ships the per-package import census instrument that the T-Z connector repos' own migration PRs will be checked against, scanning each sibling connector package in the T-Z range for the banned `mcp`, `core.config`, `core.exceptions`, `core.transport_security`, and `base_utilities` imports. The per-package migrations themselves and the `agent-package-builder` template retargeting are tracked as further `AU-BOUNDARY-R009.n` rows and are out of scope for this child. | The census gate correctly classifies a known-compliant package and a known-still-importing package in the T-Z range.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 83
    },
    {
      "id": "AU-BOUNDARY-R010",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete AU's SDK-duplicated connector toolkit",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "2456745c1e4d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete AU's SDK-duplicated connector toolkit.** Agent Utilities deletes its connector toolkit and HTTP/credential helpers, including `mcp/server_factory`, `mcp/action_dispatch`, `mcp/concurrency`, `mcp/verbose_tools`, `mcp/context_helpers`, `mcp/client_credentials`, `mcp/delegated_auth`, `mcp/httpx_boundary`, `mcp/oauth_log_hygiene`, `core/transport_security`, `core/http_client`, `core/_env`, `core/decorators`, `core/credentials`, `core/exceptions`, `base_utilities.py`, `httpsupport/**`, and the duplicated `security/**` modules, once every connector repository has migrated onto the SDK. AU adds a release gate that fails the release if any connector repository still imports `agent_utilities`, with no compatibility alias retained. | A release-time import scan across all connector repositories shows zero imports of the deleted AU toolkit before the gate is enabled.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 84
    },
    {
      "id": "AU-BOUNDARY-R010.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Record what actually landed for the connector-toolkit deletion",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "635f38f64aca"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r010_r048_landed_records.py:12"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Record what actually landed for the connector-toolkit deletion.** `status.json` points `AU-BOUNDARY-R010`'s `landed_in` at commit `2456745c1e4d`, which shipped only the boundary ownership and coverage gate scripts. It deleted none of the listed connector-toolkit modules, and `agent_utilities/base_utilities.py` is still present at `origin/main`. | `git show --stat 2456745c1e4d` shows only gate scripts, and `git ls-tree -r origin/main -- agent_utilities/base_utilities.py` lists the file.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 85
    },
    {
      "id": "AU-BOUNDARY-R010.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Decide target module for type coercion helpers (to_boolean, to_integer, to_list, and to_dict) currently in `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Decide target module for type coercion helpers (to_boolean, to_integer, to_list, and to_dict) currently in `base_utilities.py`.** No replacement module is named by the parent row for this group. Agent Utilities records which existing or new module owns it after deletion. | The decision is recorded in this spec as an added note naming the target module for type coercion helpers.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 87
    },
    {
      "id": "AU-BOUNDARY-R010.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Add type coercion helpers (to_boolean, to_integer, to_list, and to_dict) to the module decided in AU-BOUNDARY-R010.3",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Add type coercion helpers (to_boolean, to_integer, to_list, and to_dict) to the module decided in AU-BOUNDARY-R010.3.** Agent Utilities implements the group in its new home with equivalent behavior to the `base_utilities.py` originals. | A unit test for each symbol in the group passes against the new module.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 88
    },
    {
      "id": "AU-BOUNDARY-R010.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Decide target module for env/host helpers (expand_env_vars, is_loopback_url, retrieve_package_name, advertised_self_hosts, and get_library_file_path) currently in `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Decide target module for env/host helpers (expand_env_vars, is_loopback_url, retrieve_package_name, advertised_self_hosts, and get_library_file_path) currently in `base_utilities.py`.** No replacement module is named by the parent row for this group; Agent Utilities records which existing or new module owns it after deletion. | The decision is recorded in this spec as an added note naming the target module for env/host helpers.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 89
    },
    {
      "id": "AU-BOUNDARY-R010.6",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Add env/host helpers (expand_env_vars, is_loopback_url, retrieve_package_name, advertised_self_hosts, and get_library_file_path) to the module decided in AU-BOUNDARY-R010.5",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Add env/host helpers (expand_env_vars, is_loopback_url, retrieve_package_name, advertised_self_hosts, and get_library_file_path) to the module decided in AU-BOUNDARY-R010.5.** Agent Utilities implements the group in its new home with equivalent behavior to the `base_utilities.py` originals. | A unit test for each symbol in the group passes against the new module.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 90
    },
    {
      "id": "AU-BOUNDARY-R010.7",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Decide target module for model persistence helpers (safe_save_model and safe_load_model) currently in `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Decide target module for model persistence helpers (safe_save_model and safe_load_model) currently in `base_utilities.py`.** No replacement module is named by the parent row for this group. Agent Utilities records which existing or new module owns it after deletion. | The decision is recorded in this spec as an added note naming the target module for model persistence helpers.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 91
    },
    {
      "id": "AU-BOUNDARY-R010.8",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Add model persistence helpers (safe_save_model and safe_load_model) to the module decided in AU-BOUNDARY-R010.7",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Add model persistence helpers (safe_save_model and safe_load_model) to the module decided in AU-BOUNDARY-R010.7.** Agent Utilities implements the group in its new home with equivalent behavior to the `base_utilities.py` originals. | A unit test for each symbol in the group passes against the new module.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 92
    },
    {
      "id": "AU-BOUNDARY-R010.9",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Decide target module for patch helpers (the Patch* family) currently in `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Decide target module for patch helpers (the Patch* family) currently in `base_utilities.py`.** No replacement module is named by the parent row for this group. Agent Utilities records which existing or new module owns it after deletion. | The decision is recorded in this spec as an added note naming the target module for patch helpers.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 93
    },
    {
      "id": "AU-BOUNDARY-R010.10",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Add patch helpers (the Patch* family) to the module decided in AU-BOUNDARY-R010.9",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Add patch helpers (the Patch* family) to the module decided in AU-BOUNDARY-R010.9.** Agent Utilities implements the group in its new home with equivalent behavior to the `base_utilities.py` originals. | A unit test for each symbol in the group passes against the new module.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 94
    },
    {
      "id": "AU-BOUNDARY-R010.11",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Decide target module for core runtime helpers (Result, ModuleInfo, get_missing_imports, require_optional_import, get_logger, and ensure_package_installed) currently in `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Decide target module for core runtime helpers (Result, ModuleInfo, get_missing_imports, require_optional_import, get_logger, and ensure_package_installed) currently in `base_utilities.py`.** No replacement module is named by the parent row for this group; Agent Utilities records which existing or new module owns it after deletion. | The decision is recorded in this spec as an added note naming the target module for core runtime helpers.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 95
    },
    {
      "id": "AU-BOUNDARY-R010.12",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Add core runtime helpers (Result, ModuleInfo, get_missing_imports, require_optional_import, get_logger, and ensure_package_installed) to the module decided in AU-BOUNDARY-R010.11",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Add core runtime helpers (Result, ModuleInfo, get_missing_imports, require_optional_import, get_logger, and ensure_package_installed) to the module decided in AU-BOUNDARY-R010.11.** Agent Utilities implements the group in its new home with equivalent behavior to the `base_utilities.py` originals. | A unit test for each symbol in the group passes against the new module.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 96
    },
    {
      "id": "AU-BOUNDARY-R010.13",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/core/config.py and agent_utilities/core/_env.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/core/config.py and agent_utilities/core/_env.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/core/config.py agent_utilities/core/_env.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 97
    },
    {
      "id": "AU-BOUNDARY-R010.14",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/knowledge_graph/core/chunked_drain.py and agent_utilities/knowledge_graph/core/source_sync.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/knowledge_graph/core/chunked_drain.py and agent_utilities/knowledge_graph/core/source_sync.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/knowledge_graph/core/chunked_drain.py agent_utilities/knowledge_graph/core/source_sync.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 98
    },
    {
      "id": "AU-BOUNDARY-R010.15",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/observability/custom_observability.py and agent_utilities/observability/__init__.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/observability/custom_observability.py and agent_utilities/observability/__init__.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/observability/custom_observability.py agent_utilities/observability/__init__.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 99
    },
    {
      "id": "AU-BOUNDARY-R010.16",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/mcp/check_env_var_drift.py, agent_utilities/mcp/multiplexer.py, and agent_utilities/mcp/server_factory.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/mcp/check_env_var_drift.py, agent_utilities/mcp/multiplexer.py, and agent_utilities/mcp/server_factory.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/mcp/check_env_var_drift.py agent_utilities/mcp/multiplexer.py agent_utilities/mcp/server_factory.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 100
    },
    {
      "id": "AU-BOUNDARY-R010.17",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/agent/factory.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/agent/factory.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/agent/factory.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 101
    },
    {
      "id": "AU-BOUNDARY-R010.18",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/graph/builder.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/graph/builder.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/graph/builder.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 102
    },
    {
      "id": "AU-BOUNDARY-R010.19",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/httpsupport/client.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/httpsupport/client.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/httpsupport/client.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 103
    },
    {
      "id": "AU-BOUNDARY-R010.20",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/__init__.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/__init__.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/__init__.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 104
    },
    {
      "id": "AU-BOUNDARY-R010.21",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/protocols/source_connectors/registry.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/protocols/source_connectors/registry.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/protocols/source_connectors/registry.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 105
    },
    {
      "id": "AU-BOUNDARY-R010.22",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/rlm/config.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/rlm/config.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/rlm/config.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 106
    },
    {
      "id": "AU-BOUNDARY-R010.23",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/server/app.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/server/app.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/server/app.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 107
    },
    {
      "id": "AU-BOUNDARY-R010.24",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint agent_utilities/tools/tool_registry.py off `base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint agent_utilities/tools/tool_registry.py off `base_utilities.py`.** Agent Utilities imports the migrated symbols from their new homes (per AU-BOUNDARY-R010.3-R010.12) instead of `base_utilities.py`. | `git grep -n base_utilities agent_utilities/tools/tool_registry.py` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 108
    },
    {
      "id": "AU-BOUNDARY-R010.25",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/base_utilities.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/base_utilities.py`.** All symbol groups have a new home and every importer is repointed. | `tests/gates/test_boundary_r001_r010_deletion_census.py::test_base_utilities_deleted` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 109
    },
    {
      "id": "AU-BOUNDARY-R011",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete AU's source lifecycle and certification code",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "2456745c1e4d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete AU's source lifecycle and certification code.** Agent Utilities deletes `protocols/source_connectors/**`, `protocols/universal_connector.py`, `kg/integrations/connector_certification`, `kg/integrations/connector_source_attestation`, its certification command line interface, and `kg/ontology/connector_manifest` and `kg/ontology/connector_manifest_gate`, once the agent connector SDK owns cursors, conflict handling, mapping, and certification. AU removes the `graph-os-certify-connector` script and graph-os's import sites are repointed to the SDK. | Cursor, conflict, mapping, and certification conformance tests against the SDK confirm equivalent behavior before the AU modules are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 110
    },
    {
      "id": "AU-BOUNDARY-R011.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "ROLLUP: superseded by AU-BOUNDARY-R011.2.1...AU-BOUNDARY-R011.2.5",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**ROLLUP: superseded by AU-BOUNDARY-R011.2.1...AU-BOUNDARY-R011.2.5.** Delete `protocols/universal_connector.py`. Not deletable in one bite: the 1,025-line module is a live read-only SQL/MongoDB connector (`read`, `health_check`, `introspect`) used by two production importers and two test files, and `agent-connector-sdk` has no equivalent yet. | Superseded; see child rows.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 112
    },
    {
      "id": "AU-BOUNDARY-R011.2.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Add the read-only multi-database connector (SQL and MongoDB: `read`, `health_check`, `introspect`) to `agent-connector-sdk`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Add the read-only multi-database connector (SQL and MongoDB: `read`, `health_check`, `introspect`) to `agent-connector-sdk`**, with conformance tests equivalent to `tests/unit/protocols/test_universal_connector.py`. | `agent-connector-sdk` exports the connector and its conformance tests pass in that repo.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 113
    },
    {
      "id": "AU-BOUNDARY-R011.2.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `protocols/source_connectors/connectors/database.py` to the SDK database connector",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `protocols/source_connectors/connectors/database.py` to the SDK database connector.** | `git grep -l universal_connector agent_utilities/protocols/source_connectors` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 114
    },
    {
      "id": "AU-BOUNDARY-R011.2.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `tools/db_tools.py` to the SDK database connector",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `tools/db_tools.py` to the SDK database connector.** | `git grep -l universal_connector agent_utilities/tools` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 115
    },
    {
      "id": "AU-BOUNDARY-R011.2.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Repoint `tests/unit/protocols/test_database_connector_connection_profile.py` and `tests/unit/test_db_tools.py` to the SDK connector, and delete `tests/unit/protocols/test_universal_connector.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Repoint `tests/unit/protocols/test_database_connector_connection_profile.py` and `tests/unit/test_db_tools.py` to the SDK connector, and delete `tests/unit/protocols/test_universal_connector.py`** (moved to the SDK in R011.2.1); also update `docs/concepts.yaml` and `docs/pillars/4_ecosystem_peripherals/ECO-4.33-Native_Database_Traversal.md`. | `git grep -l universal_connector tests docs` finds no match.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 116
    },
    {
      "id": "AU-BOUNDARY-R011.2.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `protocols/universal_connector.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `protocols/universal_connector.py`** once it has zero importers. | `tests/gates/test_boundary_r011_universal_connector_deleted.py::test_universal_connector_module_absent` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 117
    },
    {
      "id": "AU-BOUNDARY-R011.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete the `protocols/source_connectors/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete the `protocols/source_connectors/**` package** (base, checkpoint, registry, permission_sync, http_safety, tool_schema, `connectors/`) and fix its importers, once the SDK owns cursor/conflict/mapping handling. | `tests/gates/test_boundary_r011_source_connectors_deleted.py::test_source_connectors_package_absent` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 118
    },
    {
      "id": "AU-BOUNDARY-R011.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `knowledge_graph/integrations/connector_certification.py`, `connector_certification_cli.py`, and `connector_source_attestation.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `knowledge_graph/integrations/connector_certification.py`, `connector_certification_cli.py`, and `connector_source_attestation.py`** and fix their importers, once the SDK owns certification. | `tests/gates/test_boundary_r011_certification_deleted.py::test_certification_modules_absent` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 119
    },
    {
      "id": "AU-BOUNDARY-R011.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `knowledge_graph/ontology/connector_manifest.py`, `connector_manifest_gate.py`, and `connector_manifests/",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `knowledge_graph/ontology/connector_manifest.py`, `connector_manifest_gate.py`, and `connector_manifests/**`, and remove the `graph-os-certify-connector` script**, once graph-os's import sites are repointed to the SDK. | `tests/gates/test_boundary_r011_manifest_deleted.py::test_manifest_modules_and_script_absent` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 120
    },
    {
      "id": "AU-BOUNDARY-R012",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete the second EG projection and leftover shims",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "34a849a78973",
        "7b653dd102b9"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete the second EG projection and leftover shims.** Agent Utilities deletes `protocols/epistemic_operations/**` and the `control_plane/` shim, so that every caller reaches durable graph state through the `epistemic_graph` client directly, with no second Python-side graph projection. | Cross-source tests exercising the generated EG client as the sole projection confirm the deleted modules have no remaining caller.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 121
    },
    {
      "id": "AU-BOUNDARY-R013",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Restrict graph-os to AU's public API only",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "4a5540dd2e3d",
        "5b4e8d0a31d0"
      ],
      "verified_by": [
        "tests/unit/test_api_messaging.py:12"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Restrict graph-os to AU's public API only.** Agent Utilities widens its public surface so that graph-os imports AU exclusively through `agent_utilities.api`, adding new public ports for the import sites graph-os currently reaches through internal modules. AU's layout test fence is updated so a non-API import of AU by graph-os fails. | An AST-based import census across graph-os, backed by a served agent operation exercised end to end, shows every graph-os import of AU goes through `agent_utilities.api`.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 122
    },
    {
      "id": "AU-BOUNDARY-R013.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Export `persistence_reference` from `agent_utilities.api.persistence_privacy` with an import test",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a2616c523584"
      ],
      "verified_by": [
        "tests/unit/test_api_persistence_privacy.py:11"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Export `persistence_reference` from `agent_utilities.api.persistence_privacy` with an import test.** Re-export from `agent_utilities/security/persistence_privacy` so graph-os stops importing the internal module. Unblocks graph-os rows `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.3` (graph-os change follows in graph-os). Rollup: `AU-BOUNDARY-R013`. | An import test asserts the names resolve from `agent_utilities.api.persistence_privacy` and are the same objects as the internal definitions.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 123
    },
    {
      "id": "AU-BOUNDARY-R013.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Export `Orchestrator` from `agent_utilities.api.orchestration` with an import test",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a2616c523584"
      ],
      "verified_by": [
        "tests/unit/test_api_orchestration.py:11"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Export `Orchestrator` from `agent_utilities.api.orchestration` with an import test.** Re-export from `agent_utilities/orchestration/manager` so graph-os stops importing the internal module. Unblocks graph-os rows `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.3` (graph-os change follows in graph-os). Rollup: `AU-BOUNDARY-R013`. | An import test asserts the names resolve from `agent_utilities.api.orchestration` and are the same objects as the internal definitions.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 124
    },
    {
      "id": "AU-BOUNDARY-R013.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Export the `work_durability` module from `agent_utilities.api.work_durability` with an import test",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "811ea6463bb6"
      ],
      "verified_by": [
        "tests/unit/test_api_work_durability.py:11"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Export the `work_durability` module from `agent_utilities.api.work_durability` with an import test.** Re-export from `agent_utilities/knowledge_graph/core` so graph-os stops importing the internal module. Unblocks graph-os rows `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.3` (graph-os change follows in graph-os). Rollup: `AU-BOUNDARY-R013`. | An import test asserts the names resolve from `agent_utilities.api.work_durability` and are the same objects as the internal definitions.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 125
    },
    {
      "id": "AU-BOUNDARY-R013.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Export `KIND_ORCHESTRATOR_TASK`, `AgentTurnEnvelope`, `enqueue_agent_turn` from `agent_utilities.api.agent_dispatch` with an import test",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "811ea6463bb6"
      ],
      "verified_by": [
        "tests/unit/test_api_agent_dispatch.py:11"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Export `KIND_ORCHESTRATOR_TASK`, `AgentTurnEnvelope`, `enqueue_agent_turn` from `agent_utilities.api.agent_dispatch` with an import test.** Re-export from `agent_utilities/orchestration/agent_dispatch` so graph-os stops importing the internal module. Unblocks graph-os rows `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.3` (graph-os change follows in graph-os). Rollup: `AU-BOUNDARY-R013`. | An import test asserts the names resolve from `agent_utilities.api.agent_dispatch` and are the same objects as the internal definitions.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 126
    },
    {
      "id": "AU-BOUNDARY-R013.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Export `trace_id` from `agent_utilities.api.trace_ontology` with an import test",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "bafa21805b51"
      ],
      "verified_by": [
        "tests/unit/test_api_trace_ontology.py:11"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Export `trace_id` from `agent_utilities.api.trace_ontology` with an import test.** Re-export from `agent_utilities/observability/trace_ontology` so graph-os stops importing the internal module. Unblocks graph-os rows `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.3` (graph-os change follows in graph-os). Rollup: `AU-BOUNDARY-R013`. | An import test asserts the names resolve from `agent_utilities.api.trace_ontology` and are the same objects as the internal definitions.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 127
    },
    {
      "id": "AU-BOUNDARY-R013.6",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Export `ACTION_APPROVAL_KIND`, `approval_lease_to_props` from `agent_utilities.api.action_policy` with an import test",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "bafa21805b51"
      ],
      "verified_by": [
        "tests/unit/test_api_action_policy.py:11"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Export `ACTION_APPROVAL_KIND`, `approval_lease_to_props` from `agent_utilities.api.action_policy` with an import test.** Re-export from `agent_utilities/orchestration/action_policy` so graph-os stops importing the internal module. Unblocks graph-os rows `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.3` (graph-os change follows in graph-os). Rollup: `AU-BOUNDARY-R013`. | An import test asserts the names resolve from `agent_utilities.api.action_policy` and are the same objects as the internal definitions.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 128
    },
    {
      "id": "AU-BOUNDARY-R013.7",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Export `ElevationRequest`, `ElevationApproval`, `ElevationRevocation` from `agent_utilities.api.elevation` with an import test",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2a5643693ab7"
      ],
      "verified_by": [
        "tests/unit/test_api_elevation.py:11"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Export `ElevationRequest`, `ElevationApproval`, `ElevationRevocation` from `agent_utilities.api.elevation` with an import test.** Re-export from `agent_utilities/security/elevation` so graph-os stops importing the internal module. Unblocks graph-os rows `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.3` (graph-os change follows in graph-os). Rollup: `AU-BOUNDARY-R013`. | An import test asserts the names resolve from `agent_utilities.api.elevation` and are the same objects as the internal definitions.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 129
    },
    {
      "id": "AU-BOUNDARY-R013.8",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Export `ElevationService`, `ElevationSurface` from `agent_utilities.api.elevation` with an import test",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2a5643693ab7"
      ],
      "verified_by": [
        "tests/unit/test_api_elevation.py:18"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Export `ElevationService`, `ElevationSurface` from `agent_utilities.api.elevation` with an import test.** Re-export from `agent_utilities/security/elevation` so graph-os stops importing the internal module. Unblocks graph-os rows `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.3` (graph-os change follows in graph-os). Rollup: `AU-BOUNDARY-R013`. | An import test asserts the names resolve from `agent_utilities.api.elevation` and are the same objects as the internal definitions.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 130
    },
    {
      "id": "AU-BOUNDARY-R013.9",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Export `LiveArtifactStore`, `get_live_artifact_store`, `LiveArtifact` from `agent_utilities.api.live_artifacts` with an import test",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Export `LiveArtifactStore`, `get_live_artifact_store`, `LiveArtifact` from `agent_utilities.api.live_artifacts` with an import test.** Re-export from `agent_utilities/knowledge_graph/live_artifacts/store.py` and `models.py` so graph-os stops importing the internal module. The store relocates to the epistemic graph under AU-BOUNDARY-R045, so the public export keeps the same names across that move. Unblocks graph-os row `GRAPHOS-GWC-R002.1` (graph-os change follows in graph-os). Rollup: `AU-BOUNDARY-R013`. | An import test asserts the names resolve from `agent_utilities.api.live_artifacts` and are the same objects as the internal definitions.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 131
    },
    {
      "id": "AU-BOUNDARY-R013.10",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Export `RefreshService`, `RefreshResult` from `agent_utilities.api.live_artifacts` with an import test",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Export `RefreshService`, `RefreshResult` from `agent_utilities.api.live_artifacts` with an import test.** Re-export from `agent_utilities/knowledge_graph/live_artifacts/refresh.py` so graph-os stops importing the internal module. Unblocks graph-os row `GRAPHOS-GWC-R002.1` (graph-os change follows in graph-os). Rollup: `AU-BOUNDARY-R013`. | An import test asserts the names resolve from `agent_utilities.api.live_artifacts` and are the same objects as the internal definitions.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 132
    },
    {
      "id": "AU-BOUNDARY-R014",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move graph-os boundary modules out of AU",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "3254358d61d6",
        "63731a44a881",
        "6ffbecc433c4",
        "8b3510fcb2eb",
        "d09cad07e875"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move graph-os boundary modules out of AU.** Agent Utilities moves its graph-os-only boundary modules into graph-os, including `security/request_identity`, `security/error_surface`, `security/browser_auth`, `security/security_policy_middleware`, `security/auth`, `security/conformance/**`, its `observability` health and metrics modules, `core/profile_guard`, `core/unified_install`, `core/release_channel`, `core/live_mount_guard`, `core/paths`, `core/workspace`, `core/workspace_config`, `core/config_admin`, `core/frontend_providers`, `ecosystem/hook_installer`, `ecosystem/agent_manager_dashboard`, `release_catalogs.py`, `gateway_client/**`, and `kg/readiness.py`; `kg/core/connection_registry` and `kg/core/engine_mcp_discovery` move into graph-os's fleet module. | Principal, tenant, and context preservation tests plus deny-path tests against the moved graph-os modules confirm equivalent behavior before the AU copies are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 133
    },
    {
      "id": "AU-BOUNDARY-R014.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move `knowledge_graph/readiness.py` to graph-os",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move `knowledge_graph/readiness.py` to graph-os** and delete the AU copy, fixing its importers, once graph-os's readiness module proves equivalent. | `tests/gates/test_boundary_r014_readiness_moved.py::test_readiness_module_absent_from_au` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 135
    },
    {
      "id": "AU-BOUNDARY-R015",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move the agent HTTP and A2A/ACP host out of AU",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "2456745c1e4d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move the agent HTTP and A2A/ACP host out of AU.** Agent Utilities moves `server/**` and `protocols/a2a`, `protocols/a2a_config`, `protocols/a2a_graph_skill`, `protocols/acp_adapter`, and `protocols/agui_emitter` into graph-os's A2A and web-UI hosting modules. AU deletes `protocols/a2a_epistemic.py`, because its broker and storage form a second task store, and drops the `agent-utilities-acp` script. | Endpoint and cancellation parity tests against the graph-os host confirm no AU listener remains active.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 136
    },
    {
      "id": "AU-BOUNDARY-R015.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `protocols/a2a_epistemic.py` and drop the `agent-utilities-acp` script",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `protocols/a2a_epistemic.py` and drop the `agent-utilities-acp` script**, fixing any importers, since it is a redundant second task store with no graph-os replacement to wait on. | `tests/gates/test_boundary_r015_a2a_epistemic_deleted.py::test_a2a_epistemic_module_and_script_absent` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 138
    },
    {
      "id": "AU-BOUNDARY-R016",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Split AU's monolithic configuration module",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "13655b508554"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Split AU's monolithic configuration module.** Agent Utilities splits `core/config.py` so that connector base settings move to the agent connector SDK's configuration module and hosting and deployment settings move to graph-os, while agent and model settings remain in AU. | A configuration fixture matrix exercised against all three owners shows no duplicate environment reader remains.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 139
    },
    {
      "id": "AU-BOUNDARY-R016.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Gate AU's retained config.py against duplicate environment readers",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5a00da215c55",
        "fe5ca4e239ec"
      ],
      "verified_by": [
        "tests/gates/test_config_duplicate_reader_gate.py:65",
        "tests/gates/test_config_duplicate_reader_gate.py:71"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Gate AU's retained config.py against duplicate environment readers.** Agent Utilities adds a regression gate over its own root, `core/config.py`, asserting that no environment variable name is read by more than one call site, as the invariant AU's agent-and-model-settings portion must keep once connector base settings move to the SDK and hosting settings move to graph-os. Moving the connector-base and hosting settings out to the SDK and graph-os owners is tracked as further `AU-BOUNDARY-R016.n` rows against those repos and is out of scope for this child. | The gate fails on an injected duplicate reader and passes on the current `core/config.py`.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 140
    },
    {
      "id": "AU-BOUNDARY-R017",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Split messaging behavior and authority across AU, graph-os, and EG",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "5b4e8d0a31d0"
      ],
      "verified_by": [
        "tests/unit/test_api_messaging.py:25"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Split messaging behavior and authority across AU, graph-os, and EG.** Agent Utilities keeps agent presence, subscriptions, `ActionPolicy`, and command and planning decisions in `messaging/bus.py` and `orchestration/action_policy.py`, exposed behind `agent_utilities.api.messaging`, while graph-os serves the channel adapters, listener, service, daemon, polling, reaper, and host routing. `messaging/bus_log.py` remains a verified-tenant, sanitized-envelope adapter in AU, and the epistemic graph becomes the sole authority for durable message append, partition reads, cursors, dead letters, and depth; AU drops the `agent-utilities-messaging` script. | Delivery, replay, ordering, authorization, and outage tests across the split boundary confirm parity with the prior combined behavior.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 141
    },
    {
      "id": "AU-BOUNDARY-R018",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Replace the AU graph engine facade with the EG client",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "8b325ddf1818",
        "8c6fb318c5d3"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Replace the AU graph engine facade with the EG client.** Agent Utilities deletes its graph engine facade, including `kg/core/engine.py`, `kg/core/engine_tasks.py`, `kg/core/engine_ingestion.py`, `kg/core/engine_memory.py`, `kg/core/engine_task_query.py`, `kg/core/engine_resolver.py`, `kg/core/engine_transport.py`, `kg/core/engine_lock.py`, `kg/core/engine_breaker.py`, `kg/facade.py`, and `kg/orchestration/engine_*.py`, once the generated epistemic graph client provides the same operations. | Tests confirming no remaining Python-side graph authority or fallback path, run against the generated EG client, gate the deletion.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 142
    },
    {
      "id": "AU-BOUNDARY-R018.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Ship a typed inventory of the AU-BOUNDARY-R018 facade modules",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8b325ddf1818"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Ship a typed inventory of the AU-BOUNDARY-R018 facade modules.** Agent Utilities records, as a parametrized pytest inventory, exactly which engine-facade modules `kg/core/engine.py`, `kg/core/engine_tasks.py`, `kg/core/engine_ingestion.py`, `kg/core/engine_memory.py`, `kg/core/engine_task_query.py`, `kg/core/engine_resolver.py`, `kg/core/engine_transport.py`, `kg/core/engine_lock.py`, `kg/core/engine_breaker.py`, `kg/facade.py`, and `kg/orchestration/engine_*.py` still exist as duplicates of EG's native engine, with a refusal test that fails if a listed module disappears without the inventory being updated in the same change. | `tests/.../test_boundary_r018_r022_eg_duplicate_inventory.py` passes and fails closed on an unrecorded module removal.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 143
    },
    {
      "id": "AU-BOUNDARY-R018.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete the AU-BOUNDARY-R018 facade modules",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete the AU-BOUNDARY-R018 facade modules.** Agent Utilities deletes `kg/core/engine.py`, `kg/core/engine_tasks.py`, `kg/core/engine_ingestion.py`, `kg/core/engine_memory.py`, `kg/core/engine_task_query.py`, `kg/core/engine_resolver.py`, `kg/core/engine_transport.py`, `kg/core/engine_lock.py`, `kg/core/engine_breaker.py`, `kg/facade.py`, and `kg/orchestration/engine_*.py` \u2014 all still present as of 2026-10-09 \u2014 once the generated EG client proves equivalent operations. | Tests confirming no remaining Python-side graph authority or fallback path, run against the generated EG client, gate the deletion. The files above are absent from the tree.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 144
    },
    {
      "id": "AU-BOUNDARY-R019",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Replace AU's graph-compute and state facades with the EG client",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "8b325ddf1818",
        "8c6fb318c5d3"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Replace AU's graph-compute and state facades with the EG client.** Agent Utilities deletes `kg/core/graph_compute`, `kg/core/session`, `kg/core/epistemic_row`, `kg/core/ogm`, `kg/core/company_brain`, `kg/core/company_brain_runtime`, and `core/registry/kg_adapter.py`, replacing them with one typed epistemic graph composition kept in `api/`. | Connection-scope isolation, compute-budget enforcement, and typed-error-parity tests against the generated EG client confirm equivalence before the facades are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 145
    },
    {
      "id": "AU-BOUNDARY-R019.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Ship a typed inventory of the AU-BOUNDARY-R019 facade modules",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0fbe4bf46720",
        "8b325ddf1818"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r018_r022_eg_duplicate_inventory.py:178",
        "tests/gates/test_boundary_r018_r022_eg_duplicate_inventory.py:185"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Ship a typed inventory of the AU-BOUNDARY-R019 facade modules.** Agent Utilities records, as a parametrized pytest inventory, exactly which graph-compute/state-facade modules `kg/core/graph_compute.py`, `kg/core/session.py`, `kg/core/epistemic_row.py`, `kg/core/ogm.py`, `kg/core/company_brain.py`, `kg/core/company_brain_runtime.py`, and `core/registry/kg_adapter.py` still exist as duplicates of EG's native engine, with a refusal test that fails if a listed module disappears without the inventory being updated in the same change. | `tests/.../test_boundary_r018_r022_eg_duplicate_inventory.py` passes and fails closed on an unrecorded module removal.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 146
    },
    {
      "id": "AU-BOUNDARY-R019.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete the AU-BOUNDARY-R019 facade modules",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete the AU-BOUNDARY-R019 facade modules.** Agent Utilities deletes `kg/core/graph_compute.py`, `kg/core/session.py`, `kg/core/epistemic_row.py`, `kg/core/ogm.py`, `kg/core/company_brain.py`, `kg/core/company_brain_runtime.py`, and `core/registry/kg_adapter.py` \u2014 all still present as of 2026-10-09 \u2014 replacing them with the typed epistemic graph composition in `api/`. | Connection-scope isolation, compute-budget enforcement, and typed-error-parity tests against the generated EG client confirm equivalence. The files above are absent from the tree.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 147
    },
    {
      "id": "AU-BOUNDARY-R020",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move durable work, queues, and state to EG",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "8b325ddf1818",
        "8c6fb318c5d3",
        "92974bae8c3e"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move durable work, queues, and state to EG.** Agent Utilities deletes `kg/core/work_durability`, `kg/core/kafka_queue_backend`, `kg/core/postgres_queue_backend`, `kg/core/queue_backend`, `kg/core/worker_scheduler`, `kg/core/chunked_drain`, `kg/core/ingest_routing`, `kg/core/ingest_profile`, `kg/core/event_backend`, `kg/core/knowledge_stream`, `kg/core/bitemporal`, `kg/core/kg_versioning`, `kg/ingest_worker`, `kg/analytics_worker`, `core/shared_resource_leases.py`, `core/state_store`, and `core/chat_persistence`, moving durable jobs, resource leases, and state to the epistemic graph. AU drops the `kg-ingest-worker` and `graph-os-analytics-worker` scripts. | Claim-fencing, restart, idempotency, and tenant-isolation tests against the epistemic graph's durable job and lease handling confirm parity before deletion.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 148
    },
    {
      "id": "AU-BOUNDARY-R020.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Ship a typed inventory of the AU-BOUNDARY-R020 durable-work modules",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8b325ddf1818"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Ship a typed inventory of the AU-BOUNDARY-R020 durable-work modules.** Agent Utilities records, as a parametrized pytest inventory, exactly which durable work/queue/state modules `kg/core/work_durability.py`, `kg/core/kafka_queue_backend.py`, `kg/core/postgres_queue_backend.py`, `kg/core/queue_backend.py`, `kg/core/worker_scheduler.py`, `kg/core/chunked_drain.py`, `kg/core/ingest_routing.py`, `kg/core/ingest_profile.py`, `kg/core/event_backend.py`, `kg/core/knowledge_stream.py`, `kg/core/bitemporal.py`, `kg/core/kg_versioning.py`, `kg/ingest_worker.py`, `kg/analytics_worker.py`, `core/shared_resource_leases.py`, `core/state_store.py`, and `core/chat_persistence.py` still exist as duplicates of EG's native engine, with a refusal test that fails if a listed module disappears without the inventory being updated in the same change. | `tests/.../test_boundary_r018_r022_eg_duplicate_inventory.py` passes and fails closed on an unrecorded module removal.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 149
    },
    {
      "id": "AU-BOUNDARY-R020.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move the AU-BOUNDARY-R020 durable-work modules and drop their scripts",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move the AU-BOUNDARY-R020 durable-work modules and drop their scripts.** Agent Utilities deletes `kg/core/work_durability.py`, `kg/core/kafka_queue_backend.py`, `kg/core/postgres_queue_backend.py`, `kg/core/queue_backend.py`, `kg/core/worker_scheduler.py`, `kg/core/chunked_drain.py`, `kg/core/ingest_routing.py`, `kg/core/ingest_profile.py`, `kg/core/event_backend.py`, `kg/core/knowledge_stream.py`, `kg/core/bitemporal.py`, `kg/core/kg_versioning.py`, `kg/ingest_worker.py`, `kg/analytics_worker.py`, `core/shared_resource_leases.py`, `core/state_store.py`, and `core/chat_persistence.py` \u2014 all still present as of 2026-10-09 \u2014 and drops the `kg-ingest-worker` and `graph-os-analytics-worker` scripts, moving durable jobs, resource leases, and state to the epistemic graph. | Claim-fencing, restart, idempotency, and tenant-isolation tests against the epistemic graph's durable job and lease handling confirm parity; the files above and both scripts are absent.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 150
    },
    {
      "id": "AU-BOUNDARY-R021",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move graph tenancy, topology, and admission to EG",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "8b325ddf1818",
        "8c6fb318c5d3",
        "d330871d37af"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move graph tenancy, topology, and admission to EG.** Agent Utilities deletes `kg/core/tenant_sharing`, `kg/core/tenant_registry`, `kg/core/tenant_engine_pool`, `kg/core/shard_topology`, `kg/core/cluster_discovery`, `kg/core/placement_catalog`, `kg/core/secured_reads`, `kg/core/cypher_scoping`, `kg/core/cypher_scope_vars`, `kg/core/bounded_read`, `kg/core/host_lock`, `kg/core/file_lock`, its `security/system_rbac_admission`, `security/tenant_rbac_admission`, and `security/engine_rbac_admission` modules, `admission_authority`, its admission command line interfaces, `permissions_kernel`, and `entitlements`, moving identity, RBAC admission, and graph access-control isolation authority to the epistemic graph. | Cross-tenant denial tests and authoritative graph-selection tests against the epistemic graph's admission path confirm fail-closed behavior before deletion.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 151
    },
    {
      "id": "AU-BOUNDARY-R021.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Ship a typed inventory of the AU-BOUNDARY-R021 tenancy/admission modules",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8b325ddf1818"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Ship a typed inventory of the AU-BOUNDARY-R021 tenancy/admission modules.** Agent Utilities records, as a parametrized pytest inventory, exactly which tenancy/topology/admission modules `kg/core/tenant_sharing.py`, `kg/core/tenant_registry.py`, `kg/core/tenant_engine_pool.py`, `kg/core/shard_topology.py`, `kg/core/cluster_discovery.py`, `kg/core/placement_catalog.py`, `kg/core/secured_reads.py`, `kg/core/cypher_scoping.py`, `kg/core/cypher_scope_vars.py`, `kg/core/bounded_read.py`, `kg/core/host_lock.py`, `kg/core/file_lock.py`, `security/system_rbac_admission.py`, `security/tenant_rbac_admission.py`, `security/engine_rbac_admission.py`, `security/admission_authority.py`, its admission command line interfaces (`security/system_admission_cli.py`, `security/tenant_admission_cli.py`), `security/permissions_kernel.py`, and `security/entitlements.py` still exist as duplicates of EG's native engine, with a refusal test that fails if a listed module disappears without the inventory being updated in the same change. | `tests/.../test_boundary_r018_r022_eg_duplicate_inventory.py` passes and fails closed on an unrecorded module removal.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 152
    },
    {
      "id": "AU-BOUNDARY-R021.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete the AU-BOUNDARY-R021 tenancy/admission modules",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete the AU-BOUNDARY-R021 tenancy/admission modules.** Agent Utilities deletes `kg/core/tenant_sharing.py`, `kg/core/tenant_registry.py`, `kg/core/tenant_engine_pool.py`, `kg/core/shard_topology.py`, `kg/core/cluster_discovery.py`, `kg/core/placement_catalog.py`, `kg/core/secured_reads.py`, `kg/core/cypher_scoping.py`, `kg/core/cypher_scope_vars.py`, `kg/core/bounded_read.py`, `kg/core/host_lock.py`, `kg/core/file_lock.py`, `security/system_rbac_admission.py`, `security/tenant_rbac_admission.py`, `security/engine_rbac_admission.py`, `security/admission_authority.py`, its admission command line interfaces, `security/permissions_kernel.py`, and `security/entitlements.py` \u2014 all still present as of 2026-10-09 \u2014 moving identity, RBAC admission, and graph access-control isolation authority to the epistemic graph. | Cross-tenant denial tests and authoritative graph-selection tests against the epistemic graph's admission path confirm fail-closed behavior; the files above are absent from the tree.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 153
    },
    {
      "id": "AU-BOUNDARY-R022",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire AU's reasoning and graph-analytics duplicates",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "8b325ddf1818",
        "8c6fb318c5d3"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire AU's reasoning and graph-analytics duplicates.** Agent Utilities deletes its reasoning and analytics modules once each has proven native coverage in the epistemic graph, including `kg/core/formal_reasoning_core`, `kg/core/graph_primitives`, `kg/core/inference_engine`, `kg/core/reasoner`, `kg/core/semantic_subsumption`, the `kg/core/topological_*` modules, `kg/core/spectral_navigator`, `kg/core/synergy_engine`, `kg/core/analogy_engine`, `kg/core/hypergraph`, `kg/core/blast_radius`, `kg/core/nl_query`, `kg/core/hydration`, `kg/core/maintainer`, `kg/core/world_model`, `kg/core/ownership_claim`, `kg/core/fingerprint`, and the `kg/maintenance`, `kg/id_management`, `kg/argumentation`, and `kg/actions` subpackages. | Method-by-method golden comparisons against the epistemic graph's native implementation prove parity for each module before its AU copy is deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 154
    },
    {
      "id": "AU-BOUNDARY-R022.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Ship a typed inventory of the AU-BOUNDARY-R022 reasoning/analytics modules",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8b325ddf1818"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Ship a typed inventory of the AU-BOUNDARY-R022 reasoning/analytics modules.** Agent Utilities records, as a parametrized pytest inventory, exactly which reasoning/analytics modules `kg/core/formal_reasoning_core.py`, `kg/core/graph_primitives.py`, `kg/core/inference_engine.py`, `kg/core/reasoner.py`, `kg/core/semantic_subsumption.py`, `kg/core/topological_analysis_engine.py`, `kg/core/topological_partition.py`, `kg/core/spectral_navigator.py`, `kg/core/synergy_engine.py`, `kg/core/analogy_engine.py`, `kg/core/hypergraph.py`, `kg/core/blast_radius.py`, `kg/core/nl_query.py`, `kg/core/hydration.py`, `kg/core/maintainer.py`, `kg/core/world_model.py`, `kg/core/ownership_claim.py`, `kg/core/fingerprint.py`, and the `kg/maintenance`, `kg/id_management`, `kg/argumentation`, and `kg/actions` subpackages still exist as duplicates of EG's native engine, with a refusal test that fails if a listed module disappears without the inventory being updated in the same change. | `tests/.../test_boundary_r018_r022_eg_duplicate_inventory.py` passes and fails closed on an unrecorded module removal.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 155
    },
    {
      "id": "AU-BOUNDARY-R022.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete the AU-BOUNDARY-R022 reasoning/analytics modules",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete the AU-BOUNDARY-R022 reasoning/analytics modules.** Agent Utilities deletes `kg/core/formal_reasoning_core.py`, `kg/core/graph_primitives.py`, `kg/core/inference_engine.py`, `kg/core/reasoner.py`, `kg/core/semantic_subsumption.py`, `kg/core/topological_analysis_engine.py`, `kg/core/topological_partition.py`, `kg/core/spectral_navigator.py`, `kg/core/synergy_engine.py`, `kg/core/analogy_engine.py`, `kg/core/hypergraph.py`, `kg/core/blast_radius.py`, `kg/core/nl_query.py`, `kg/core/hydration.py`, `kg/core/maintainer.py`, `kg/core/world_model.py`, `kg/core/ownership_claim.py`, `kg/core/fingerprint.py`, and the `kg/maintenance`, `kg/id_management`, `kg/argumentation`, and `kg/actions` subpackages \u2014 all still present as of 2026-10-09 \u2014 once each has proven native coverage in the epistemic graph. | Method-by-method golden comparisons against the epistemic graph's native implementation prove parity; the files and subpackages above are absent from the tree.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 156
    },
    {
      "id": "AU-BOUNDARY-R023",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Split ingestion commit and derivation into EG",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "743e98cda405"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r023_r034_relocation_inventory.py:199"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Split ingestion commit and derivation into EG.** Agent Utilities moves the commit and derivation half of `kg/ingestion/**` to the epistemic graph's source-ingest path, including `envelope_ingest`, `change_envelope`, `evidence_spine`, `semantic_event_model`, `object_centric_derivation`, `process_conformance`, `embedding_admission`, `gpu_slot_scheduler`, `promotion`, `supersession`, `dead_letter`, `hydration_manifest`, `skill_workflow_ingest`, and `governed_documentation`. `ingestion/engine.py` is dissolved across its destination owners, and AU retains only model-backed candidate claims. | Atomic cursor-and-receipt tests, including a failure-rollback case showing no AU-side writer remains, confirm parity before the AU modules are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 157
    },
    {
      "id": "AU-BOUNDARY-R024",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move enterprise source synchronization to the SDK",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "4a5540dd2e3d",
        "743e98cda405"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r023_r034_relocation_inventory.py:200"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move enterprise source synchronization to the SDK.** Agent Utilities moves `kg/core/source_sync.py` to become a runner on the agent connector SDK, backed by the epistemic graph's source-ingest path and manifest presets. AU also moves `kg/ingestion/external_graph*`, `kg/ingestion/graphql_connection`, `kg/ingestion/debezium_envelope`, `kg/ingestion/event_log_adapter`, `kg/ingestion/ocel_adapter`, `kg/governance_import.py`, `ecosystem/ea_clients.py`, `data_prep/**`, `kg/core/connection_profiler`, `kg/core/data_prep_runtime`, and `kg/core/source_resolver`. | Full-sync, delta-sync, reconcile, and withdrawal-receipt tests against the SDK runner confirm parity before the AU modules are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 158
    },
    {
      "id": "AU-BOUNDARY-R024.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move `knowledge_graph/core/source_sync.py` to the agent connector SDK as a runner",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move `knowledge_graph/core/source_sync.py` to the agent connector SDK as a runner** and delete the AU copy, fixing its importers, once the SDK runner proves full-sync/delta-sync/reconcile parity. | `tests/gates/test_boundary_r024_source_sync_moved.py::test_source_sync_module_absent_from_au` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 160
    },
    {
      "id": "AU-BOUNDARY-R024.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move `knowledge_graph/governance_import.py` to the SDK",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move `knowledge_graph/governance_import.py` to the SDK** and delete the AU copy, fixing its importers, once the SDK's governance-import path proves parity. | `tests/gates/test_boundary_r024_governance_import_moved.py::test_governance_import_module_absent_from_au` passes.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 161
    },
    {
      "id": "AU-BOUNDARY-R025",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move document, conversation, and feed sources to the SDK",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "743e98cda405"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r023_r034_relocation_inventory.py:201"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move document, conversation, and feed sources to the SDK.** Agent Utilities moves the repository-indexer module in `kg/core/` (the single `*_indexer` module there), `kg/core/conversation_ingestion`, `kg/ingestion/web_fetch`, `kg/ingestion/package_install_ingest`, `kg/ingestion/repo_*`, the top-level `ingestion/**`, `automation/worldmodel_pipeline`, `automation/feed_sources`, `automation/file_watcher`, `sdd/watcher.py`, the non-model half of `kg/kb/**`, `kg/extraction/readers*`, `kg/extraction/pdf`, and `ecosystem/media/**` to the agent connector SDK. | Typed source-envelope tests and recovery tests after an interrupted source read confirm parity before the AU modules are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 162
    },
    {
      "id": "AU-BOUNDARY-R026",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move vendor enrichment extractors and write-back to the SDK",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "00234474001c",
        "0e44186eac39",
        "743e98cda405"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move vendor enrichment extractors and write-back to the SDK.** Agent Utilities moves `kg/enrichment/extractors/**` to become connector-manifest presets and SDK adapters, moves `kg/enrichment/writeback/**` behind the SDK's write-back module and the epistemic graph's governed write-back path, and moves `enrichment/git_history` and `enrichment/source_adapters` to the SDK's repository adapter. | Vendor-transport, schema-mapping, and conflict tests against the SDK and the epistemic graph's governed write-back confirm parity before the AU modules are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 163
    },
    {
      "id": "AU-BOUNDARY-R027",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move deterministic enrichment and derivation to EG",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "743e98cda405"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r023_r034_relocation_inventory.py:202"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move deterministic enrichment and derivation to EG.** Agent Utilities moves `kg/enrichment/semantic`, `kg/enrichment/relation_projection`, `kg/enrichment/materialize`, `kg/enrichment/git_coupling`, `kg/enrichment/graph_collapse`, `kg/enrichment/provenance`, `kg/assimilation/**`, `kg/etl/**`, `kg/streams/**`, and `kg/memory/timeseries/**` to the epistemic graph. | Golden-output comparisons confirm no model-dependent graph writer remains in AU after the modules are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 164
    },
    {
      "id": "AU-BOUNDARY-R028",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move remaining graph standardization and security modules to EG (rollup)",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4d0883da01d2",
        "5c70aeb872d9",
        "743e98cda405",
        "8edddc8b0a00",
        "9fec85433f51"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move remaining graph standardization and security modules to EG (rollup).** Agent Utilities moves its remaining EG-bound modules to the epistemic graph, including `kg/standardization/**` except drift handling, `kg/infra/**`, `kg/quantum/**`, `kg/security/**`, `protocols/enterprise/**`, `ecosystem/ard_*`, `observability/trace_ontology`, `observability/self_ingest`, `observability/audit_logger`, `governance/relational_authority.py`, and `research/placement_mining.py`. Split by code root into `AU-BOUNDARY-R028.1`-`.8`; this parent lands when every child lands. | Public method coverage tests against the epistemic graph confirm every moved capability is reachable before the matching AU import is deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 165
    },
    {
      "id": "AU-BOUNDARY-R028.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire `kg/standardization/{cohorts,consolidation,standards}.py` (excludes `drift.py`)",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4d0883da01d2"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire `kg/standardization/{cohorts,consolidation,standards}.py` (excludes `drift.py`).** Delete once EG exposes an equivalent client; today `drift.py` (retained) imports `read_assets` from `cohorts.py` and `drift_score`/`standard_node_id` from `standards.py`, and `kg/ontology/__init__.py` plus `mcp/tools/{evolution_tools,ontology_tools}.py` import `standards.py` directly in production, so the cut is blocked on an EG client existing and `drift.py` being ported to call it. | A consumer test confirms the three files are deleted, `drift.py` calls the EG client for the same data, and the production importers resolve through EG.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 166
    },
    {
      "id": "AU-BOUNDARY-R028.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire `kg/infra/{placement_optimizer,inventory_collector}.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "32bdd70f5ea4"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire `kg/infra/{placement_optimizer,inventory_collector}.py`.** Delete the two modules and the package `__init__.py` that only re-exports them. Corrected: `mcp/tools/analysis_tools.py` is a real production caller (`optimize_from_graph`/`collect_and_persist`), in addition to the test importers. The deletion is blocked on that caller moving to an EG client. | An import census confirms no production or test caller remains after deletion.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 167
    },
    {
      "id": "AU-BOUNDARY-R028.2.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin the `kg/infra` production-importer set",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "32bdd70f5ea4",
        "4a5540dd2e3d"
      ],
      "verified_by": [
        "tests/gates/test_r028x_module_census.py:125"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin the `kg/infra` production-importer set.** A census test records today's one production importer (`mcp/tools/analysis_tools.py`) so the set can only shrink as callers are redirected ahead of `AU-BOUNDARY-R028.2`'s deletion. | `tests/gates/test_r028x_module_census.py::test_r028_2_1_infra_importer_set_has_not_grown` fails on a grown set and passes today.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 168
    },
    {
      "id": "AU-BOUNDARY-R028.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire `kg/quantum/{budget,__init__}.py` and `observability/quantum_trace.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8c6fb318c5d3",
        "8edddc8b0a00"
      ],
      "verified_by": [
        "tests/gates/test_r028_3_r028_4_retirement.py:27"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire `kg/quantum/{budget,__init__}.py` and `observability/quantum_trace.py`.** Delete all three files; none has a production importer, no MCP tool wires `reserve_quantum_budget`/`QuantumBudgetExceeded`/`persist_quantum_job`, and no test file exercises them. | An import census confirms no caller and no test referenced the deleted symbols before removal.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 169
    },
    {
      "id": "AU-BOUNDARY-R028.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire `kg/security/{cognitive_trap_defense,policy_ingestor,graph_validator,rule_ingestor}.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5c70aeb872d9",
        "8c6fb318c5d3",
        "9fec85433f51"
      ],
      "verified_by": [
        "tests/gates/test_r028_3_r028_4_retirement.py:57"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire `kg/security/{cognitive_trap_defense,policy_ingestor,graph_validator,rule_ingestor}.py`.** `cognitive_trap_defense.py` has only a test importer and deletes cleanly. `policy_ingestor.py` and `rule_ingestor.py` are production-imported by `kg/core/engine_ingestion.py`, and `graph_validator.py` by `kg/pipeline/phases/validate.py`, with no EG client equivalent found, so those three remain until EG exposes one. | A consumer test confirms `cognitive_trap_defense.py` is deleted and the remaining three either call an EG client or are reported blocked.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 170
    },
    {
      "id": "AU-BOUNDARY-R028.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire `protocols/enterprise/{__init__,read_models}.py`",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4d0883da01d2"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire `protocols/enterprise/{__init__,read_models}.py`.** Delete both files; only `tests/unit/protocols/enterprise/test_read_models_github_gitlab.py` imports the package, with no production caller (the `read_models` field on `core/frontend_providers.py`'s descriptor is an unrelated same-named attribute, not an import). | An import census confirms no production or test caller remains after deletion.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 171
    },
    {
      "id": "AU-BOUNDARY-R028.6",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire `observability/{trace_ontology,self_ingest,audit_logger}.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "26b087dd3b2f"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire `observability/{trace_ontology,self_ingest,audit_logger}.py`.** Blocked: all three are core, heavily used production primitives (`trace_ontology.trace_id`/`RunTrace`/`ToolCall` alone has over 100 production call sites across orchestration, capabilities, harness and mcp) with no EG client equivalent found; migrating callers is a multi-file rewrite outside one lane. | A consumer test confirms every production call site resolves through an EG client before the AU modules are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 172
    },
    {
      "id": "AU-BOUNDARY-R028.6.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin the `observability/{trace_ontology,self_ingest,audit_logger}` production-importer set",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "26b087dd3b2f",
        "32bdd70f5ea4",
        "4a5540dd2e3d"
      ],
      "verified_by": [
        "tests/gates/test_r028x_module_census.py:136"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin the `observability/{trace_ontology,self_ingest,audit_logger}` production-importer set.** A census test records today's ~49 production importers so the set can only shrink as callers are redirected ahead of `AU-BOUNDARY-R028.6`'s deletion. | `tests/gates/test_r028x_module_census.py::test_r028_6_1_observability_triad_importer_set_has_not_grown` fails on a grown set and passes today.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 173
    },
    {
      "id": "AU-BOUNDARY-R028.7",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire `governance/relational_authority.py` and `.json`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "26b087dd3b2f"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire `governance/relational_authority.py` and `.json`.** Blocked: no Python module imports it outside its own test and `scripts/security/check_relational_authority.py`, but that script is an active fail-closed CI gate auto-discovered by `scripts/security/run_contract_checks.py`'s `check_*.py` glob, documented in `docs/architecture/relational-authority.md`; no EG equivalent exists yet, so retiring it now would remove a live governance gate with nothing to replace it. | A consumer test confirms the EG equivalent gate runs in CI before the AU module, its gate script and the ADR are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 174
    },
    {
      "id": "AU-BOUNDARY-R028.7.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin the `governance/relational_authority` importer set",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "26b087dd3b2f",
        "32bdd70f5ea4",
        "4a5540dd2e3d"
      ],
      "verified_by": [
        "tests/gates/test_r028x_module_census.py:159"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin the `governance/relational_authority` importer set.** A census test records that no module under `agent_utilities/` imports it (the live blocker is `scripts/security/check_relational_authority.py`, outside the package), so the in-package set can only shrink further. | `tests/gates/test_r028x_module_census.py::test_r028_7_1_relational_authority_importer_set_has_not_grown` fails on a grown set and passes today.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 175
    },
    {
      "id": "AU-BOUNDARY-R028.8",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retire `kg/research/placement_mining.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "26b087dd3b2f",
        "32bdd70f5ea4"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retire `kg/research/placement_mining.py`.** Blocked: production-imported by `kg/core/engine_tasks.py` and `mcp/tools/state_tools.py`, with no EG client equivalent found. | A consumer test confirms both production importers resolve through an EG client before the AU module is deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 176
    },
    {
      "id": "AU-BOUNDARY-R028.8.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin the `kg/research/placement_mining` production-importer set",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "26b087dd3b2f",
        "32bdd70f5ea4",
        "4a5540dd2e3d"
      ],
      "verified_by": [
        "tests/gates/test_r028x_module_census.py:171"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin the `kg/research/placement_mining` production-importer set.** A census test records today's six production importers (corrected: also `knowledge_graph/research/candidate_insight.py`, `knowledge_graph/research/loop_controller.py`, and `orchestration/action_policy.py`, beyond the two named in `AU-BOUNDARY-R028.8`) so the set can only shrink. | `tests/gates/test_r028x_module_census.py::test_r028_8_1_placement_mining_importer_set_has_not_grown` fails on a grown set and passes today.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 177
    },
    {
      "id": "AU-BOUNDARY-R029",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move the ontology object model to EG",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "743e98cda405"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r023_r034_relocation_inventory.py:203"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move the ontology object model to EG.** Agent Utilities moves `kg/ontology/**` to the epistemic graph, except the files kept for AU's own semantic typing, the hand-written emitters covered by a separate requirement, and the SDK manifest files. The move includes `object_set`, `property_types`, `derived_properties`, `links`, `functions/**`, `edits/**`, `indexing/**`, `classification_claims`, `permissioning*`, `document_processing`, `schema_graph`, `ops_causal_crosswalk`, `repository_provenance`, `style_lint`, the `*_objects` modules, and `object_path`; `sync_conflict` and `leanix_metamodel` move to the agent connector SDK instead. | Exact source-identity and graph-isomorphism tests against the epistemic graph confirm no AU RDF parser remains after the deletion.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 178
    },
    {
      "id": "AU-BOUNDARY-R030",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move hand-written ontology emitters behind EG pack compilation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "1446fc4c3db5",
        "5e15da9f9e40",
        "743e98cda405",
        "bcdde1ec1a57",
        "c7fc09d3d2f6"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move hand-written ontology emitters behind EG pack compilation.** Agent Utilities puts its hand-written RDF, OWL, and SHACL text emitters behind epistemic graph pack compilation, moving `ontology/value_types`, `ontology/interfaces`, `ontology/manifest_compiler`, `extraction/schema_discovery.py`, `core/ontology_publisher.py`, `scripts/scaffold_ontology_leg.py`, and the declared semantic validation in connector certification. AU keeps only typed declarations, and connector-manifest-to-ontology compilation becomes pack compilation in the epistemic graph. | Conflict tests comparing the typed AU declaration against the generated epistemic-graph artifact confirm equivalence before the emitters are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 179
    },
    {
      "id": "AU-BOUNDARY-R030.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Record what has already landed for the emitter cutover",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Record what has already landed for the emitter cutover.** The SDK half landed as `agent_connector_sdk.manifest.ontology_pack.compile_manifest_ontology`, and AU's compile-before-sync gate (`connector_manifest_gate._compiled_manifest_graph`) already calls it instead of rendering Turtle locally. `agent_utilities/knowledge_graph/ontology/manifest_compiler.py` is not yet deleted because `scripts/generate_connector_manifests.py`, `scripts/update_ontology_lock.py`, `scripts/generate_native_connector_manifest.py`, and `agent_utilities/knowledge_graph/domain_packs/pack_loader.py` still import it directly, and `extraction/schema_discovery.py`, `core/ontology_publisher.py`, and `scripts/scaffold_ontology_leg.py` do not exist yet. | `tests/gates/test_boundary_r036_r047_relocation_census.py` (or an equivalent R030 census) records this importer set so a future edit notices drift.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 180
    },
    {
      "id": "AU-BOUNDARY-R030.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Wire `scripts/generate_connector_manifests.py` off the local manifest compiler",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "6825115f4ac3"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/ontology/test_generate_connector_manifests_uses_sdk_pack.py:34"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Wire `scripts/generate_connector_manifests.py` off the local manifest compiler.** Point its call site at `agent_connector_sdk.manifest.ontology_pack.compile_manifest_ontology` instead of importing `agent_utilities/knowledge_graph/ontology/manifest_compiler.py` directly. | `tests/unit/knowledge_graph/ontology/test_generate_connector_manifests_uses_sdk_pack.py` confirms the script no longer imports the local compiler.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 181
    },
    {
      "id": "AU-BOUNDARY-R030.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Wire `scripts/update_ontology_lock.py` off the local manifest compiler",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "62e0b302ed8e"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/ontology/test_update_ontology_lock_uses_sdk_pack.py:24",
        "tests/unit/knowledge_graph/ontology/test_update_ontology_lock_uses_sdk_pack.py:29"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Wire `scripts/update_ontology_lock.py` off the local manifest compiler.** Point its call site at `agent_connector_sdk.manifest.ontology_pack.compile_manifest_ontology` instead of importing `agent_utilities/knowledge_graph/ontology/manifest_compiler.py` directly. | `tests/unit/knowledge_graph/ontology/test_update_ontology_lock_uses_sdk_pack.py` confirms the script no longer imports the local compiler.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 182
    },
    {
      "id": "AU-BOUNDARY-R030.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Wire `scripts/generate_native_connector_manifest.py` off the local manifest compiler",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c5d1bf3f8286"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/ontology/test_generate_native_connector_manifest_uses_sdk_pack.py:28",
        "tests/unit/knowledge_graph/ontology/test_generate_native_connector_manifest_uses_sdk_pack.py:33"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Wire `scripts/generate_native_connector_manifest.py` off the local manifest compiler.** Point its call site at `agent_connector_sdk.manifest.ontology_pack.compile_manifest_ontology` instead of importing `agent_utilities/knowledge_graph/ontology/manifest_compiler.py` directly. | `tests/unit/knowledge_graph/ontology/test_generate_native_connector_manifest_uses_sdk_pack.py` confirms the script no longer imports the local compiler.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 183
    },
    {
      "id": "AU-BOUNDARY-R030.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Wire `agent_utilities/knowledge_graph/domain_packs/pack_loader.py` off the local manifest compiler",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d93381eba0db"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/domain_packs/test_pack_loader_uses_sdk_pack.py:22",
        "tests/unit/knowledge_graph/domain_packs/test_pack_loader_uses_sdk_pack.py:34"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Wire `agent_utilities/knowledge_graph/domain_packs/pack_loader.py` off the local manifest compiler.** Point its call site at `agent_connector_sdk.manifest.ontology_pack.compile_manifest_ontology` instead of importing `agent_utilities/knowledge_graph/ontology/manifest_compiler.py` directly. | `tests/unit/knowledge_graph/domain_packs/test_pack_loader_uses_sdk_pack.py` confirms the loader no longer imports the local compiler.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 184
    },
    {
      "id": "AU-BOUNDARY-R030.6",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/ontology/manifest_compiler.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c4c654815738"
      ],
      "verified_by": [
        "tests/gates/test_au_boundary_r030_6_deleted.py:16"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete `agent_utilities/knowledge_graph/ontology/manifest_compiler.py`.** Remove the module once `AU-BOUNDARY-R030.2`\u2013`R030.5` leave it with zero importers. | An import census confirms no production or test caller remains before the file is deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 185
    },
    {
      "id": "AU-BOUNDARY-R030.7",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Add `agent_utilities/knowledge_graph/core/ontology_publisher.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c0dc104b77a9"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/core/test_ontology_publisher.py:22",
        "tests/unit/knowledge_graph/core/test_ontology_publisher.py:31"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Add `agent_utilities/knowledge_graph/core/ontology_publisher.py`.** Add the typed AU declaration publisher that feeds the epistemic graph's pack compiler, replacing the hand-written emitter path. | `tests/unit/knowledge_graph/core/test_ontology_publisher.py` exercises the publisher against a fixture declaration.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 186
    },
    {
      "id": "AU-BOUNDARY-R031",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Replace AU's graph-schema DTOs with EG-generated types",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "743e98cda405"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r023_r034_relocation_inventory.py:204"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Replace AU's graph-schema DTOs with EG-generated types.** Agent Utilities replaces `models/knowledge_graph`, `models/schema_definition`, `models/evidence_bundle`, `models/knowledge_pack`, `models/codemap`, `models/graph`, `models/knowledge_base`, `models/schema_pack*`, and `models/schema_packs/**` with epistemic-graph-generated types. `kg/domain_packs/**` is moved once the shared pack loader has been cut over to the generated types. | Exact contract-digest checks and unknown-field rejection tests confirm no hand-copied model remains after the DTOs are replaced.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 191
    },
    {
      "id": "AU-BOUNDARY-R032",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Delete AU's legacy SPARQL backend and setup path",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "743e98cda405",
        "a05257fb6541"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Delete AU's legacy SPARQL backend and setup path.** Agent Utilities deletes `kg/backends/sparql/**`, `kg/setup/**`, the `setup-databases` script, and `kg/integrations/stardog_sync` and `kg/integrations/sparql_ingestor`, because the external SPARQL stores they target are already legacy and unaffected by AU's broader federation work. | Tests confirming no runtime or command line caller remains, and that a typed unavailable response is returned for the removed path, gate the deletion.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 192
    },
    {
      "id": "AU-BOUNDARY-R033",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move external graph and database federation to EG",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "743e98cda405"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r023_r034_relocation_inventory.py:205"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move external graph and database federation to EG.** Agent Utilities moves all of its remaining external graph and database backends into the epistemic graph as federation and mirror targets, including `fanout_backend`, `postgresql_backend`, `cypher_transpiler`, `age_backend`, `contrib/**`, `mirror_target`, `outbox`, `brain_guarded_backend`, `trino_backend`, and `spark_jobs`. None of these backends are deleted outright; each becomes a federated source reachable through the epistemic graph. | Scoped foreign-source query tests and a fail-closed outage test against the epistemic graph's federation path confirm parity before the AU backends are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 193
    },
    {
      "id": "AU-BOUNDARY-R034",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move retrieval engines to EG",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "743e98cda405"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r023_r034_relocation_inventory.py:206"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move retrieval engines to EG.** Agent Utilities moves its retrieval engines to the epistemic graph, including `kg/retrieval/hybrid_retriever`, `kg/retrieval/semantic_retrieval_engine`, `kg/retrieval/neural_reranker`, `kg/retrieval/hierarchical_document_retriever`, `kg/retrieval/memory_retriever`, `kg/retrieval/code_context`, `kg/retrieval/code_metrics`, `kg/retrieval/graph_engineering`, `kg/retrieval/analytics_job_registry`, `kg/retrieval/temporal_semantic_id`, `kg/retrieval/embedding_versioning`, `kg/retrieval/generative_recommender`, `kg/retrieval/iterative_expansion`, `kg/retrieval/lineage`, `kg/retrieval/direct_corpus`, `kg/retrieval/latent_topology_rag`, `kg/retrieval/reasoning_reranker`, `kg/retrieval/autocut`, `kg/neural/**`, and `kg/search/**`. AU retains context compilation and the capability index. | Same-snapshot tenant and source proofs plus cited-ranking parity tests against the epistemic graph confirm equivalence before the retrieval modules are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 194
    },
    {
      "id": "AU-BOUNDARY-R035",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Re-home the schema-drift package before it lands",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5e15da9f9e40",
        "bcfbc23cd1e6",
        "c7fc09d3d2f6"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Re-home the schema-drift package before it lands.** Agent Utilities places the schema-drift gate, shape, classify, and report steps in the agent connector SDK's connector-sync runner, running between drain and apply. AU moves `candidate.py`'s SHACL rendering, `contract_store`, and `activation` to the epistemic graph rather than keeping them in AU. | A quarantine test showing no cursor advance on a rejected candidate, paired with an approved-activation test, confirms the moved behavior before the AU-side SHACL rendering is deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 195
    },
    {
      "id": "AU-BOUNDARY-R036",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move the usage fact store to EG",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d",
        "8ea6bd529b0f"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move the usage fact store to EG.** Agent Utilities moves `usage/**` off its local SQLite and SQL analytics store so that usage becomes durable, tenant-scoped facts with provenance in the epistemic graph; AU only emits usage events, and graph-os's usage API reads from the epistemic graph. | Restart tests, tenant-scoped read tests, and a duplicate-event test against the epistemic graph's usage facts confirm durability before the AU store is deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 196
    },
    {
      "id": "AU-BOUNDARY-R036.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin the usage-store relocation inventory",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin the usage-store relocation inventory.** A typed, parametrized census test records the AU `usage/` paths pending move to the epistemic graph's usage facts (`usage/backend.py`, `usage/authorization.py`, `usage/backends`), so the set is provable from AU's side before deletion. | `tests/gates/test_boundary_r036_r047_relocation_census.py::test_inventoried_relocation_still_present` fails if a listed path disappears without this inventory being updated in the same change.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 197
    },
    {
      "id": "AU-BOUNDARY-R037",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move development-governance tooling to repository-manager",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move development-governance tooling to repository-manager.** Agent Utilities moves its development-governance modules, including merge-queue sequencing, concept-reservation tracking, and related coordination code, out of `governance/**` and into `agents/repository-manager`, since repository-manager's commit and task-queue code are the only consumers. | Recovery testing of an interrupted merge-queue operation, plus a check that zero AU governance import remains, confirms the move before the AU modules are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 198
    },
    {
      "id": "AU-BOUNDARY-R037.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin the governance-tooling relocation inventory",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin the governance-tooling relocation inventory.** A typed, parametrized census test records the AU `governance/` modules pending move to repository-manager (`concept_allocator.py`, `concept_hierarchy.py`, `concept_lineage.py`), so the set is provable from AU's side before deletion. | `tests/gates/test_boundary_r036_r047_relocation_census.py::test_inventoried_relocation_still_present` fails if a listed path disappears without this inventory being updated in the same change.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 199
    },
    {
      "id": "AU-BOUNDARY-R038",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Add a cross-owner component registry and path guard",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8821aee3c37f",
        "aa5eba73e0f7"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Add a cross-owner component registry and path guard.** Agent Utilities adds graph-os and SDK boundary seeds, plus owner manifests, to `architecture/component-registry*`, closing the coverage gaps left by the existing AU and EG seams. AU adds a generated gate that fails when AU declares a console script whose module belongs to graph-os, or when new AU code lands outside an AU-owned destination path. | A hermetic test using public checkout fixtures and no live service shows the new gate rejects a wrong-owner module or script addition.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 200
    },
    {
      "id": "AU-BOUNDARY-R039",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move front ends off AU internals",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move front ends off AU internals.** Agent Utilities ensures that the front ends layered on top of it, a web UI, a chat assistant front end, and a terminal UI, import only `agent_utilities.api`, graph-os, or the epistemic graph client, with no direct import of AU internals. This folds into the graph-os web UI's broader rebrand. | An import census across each front end plus an end-to-end user route exercised against the rebranded web UI confirm no AU-internal import remains.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 201
    },
    {
      "id": "AU-BOUNDARY-R039.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin AU's public front-end import surface",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin AU's public front-end import surface.** A typed, parametrized census test records the `agent_utilities/api/` modules external front ends (web UI, chat front end, terminal UI) are allowed to import, so a shrink of that surface is caught on the AU side before the front-end import census goes stale. | `tests/gates/test_boundary_r036_r047_relocation_census.py::test_front_end_surface_module_still_present` fails if a listed surface module disappears without the front-end import census being updated in the same change.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 202
    },
    {
      "id": "AU-BOUNDARY-R040",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move agent memory and the learning engine to EG",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move agent memory and the learning engine to EG.** Agent Utilities moves `knowledge_graph/memory/**`, except `timeseries/`, entirely into the epistemic graph: agent memory, the learning engine, reinforcement-learning memory, and the media store. AU becomes a thin epistemic-graph client for agent-run memory, and `media_store` becomes a thin client as well. | A trusted-migration-and-quarantine test, plus a scoped read and a restart test against the epistemic graph's memory store, confirm durability before the AU modules are deleted.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 203
    },
    {
      "id": "AU-BOUNDARY-R040.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin the agent-memory relocation inventory",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin the agent-memory relocation inventory.** A typed, parametrized census test records the AU `knowledge_graph/memory/` paths pending move to the epistemic graph (`agent_context.py`, `learning_engine.py`, `memory_engine.py`, `rlm_memory.py`, `media_store.py`, `distillation.py`, `lifecycle.py`, `observer.py`), so the set is provable from AU's side before deletion. | `tests/gates/test_boundary_r036_r047_relocation_census.py::test_inventoried_relocation_still_present` fails if a listed path disappears without this inventory being updated in the same change.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 204
    },
    {
      "id": "AU-BOUNDARY-R041",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Finance modules that produced fabricated data are removed",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "dbe24ea1b0d3"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Finance modules that produced fabricated data are removed.** agent-utilities does not retain trade_journal, the strategy_export, strategy_sharing, and strategy_engine modules, streaming, market_feeds, market_data, crypto_connector, exchange_bridge, banking and its models, payments, `knowledge_graph/core/quant_tasks.py`, the candle rule sets, the credit dividend and Merton-KMV specifics, the sentiment lexicon, or the copy-trade gating and exit rules, because they produced fabricated data such as synthetic prediction-market prices, mock exchange fills, and a fixed Sharpe ratio. | A repository import census confirms none of these modules exist in agent-utilities and that no caller references them.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 205
    },
    {
      "id": "AU-BOUNDARY-R042",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Every package directory has one recorded disposition",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "2456745c1e4d",
        "29d80148b462",
        "8821aee3c37f",
        "a4079bc8d2ed"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Every package directory has one recorded disposition.** Each directory in the top two levels under `agent_utilities/` has exactly one row in the deletion and relocation inventory in `coverage.md`, stating keep, delete, or relocate with the destination repository, and no row is undecided. A repository check fails when a directory exists without a row or a row names a path that is not in the tree. | A tree-versus-inventory test fails on an unlisted directory, an undecided row, or a stale path.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 206
    },
    {
      "id": "AU-BOUNDARY-R043",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Retained agent surface is declared and import-bounded",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8a45ab8013ad",
        "fdeabad709b3"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Retained agent surface is declared and import-bounded.** The inventory names the packages Agent Utilities keeps as its agent library \u2014 agent execution and orchestration (`agent/`, `graph/`, `capabilities/`, `patterns/`, `workflows/`, `tools/`, `core/checkpoint/`, `core/execution/`), evaluation and self-improvement (`harness/`, `measurement/`, `rlm/`), runtime and developer tooling (`runtime/`, `cli/`, `claude_harness/`, `integrations/`, `analysis/`, `agent_chat/`), and prompts, pricing and policy data (`prompts/`, `prompting/`, `pricing/`, `policies/`) \u2014 or assigns any of them elsewhere. Retained packages import the engine only through its public client and contain no serving, storage, or graph-compute implementation. | An import-boundary test over the retained packages rejects engine-internal, storage, and serving imports.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 207
    },
    {
      "id": "AU-BOUNDARY-R044",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Fleet, scaling and deployment modules leave orchestration",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Fleet, scaling and deployment modules leave orchestration.** The fleet reconciler, autoscaler, scaling-authority, and deploy-watch modules in `orchestration/` receive an explicit owner in the inventory; fleet, scaling, and deployment behavior is served by graph-os and does not remain in Agent Utilities, while the agent runner and its planning code stay. Callers use the graph-os operation or the retained runner, never a moved module. | A caller census finds no Agent Utilities import of a moved fleet, scaling, or deployment module, and graph-os consumer tests cover the moved behavior.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 208
    },
    {
      "id": "AU-BOUNDARY-R044.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin the orchestration relocation inventory",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin the orchestration relocation inventory.** A typed, parametrized census test records the AU `orchestration/` modules pending move to graph-os (`agent_activation.py`, `agent_digital_twin.py`, `action_policy.py`), so the set is provable from AU's side before deletion, while the agent runner and its planning code stay out of this inventory. | `tests/gates/test_boundary_r036_r047_relocation_census.py::test_inventoried_relocation_still_present` fails if a listed path disappears without this inventory being updated in the same change.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 209
    },
    {
      "id": "AU-BOUNDARY-R045",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Unplaced knowledge-graph packages receive file-level owners",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Unplaced knowledge-graph packages receive file-level owners.** `knowledge_graph/distillation/`, `adaptation/`, `pipeline/`, `search_synthesis/`, `shapes/`, and `live_artifacts/` each receive a disposition, and the partly covered packages `retrieval/`, `research/`, `core/`, `enrichment/`, `extraction/`, `kb/`, `ingestion/`, `backends/`, `domain_packs/`, `orchestration/`, `ontology/`, and the files directly under `knowledge_graph/` list every file with its owner. Model-backed extraction, research, and retrieval-planning code that Agent Utilities keeps is named by path; everything else moves to the engine or the connector SDK or is deleted. | The inventory check confirms every tracked file under `knowledge_graph/` maps to exactly one owner, and parity tests cover each moved or deleted module.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 210
    },
    {
      "id": "AU-BOUNDARY-R045.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin the unplaced knowledge_graph package relocation inventory",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin the unplaced knowledge_graph package relocation inventory.** A typed, parametrized census test records the AU `knowledge_graph/` packages pending move to the epistemic graph (`distillation`, `adaptation`, `pipeline`, `search_synthesis`, `shapes`, `live_artifacts`), so the set is provable from AU's side before the file-level owner audit in this row's main acceptance criterion runs. | `tests/gates/test_boundary_r036_r047_relocation_census.py::test_inventoried_relocation_still_present` fails if a listed path disappears without this inventory being updated in the same change.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 211
    },
    {
      "id": "AU-BOUNDARY-R046",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Partly covered packages list every file with its owner",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Partly covered packages list every file with its owner.** `observability/`, `core/`, `core/registry/`, `messaging/`, `messaging/backends/`, `security/`, `skills/`, `models/`, `mcp/`, `ecosystem/`, `automation/`, `sdd/`, `domains/finance/`, and the top-level modules of `agent_utilities/` list every file with keep, delete, or relocate and the destination, replacing descriptions such as \u201cthe duplicated modules\u201d with exact paths. | The inventory check confirms no tracked file in these packages lacks an owner and no requirement refers to them only by description.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 212
    },
    {
      "id": "AU-BOUNDARY-R047",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Engine-facing adapters and caches are thin clients or removed",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d",
        "fed30c0982ae"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Engine-facing adapters and caches are thin clients or removed.** `kvcache/`, `numeric/`, `caching/`, and `media/` either become thin clients over the engine's public interface or are deleted as duplicates of engine behavior; none keeps its own durable store, numeric kernel, or cache authority. | Differential tests against the engine show equal results for retained adapters, and a census shows no second store or kernel implementation.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 213
    },
    {
      "id": "AU-BOUNDARY-R047.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Pin the engine-facing-adapter relocation inventory",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "795afc53f54d"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Pin the engine-facing-adapter relocation inventory.** A typed, parametrized census test records the AU `kvcache/`, `numeric/`, `caching/`, and `media/` packages pending the thin-client cutover against the epistemic graph's public interface, so the set is provable from AU's side before deletion or conversion. | `tests/gates/test_boundary_r036_r047_relocation_census.py::test_inventoried_relocation_still_present` fails if a listed path disappears without this inventory being updated in the same change.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 214
    },
    {
      "id": "AU-BOUNDARY-R048",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Domain models, shapes, assets and skill content are placed",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "49b087cb97e4",
        "fca0c5ee42b3"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Domain models, shapes, assets and skill content are placed.** The domain packages (`domains/government/`, `domains/hr/`, `domains/law/`, `domains/medical/`, `models/domains/`) relocate to the epistemic graph as typed domain packs and are then deleted from Agent Utilities; the MCP tool in `mcp/tools/analysis_tools.py` that reads the HR workforce models moves separately to graph-os with MCP tool hosting. `ontology/shapes/`, `images/`, `data/`, `protocols/voice_supply_chain/`, and the skill-content directories under `skills/` each receive an owner: kept as agent content, published as engine packs, moved to the shared skills repository, or deleted. | The inventory check shows each directory placed, and pack or skill validation passes in the receiving repository.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 215
    },
    {
      "id": "AU-BOUNDARY-R048.1",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "`images/` is already relocated",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "635f38f64aca"
      ],
      "verified_by": [
        "tests/gates/test_boundary_r010_r048_landed_records.py:18"
      ],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**`images/` is already relocated.** `agent_utilities/images/` no longer exists on `origin/main`; it has already been deleted/relocated, closing that one directory of `AU-BOUNDARY-R048`. | `git ls-tree -r origin/main -- agent_utilities/images` returns empty.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 216
    },
    {
      "id": "AU-BOUNDARY-R048.2",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Relocate `domains/government/`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Relocate `domains/government/`.** Move `agent_utilities/domains/government/` to its epistemic-graph domain pack and delete it from Agent Utilities, fixing any importer left pointing at the old path. | A census test shows no remaining `agent_utilities/domains/government/` path and no AU import of it.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 217
    },
    {
      "id": "AU-BOUNDARY-R048.3",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Relocate `domains/hr/`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Relocate `domains/hr/`.** Move `agent_utilities/domains/hr/` to its epistemic-graph domain pack and delete it from Agent Utilities, fixing any importer left pointing at the old path. | A census test shows no remaining `agent_utilities/domains/hr/` path and no AU import of it.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 218
    },
    {
      "id": "AU-BOUNDARY-R048.4",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Relocate `domains/law/`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Relocate `domains/law/`.** Move `agent_utilities/domains/law/` to its epistemic-graph domain pack and delete it from Agent Utilities, fixing any importer left pointing at the old path. | A census test shows no remaining `agent_utilities/domains/law/` path and no AU import of it.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 219
    },
    {
      "id": "AU-BOUNDARY-R048.5",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Relocate `domains/medical/`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Relocate `domains/medical/`.** Move `agent_utilities/domains/medical/` to its epistemic-graph domain pack and delete it from Agent Utilities, fixing any importer left pointing at the old path. | A census test shows no remaining `agent_utilities/domains/medical/` path and no AU import of it.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 220
    },
    {
      "id": "AU-BOUNDARY-R048.6",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Relocate `models/domains/`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Relocate `models/domains/`.** Move `agent_utilities/models/domains/` to its epistemic-graph domain pack and delete it from Agent Utilities, fixing any importer left pointing at the old path. | A census test shows no remaining `agent_utilities/models/domains/` path and no AU import of it.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 221
    },
    {
      "id": "AU-BOUNDARY-R048.7",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Move the HR workforce MCP tool to graph-os",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Move the HR workforce MCP tool to graph-os.** `agent_utilities/mcp/tools/analysis_tools.py`, which reads HR workforce models, moves to graph-os with MCP tool hosting and is deleted from Agent Utilities. | A census test shows `agent_utilities/mcp/tools/analysis_tools.py` no longer exists and graph-os serves the equivalent tool.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 222
    },
    {
      "id": "AU-BOUNDARY-R048.8",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Assign an owner to `ontology/shapes/`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Assign an owner to `ontology/shapes/`.** `agent_utilities/ontology/shapes/` is kept as agent content, published as an engine pack, moved to the shared skills repository, or deleted \u2014 one disposition is recorded and acted on. | The inventory check shows `ontology/shapes/` has one recorded disposition and the directory matches it.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 223
    },
    {
      "id": "AU-BOUNDARY-R048.9",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Assign an owner to `data/`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Assign an owner to `data/`.** `agent_utilities/data/` is kept as agent content, published as an engine pack, moved to the shared skills repository, or deleted \u2014 one disposition is recorded and acted on. | The inventory check shows `data/` has one recorded disposition and the directory matches it.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 224
    },
    {
      "id": "AU-BOUNDARY-R048.10",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Assign an owner to `protocols/voice_supply_chain/`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Assign an owner to `protocols/voice_supply_chain/`.** `agent_utilities/protocols/voice_supply_chain/` is kept as agent content, published as an engine pack, moved to the shared skills repository, or deleted \u2014 one disposition is recorded and acted on. | The inventory check shows `protocols/voice_supply_chain/` has one recorded disposition and the directory matches it.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 225
    },
    {
      "id": "AU-BOUNDARY-R048.11",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Assign an owner to the skill-content directories under `skills/`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Assign an owner to the skill-content directories under `skills/`.** Each skill-content directory under `agent_utilities/skills/` is kept as agent content, published as an engine pack, moved to the shared skills repository, or deleted \u2014 one disposition per directory is recorded and acted on. | The inventory check shows every `skills/` content directory has one recorded disposition and pack/skill validation passes in the receiving repository where relocated.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 226
    },
    {
      "id": "AU-BOUNDARY-R049",
      "kind": "requirement",
      "parent": "AU-BOUNDARY",
      "source": "specs/au-boundary-deconstruction/status.json",
      "title": "Every AU write-back sink runs through the SDK governed write-back contract",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "00234474001c",
        "0e44186eac39"
      ],
      "verified_by": [],
      "parent_title": "AU-BOUNDARY \u2014 AU boundary deconstruction",
      "definition": "**Every AU write-back sink runs through the SDK governed write-back contract.** `run_writeback` builds one canonical SDK `SourceChangeSet` per sink invocation. It runs that change set through `DurableWritableConnector`, with each AU sink wrapped as a `WriteBackTransport`. The SDK validates the digest, expiry, field scope, base version and authorization before a live sink call. A live apply reserves an audit record and appends its attempt to a durable `WriteBackLedger`. A sink failure during apply is recorded as an uncertain outcome. `graph_writeback` and every other `run_writeback` caller reach sinks only through this path. `dry_run=True` stays the default, and the per-sink enable flag stays fail-closed. This is the first step of AU-BOUNDARY-R026; the sinks move to SDK packs later. | `tests/unit/knowledge_graph/enrichment/test_writeback_governed.py` proves the dry-run route and the applied and uncertain receipts. It also proves SDK refusal before the sink for denied authorization and a stale version. The existing write-back suites pass unchanged.",
      "definition_source": "specs/au-boundary-deconstruction/requirements.md",
      "definition_line": 227
    },
    {
      "id": "AU-QUAL",
      "kind": "spec",
      "parent": null,
      "source": "specs/au-boundary-quality/status.json",
      "title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/au-boundary-quality/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/au-boundary-quality/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": ".config/pre-commit.yaml",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/.config/pre-commit.yaml"
        },
        {
          "declared_in": "specs/au-boundary-quality/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/capabilities/kg_audit_sink.py:385",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/capabilities/kg_audit_sink.py#L385"
        },
        {
          "declared_in": "specs/au-boundary-quality/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/harness/red_team.py:44",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/harness/red_team.py#L44"
        },
        {
          "declared_in": "specs/au-boundary-quality/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/harness/reliability_scorers.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/harness/reliability_scorers.py"
        },
        {
          "declared_in": "specs/au-boundary-quality/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/mcp/harness_server.py:574",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/mcp/harness_server.py#L574"
        },
        {
          "declared_in": "specs/au-boundary-quality/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/check_liveness.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/check_liveness.py"
        },
        {
          "declared_in": "specs/au-boundary-quality/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/liveness_deferred.tsv",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/liveness_deferred.tsv"
        },
        {
          "declared_in": "specs/au-boundary-quality/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/uv_workspace.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/uv_workspace.py"
        },
        {
          "declared_in": "specs/au-boundary-quality/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/integration/profiles/test_profile_tiny_zero_dep.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/tests/integration/profiles/test_profile_tiny_zero_dep.py"
        },
        {
          "declared_in": "specs/au-boundary-quality/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/unit/mcp/test_graphos_bootstrap_isolation.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/tests/unit/mcp/test_graphos_bootstrap_isolation.py"
        },
        {
          "declared_in": "specs/au-boundary-quality/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-quality/requirements.md"
        },
        {
          "declared_in": "specs/au-boundary-quality/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-quality/status.json"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "AU-QUAL-R001",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Liveness deferrals fail visibly when they expire",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c15d278239d3"
      ],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Liveness deferrals fail visibly when they expire.** Every liveness deferral in agent-utilities carries a visible owner and review date, and an expired deferral fails a deterministic hosted or scheduled check with a clear message rather than aging unnoticed. The guardrail-liveness gate enforces this on every entry. | A time-frozen unit test advances past a deferral's review date and confirms the scheduled check fails with an actionable message.",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-QUAL-R002",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Tiny-profile RBAC and bootstrap-isolation tests cover real code",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "ce632099b6b9"
      ],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Tiny-profile RBAC and bootstrap-isolation tests cover real code.** The tiny profile's gateway test asserts that a disallowed write is denied under zero-container serving. The bootstrap-isolation tests patch the actual public seams in agent-utilities' MCP bootstrap module rather than functions that no longer exist. Evidence resolves the liveness deferrals for formal_reasoning_core.py and models/knowledge_graph.py. Nobody extends them again. | The named test suite passes against the current gateway and bootstrap code. Both named liveness deferrals show a resolved, evidenced status.",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-QUAL-R003",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Connector validation uses EG's composed GraphSchema",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "50f312aeb06c",
        "c62dfed3c869"
      ],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Connector validation uses EG's composed GraphSchema.** Connector validation in agent-utilities validates incoming data against epistemic-graph's composed GraphSchema and returns typed errors. It never loads or treats agent-utilities' own SHACL shapes pack as the source of schema authority. | A contract test confirms connector validation calls the composed GraphSchema and that no AU-owned shapes pack is consulted during validation.",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-QUAL-R004",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Named AU test failures are fixed, not skipped",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "0fa2df86ace4",
        "4771f8a9ee09",
        "576cf41ee890"
      ],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Named AU test failures are fixed, not skipped.** agent-utilities fixes its placement-mining, trace-miner, claim-flywheel, policy-drift, ingestion, and observability test failures with causal tests rather than skips. Widget tests that need connector packages have those packages declared and provisioned rather than skipped, and the assimilation-benchmark tests pass with seeded randomness after the numpy-to-epistemic-graph random-number-generator move. | The full named test list runs green in continuous integration with no skip markers added to mask a failure.",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-QUAL-R005",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Test files are included in mypy with real fixes",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "d9d7cc7b59c0",
        "ed6485573f1e"
      ],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Test files are included in mypy with real fixes.** agent-utilities' mypy configuration includes tests/ rather than excluding it, and every reported error is resolved with a correct type rather than a new type: ignore comment, an Any cast, or an additional exclusion. Errors are worked through in small, owned source-directory batches until the exclusion is fully removed. | A mypy configuration diff confirms the test exclusion is removed and a clean mypy run covers all test files with zero new ignores.",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-QUAL-R005.1",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Remaining scope of AU-QUAL-R005 (slice .1): Test files are included in mypy with real fixes",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "f25a287bac6c"
      ],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Remaining scope of AU-QUAL-R005 (slice .1): Test files are included in mypy with real fixes.** Child slice of `AU-QUAL-R005` (see tasks.md). | A mypy configuration diff confirms the test exclusion is removed and a clean mypy run covers all test files with zero new ignores",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-QUAL-R005.2",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Remaining scope of AU-QUAL-R005 (slice .2): Test files are included in mypy with real fixes",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d9d7cc7b59c0"
      ],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Remaining scope of AU-QUAL-R005 (slice .2): Test files are included in mypy with real fixes.** Child slice of `AU-QUAL-R005` (see tasks.md). | A mypy configuration diff confirms the test exclusion is removed and a clean mypy run covers all test files with zero new ignores",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-QUAL-R005.2.1",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Per-directory grandchild slice of AU-QUAL-R005.2 \u2014 `tests/unit/patterns/`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d9d7cc7b59c0"
      ],
      "verified_by": [
        "tests/unit/quality/test_mypy_config_includes_patterns_dir.py:33",
        "tests/unit/quality/test_mypy_config_includes_patterns_dir.py:41"
      ],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Per-directory grandchild slice of AU-QUAL-R005.2 \u2014 `tests/unit/patterns/`.** The mypy pre-commit hook's exclusion is narrowed so `tests/unit/patterns/` is included in mypy coverage, and any real type errors mypy reports there are fixed with a correct type rather than an ignore, an `Any` cast, or a further exclusion. Remaining test directories are tracked as further `AU-QUAL-R005.2.n` grandchildren in tasks.md. | The mypy pre-commit hook's `exclude` regex no longer matches `tests/unit/patterns/`, and a mypy run against that directory reports zero errors with zero new ignores.",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-QUAL-R006",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "A privacy check covers the final tree and commit history",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0fa2df86ace4",
        "4a5540dd2e3d",
        "576cf41ee890"
      ],
      "verified_by": [
        "tests/gates/test_tracked_privacy_commit_history.py:112",
        "tests/gates/test_tracked_privacy_commit_history.py:88"
      ],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**A privacy check covers the final tree and commit history.** Before code reaches a public remote, agent-utilities runs a privacy check across the complete working tree and every commit message, confirming no credential, private path, or internal identifier is present. | The privacy check runs as a required gate and fails the build when it finds a disallowed pattern in tracked content or commit messages.",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-QUAL-R007",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Liveness placeholder detector ignores documentation prose",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a5540dd2e3d",
        "f93efd64d001"
      ],
      "verified_by": [
        "tests/gates/test_liveness_analyzer_compat.py:163",
        "tests/gates/test_liveness_analyzer_compat.py:174"
      ],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Liveness placeholder detector ignores documentation prose.** The guardrail-liveness placeholder detector does not flag a trigger phrase that appears in a docstring or comment describing an accurate, documented design decision; it flags only code bodies whose only substantive content is an unimplemented placeholder. | A regression test feeds the detector a prose docstring containing a trigger phrase and confirms no false-positive finding is raised, alongside a true-positive case that still fails.",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-QUAL-R008",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Liveness reconciler rescues exact service-registry targets",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cf1cdce6a6e4",
        "eb077e60c21b"
      ],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Liveness reconciler rescues exact service-registry targets.** The liveness reconciler reads the literal `_SERVICE_DEFINITIONS` registry without importing services. It rescues only the effective target for each capability; a later row replaces an earlier one. A nonliteral registry, a malformed row, or an unrelated dictionary rescues nothing. | Fixture tests confirm last-row-wins rescue and no rescue for a nonliteral registry. A parity test compares the static targets with real registry dispatch.",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-QUAL-R009",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Red-team runs follow the received probe sequence and emit trace events, and abstain without a scorer verdict",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Red-team runs follow the received probe sequence and emit trace events, and abstain without a scorer verdict.** agent-utilities runs the probe sequence it receives and emits each attack, transform and scorer verdict as trace events. A run with no received scorer verdict reports abstention and never pass. [arXiv:2605.04019] | `See children `AU-QUAL-R009.1` to `AU-QUAL-R009.6`.`",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-QUAL-R009.1",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Model.** `ProbeResult` at `agent_utilities/harness/red_team.py:44` gains `transform`, `scorer_id` and a received `verdict`. EG-DECISION-ENGINE-R138 produces the attack, transform and scorer records and the verdict. GRAPHOS-OPS carries them to the harness. The optional engine `ProbeVerdict` retains `resisted`, `compromised` or `inconclusive` unchanged. Separate local `execution_status` values are `completed` and `abstained`; `abstained` is never a scoring verdict. `RedTeamReport` (`red_team.py:56`) counts execution abstentions separately. | `tests/unit/harness/test_red_team_evidence.py::test_probe_result_verdict_fields`",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-QUAL-R009.2",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Behavior.** `RedTeamRunner.assess` (`red_team.py:149`) must run the given probes in order. Without a received verdict, it records `execution_status=abstained`, reason `no_scorer_verdict` and no verdict. A target error records reason `probe_execution_failed` without inventing a verdict. Defense-rate counts exclude execution abstentions and engine `inconclusive` verdicts. | `tests/unit/harness/test_red_team_evidence.py::test_no_scorer_abstains`",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 18
    },
    {
      "id": "AU-QUAL-R009.3",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Wiring.** `red_team_assess` (`agent_utilities/mcp/harness_server.py:574`) must emit the events through the audit sink record at `capabilities/kg_audit_sink.py:385`. `RedTeamRunner.run` (`red_team.py:175`) has no production caller today; this row creates the call site in the same tool. | `tests/unit/harness/test_red_team_evidence.py::test_assess_writes_trace_evidence`",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 19
    },
    {
      "id": "AU-QUAL-R009.4",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Refusal.** A run without received verdicts records an execution abstention with reason `no_scorer_verdict`. Without conclusive engine verdicts, the defense rate stays absent. Missing scores and execution failures must never become `resisted` or `compromised`. | `tests/unit/harness/test_red_team_evidence.py::test_all_abstained_is_not_pass`",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 20
    },
    {
      "id": "AU-QUAL-R009.5",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Evidence.** Each probe emits the attack, transform and scorer identifiers plus the response digest. Separate trace fields carry the unchanged optional engine verdict, execution status and reason. A second run with the same inputs must emit equal events. | `tests/unit/harness/test_red_team_evidence.py::test_evidence_reproduces`",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 21
    },
    {
      "id": "AU-QUAL-R009.6",
      "kind": "requirement",
      "parent": "AU-QUAL",
      "source": "specs/au-boundary-quality/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-QUAL \u2014 Reproducible AU boundary and quality gates",
      "definition": "**Hot-path proof.** The entry point is the served `red_team_assess` operation. Each received engine verdict must trace unchanged, including `inconclusive`. Missing verdicts and target errors must trace execution abstentions with no fabricated verdict. Test path: `tests/integration/test_red_team_assess_served.py`. | `tests/integration/test_red_team_assess_served.py::test_served_assess_records_evidence`",
      "definition_source": "specs/au-boundary-quality/requirements.md",
      "definition_line": 22
    },
    {
      "id": "AU-DEV",
      "kind": "spec",
      "parent": null,
      "source": "specs/au-developer-environment/status.json",
      "title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/au-developer-environment/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/au-developer-environment/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-developer-environment/requirements.md"
        },
        {
          "declared_in": "specs/au-developer-environment/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/uv_workspace.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/uv_workspace.py"
        },
        {
          "declared_in": "specs/au-developer-environment/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-developer-environment/status.json"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "AU-DEV-R001",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "A development skill documents AU's contribution workflow",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "ed6485573f1e"
      ],
      "verified_by": [],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**A development skill documents AU's contribution workflow.** agent-utilities provides and keeps current a development skill that documents its architecture boundaries, supported build hosts, quality gates, contract regeneration, and identity setup, alongside equivalent per-repository skills for epistemic-graph, graph-os, and the connector SDK. Each repository's AGENTS.md is trimmed to navigation and a pointer into its development skill. | A skill-content check confirms each listed development skill documents the required topics and that no AGENTS.md duplicates that content.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-DEV-R001.1",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "typed DevelopmentSkillTopicInventory model (agent_utilities/skills/dev_skill_topics.py) that refuses a skill missing any required topic, plus its refusal test (",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c48cba9d3f95",
        "f25a287bac6c"
      ],
      "verified_by": [],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**typed DevelopmentSkillTopicInventory model (agent_utilities/skills/dev_skill_topics.py) that refuses a skill missing any required topic, plus its refusal test (.** Child slice of `AU-DEV-R001` (see tasks.md). | A skill-content check confirms each listed development skill documents the required topics and that no AGENTS.md duplicates that content",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-DEV-R001.2",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "The real agent-utilities-development skill declares every `DevelopmentSkillTopicInventory` required topic",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c48cba9d3f95"
      ],
      "verified_by": [
        "tests/unit/skills/test_dev_skill_topics_audit.py:35"
      ],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**The real agent-utilities-development skill declares every `DevelopmentSkillTopicInventory` required topic.** Applies the AU-DEV-R001.1 model to the checked-in `agent-utilities-development` SKILL.md (not a synthetic fixture). Auditing the sibling epistemic-graph/graph-os/connector-sdk skills and trimming each repository's AGENTS.md remain `AU-DEV-R001.3+`. | `tests/unit/skills/test_dev_skill_topics_audit.py` builds `DevelopmentSkillTopicInventory` from the real SKILL.md's declared topics and asserts it does not refuse.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-DEV-R001.3",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "Audit the sibling development skills and trim each AGENTS.md",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**Audit the sibling development skills and trim each AGENTS.md.** Remaining scope of `AU-DEV-R001` after `.2`: apply the `DevelopmentSkillTopicInventory` audit to the epistemic-graph, graph-os and agent-connector-sdk development skills and trim each repository's AGENTS.md to the contract the skill now owns. | A test loads each sibling SKILL.md through `DevelopmentSkillTopicInventory` and asserts every required topic is declared; each AGENTS.md links its development skill instead of restating it.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-DEV-R002",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "Deployment and genesis tooling move to graph-os",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "29d80148b462"
      ],
      "verified_by": [],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**Deployment and genesis tooling move to graph-os.** agent-utilities deletes its agent-os-genesis workflow and agent-utilities-deployment skill once graph-os hosts their replacements covering single-host Docker Compose and Kubernetes/Helm deployment, identity modes with a forced first administrator, per-mode secret backends, and first-boot verification. Symlinks, AGENTS.md references, and the workspace navigation index are updated to point at the graph-os skills. | A repository check confirms the AU deployment and genesis copies no longer exist and that a fresh deployment following the graph-os skill passes first-boot verification.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-DEV-R003",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "Skill inventory refresh stays deterministic after moves",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "ed6485573f1e"
      ],
      "verified_by": [],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**Skill inventory refresh stays deterministic after moves.** agent-utilities' source-to-installed skill inventory detects a moved or renamed graph-os provider skill and a stale installed copy, and its refresh is idempotent: it prints its plan before mutating anything and verifies the resulting hashes and IDs so the skill remains discoverable in both Codex and the runtime XDG skill path after an ecosystem refactor. | A refresh test renames a source skill, runs the inventory refresh, and confirms the installed copy is updated and discoverable with matching hashes in both environments.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-DEV-R003.1",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "typed SkillInventoryRefreshEntry model (agent_utilities/skills/inventory_refresh_model.py) that refuses a refresh which mutates before printing its plan, or cla",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c48cba9d3f95",
        "f25a287bac6c"
      ],
      "verified_by": [],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**typed SkillInventoryRefreshEntry model (agent_utilities/skills/inventory_refresh_model.py) that refuses a refresh which mutates before printing its plan, or cla.** Child slice of `AU-DEV-R003` (see tasks.md). | A refresh test renames a source skill, runs the inventory refresh, and confirms the installed copy is updated and discoverable with matching hashes in both environments",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-DEV-R003.2",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "The real runtime XDG skills refresh prints its plan before mutating and verifies hashes through `SkillInventoryRefreshEntry`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c48cba9d3f95"
      ],
      "verified_by": [
        "tests/unit/skills/test_inventory_refresh_runtime.py:10",
        "tests/unit/skills/test_inventory_refresh_runtime.py:26"
      ],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**The real runtime XDG skills refresh prints its plan before mutating and verifies hashes through `SkillInventoryRefreshEntry`.** `agent_utilities.skills.inventory_refresh_runtime` wires the AU-DEV-R003.1 model to the real `install_unified()` skills leg: it prints the planned action per registered provider before mutating, then builds one refusal-checked entry per provider from the real installed marker. The Codex discovery path remains `AU-DEV-R003.3+`. | `tests/unit/skills/test_inventory_refresh_runtime.py` confirms the plan is printed and the XDG tree is untouched before the real refresh runs, and that the resulting entries do not raise.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-DEV-R003.3",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "ROLLUP: Codex skill discovery path joins the refresh inventory (superseded by AU-DEV-R003.3.1...AU-DEV-R003.3.3)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**ROLLUP: Codex skill discovery path joins the refresh inventory (superseded by AU-DEV-R003.3.1...AU-DEV-R003.3.3).** Not bite-sized: `agent_utilities` has no Codex skill discovery path at all (only Codex hook registration in `ecosystem/hook_installer.py` and MCP registration in `deployment/codex_registration.py`; `install_unified()` writes only the XDG skills tree), so the path must be defined, materialized, then refreshed. Remaining scope of `AU-DEV-R003` after `.2`: the Codex discovery path is refreshed through the same plan-before-mutate, hash-verified `SkillInventoryRefreshEntry` flow as the XDG leg. | A unit test asserts the Codex leg prints its plan before mutating and refuses a hash mismatch.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-DEV-R003.3.1",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "Define the Codex skill discovery path",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "87539533cf33"
      ],
      "verified_by": [
        "tests/unit/core/test_codex_skills_dir.py:10",
        "tests/unit/core/test_codex_skills_dir.py:19"
      ],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**Define the Codex skill discovery path.** Add one typed resolver `codex_skills_dir()` (honouring `CODEX_HOME`, defaulting to `~/.codex/skills`) beside `unified_skills_dir()` with its validation and refusal tests for link-like or unsafe directories. | A unit test asserts the resolved path under `CODEX_HOME` and refusal of a symlinked root.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-DEV-R003.3.2",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "Materialize registered skill providers into the Codex path",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4d6f3ab2ae2b"
      ],
      "verified_by": [
        "tests/unit/core/test_codex_skills_install.py:38",
        "tests/unit/core/test_codex_skills_install.py:56",
        "tests/unit/core/test_codex_skills_install.py:75"
      ],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**Materialize registered skill providers into the Codex path.** Wire `install_unified()` to also write each registered provider's managed marker and assets under `codex_skills_dir()`, reusing `_materialize_provider`. | A unit test asserts a registered provider is installed under the Codex path with a managed marker.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-DEV-R003.3.3",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "Codex leg prints its plan before mutating and refuses a hash mismatch",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**Codex leg prints its plan before mutating and refuses a hash mismatch.** Extend `inventory_refresh_runtime` with a Codex leg that prints per-provider plan lines before mutating and builds `SkillInventoryRefreshEntry` from the Codex marker. | A unit test asserts the Codex plan prints before mutation and a hash mismatch raises.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-DEV-R003.3.4",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "Define the Claude Code skills discovery path",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d330871d37af"
      ],
      "verified_by": [
        "tests/unit/core/test_claude_skills_install.py:35",
        "tests/unit/core/test_claude_skills_install.py:46"
      ],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**Define the Claude Code skills discovery path.** Add `claude_skills_dir()` beside `codex_skills_dir()` (honouring `CLAUDE_CONFIG_DIR`, defaulting to `~/.claude/skills`) through one shared `_harness_skills_dir` resolver with the same relative, link-like, and non-directory refusals. | A unit test asserts the path under `CLAUDE_CONFIG_DIR`/`HOME` and refusal of a relative, symlinked, or non-directory root.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-DEV-R003.3.5",
      "kind": "requirement",
      "parent": "AU-DEV",
      "source": "specs/au-developer-environment/status.json",
      "title": "One harness-target install feeds Claude and Codex together",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d330871d37af"
      ],
      "verified_by": [
        "tests/unit/core/test_claude_skills_install.py:67",
        "tests/unit/core/test_claude_skills_install.py:91"
      ],
      "parent_title": "AU-DEV \u2014 Public AU development environment and skill lifecycle",
      "definition": "**One harness-target install feeds Claude and Codex together.** Generalize the Codex-only install into `_install_harness_skills` driven by a `HARNESS_TARGETS` table (codex, claude), reusing `_install_registration`, `_materialize_provider` and `_prune_removed_managed`; `install_unified()` reports a `claude_skills` key next to `codex_skills`. | A unit test asserts one `install_unified()` call materializes the same provider into both harness directories and pruning removes only managed-marker directories.",
      "definition_source": "specs/au-developer-environment/requirements.md",
      "definition_line": 18
    },
    {
      "id": "AU-RETIRE",
      "kind": "spec",
      "parent": null,
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/au-engine-duplicate-retirement/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/au-engine-duplicate-retirement/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "cutover matrix",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-deconstruction/cutover-matrix.md"
        },
        {
          "declared_in": "specs/au-engine-duplicate-retirement/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Cutover",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-engine-duplicate-retirement/plan.md#cutover"
        },
        {
          "declared_in": "specs/au-engine-duplicate-retirement/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Failure and security",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-engine-duplicate-retirement/plan.md#failure-and-security"
        },
        {
          "declared_in": "specs/au-engine-duplicate-retirement/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Interfaces and data flow",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-engine-duplicate-retirement/plan.md#interfaces-and-data-flow"
        },
        {
          "declared_in": "specs/au-engine-duplicate-retirement/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Inventory and migration",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-engine-duplicate-retirement/plan.md#inventory-and-migration"
        },
        {
          "declared_in": "specs/au-engine-duplicate-retirement/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "deletion and relocation inventory",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-deconstruction/plan.md#deletion-and-relocation-inventory"
        },
        {
          "declared_in": "specs/au-engine-duplicate-retirement/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-engine-duplicate-retirement/requirements.md"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/au-engine-duplicate-retirement/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "boundary cutover spec",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-boundary-deconstruction/spec.md"
        }
      ],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "AU-RETIRE-R001",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Complete inventory and retirement of duplicate graph engine code",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "4a5540dd2e3d",
        "6a408267e403"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/test_retirement_inventory.py:24"
      ],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Complete inventory and retirement of duplicate graph engine code.** AU produces a complete, reconciled inventory of every knowledge_graph module, giving each one a single disposition of retained for agent/planning use, migrated to the engine, migrated to an SDK, or deleted as a duplicate. Modules proven to duplicate the engine's native OWL/SPARQL/compute authority, including `knowledge_graph/core/graph_compute.py`, `knowledge_graph/core/formal_reasoning_core.py`, `knowledge_graph/backends/sparql/`, and any OWL bridge or backend module, are deleted once a parity-verified epistemic-graph client replaces them. | An inventory audit confirms no knowledge_graph module lacks a disposition, and before/after parity tests on a synthetic graph show the deleted modules have no remaining import or caller.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-RETIRE-R001.1",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Census recorded no safe disposition yet for `graph_compute.py` or `formal_reasoning_core.py`",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "6a408267e403"
      ],
      "verified_by": [],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Census recorded no safe disposition yet for `graph_compute.py` or `formal_reasoning_core.py`.** The 2026-10-08 census found `knowledge_graph/core/graph_compute.py` (`GraphComputeEngine`, 281 non-test importers) is load-bearing core infrastructure, not an isolable duplicate, and every exported symbol of `knowledge_graph/core/formal_reasoning_core.py` has a real caller or registered capability; neither has a disposition assigned, and no code was cut for either. This is a factual record of the census outcome, not new work. | `specs/au-engine-duplicate-retirement/tasks.md` records the census outcome verbatim; both files remain present and imported on `origin/main`.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-RETIRE-R001.2",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Open the cross-repo spec item enumerating EG-native equivalents",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Open the cross-repo spec item enumerating EG-native equivalents.** Open one spec item against epistemic-graph that lists, per exported AU symbol in `graph_compute.py` and `formal_reasoning_core.py`, either its EG-native equivalent operation or \"no replacement exists\" \u2014 the census's named next step, and the blocker for any AU-side deletion slice on either file. | The epistemic-graph spec item exists, is linked back from this row, and names an EG-native equivalent or \"no replacement exists\" for every exported symbol in both files.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-RETIRE-R002",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Enrichment edges carry a provenance rung and confidence",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "d165697978b7"
      ],
      "verified_by": [],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Enrichment edges carry a provenance rung and confidence.** Each enrichment edge in agent_utilities/knowledge_graph/enrichment/models.py records an explicit provenance rung distinguishing a directly extracted relationship from an inferred one, plus a confidence value, instead of leaving certainty to ride opportunistically in free-form properties. When two edges would write the same relationship, the edge with the more certain rung is kept. | Unit tests confirm edge rungs order from most to least certain, a less-certain write cannot overwrite a more-certain edge, and deduplication keeps the more certain edge.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-RETIRE-R003",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "OBO ontology terms ingest as typed ReferenceTerm individuals",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "6a408267e403"
      ],
      "verified_by": [],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**OBO ontology terms ingest as typed ReferenceTerm individuals.** AU ingests OBO ontology terms from GO biological process, UBERON/CL, ENVO, PATO and ChEBI as ReferenceTerm individuals keyed by their CURIE, aggregates GO annotations into a taxonCapableOf relation, and types ChEBI nutrient-role entries as kg:Nutrient. | Integration tests load each OBO source and assert the resulting ReferenceTerm, taxonCapableOf and kg:Nutrient individuals match the expected CURIEs and types.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-RETIRE-R003.1",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Typed ReferenceTerm model refuses an invalid CURIE",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "82c3c3016b15",
        "f25a287bac6c"
      ],
      "verified_by": [],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Typed ReferenceTerm model refuses an invalid CURIE.** `ReferenceTerm` refuses a `curie` that is not `PREFIX:local_id` shaped or whose prefix does not match its declared `source`. | Unit tests assert a non-CURIE identifier and a source-mismatched CURIE both raise `ValidationError` referencing AU-RETIRE-R003.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-RETIRE-R003.2",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Ingest raw OBO records into keyed, deduplicated ReferenceTerm individuals",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "82c3c3016b15"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/ontology/test_reference_term.py:29",
        "tests/unit/knowledge_graph/ontology/test_reference_term.py:40",
        "tests/unit/knowledge_graph/ontology/test_reference_term.py:51"
      ],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Ingest raw OBO records into keyed, deduplicated ReferenceTerm individuals.** `ingest_reference_terms` turns an iterable of raw OBO term records into `ReferenceTerm` individuals keyed by CURIE, validating each record through `ReferenceTerm` and keeping the first record when a CURIE repeats. | Unit tests assert ingest keys individuals by CURIE, keeps the first of a repeated CURIE, and propagates `ValidationError` for an invalid record.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-RETIRE-R003.3",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Load the real OBO sources and aggregate taxonCapableOf / kg:Nutrient",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "82c3c3016b15"
      ],
      "verified_by": [],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Load the real OBO sources and aggregate taxonCapableOf / kg:Nutrient.** Remaining scope of `AU-RETIRE-R003` after the `.1` model and `.2` keyed ingest: load GO biological process, UBERON/CL, ENVO, PATO and ChEBI through `ingest_reference_terms`, aggregate GO annotations into a `taxonCapableOf` relation, and type ChEBI nutrient-role entries as `kg:Nutrient`. | Integration tests load each OBO source and assert the resulting ReferenceTerm, taxonCapableOf and kg:Nutrient individuals match the expected CURIEs and types.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-RETIRE-R004",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Fix doubled node_type text in embedding composition",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "bc7bba33932d",
        "f0f5e51f6b47"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/enrichment/test_entity_text_bare_node_type.py:38"
      ],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Fix doubled node_type text in embedding composition.** The derived text composed for embedding in enrichment/semantic.py does not duplicate a bare node_type label; a node with no other descriptive fields produces a single label such as \"Order\" rather than a doubled string such as \"Order and Order\". | A unit test asserts the composed embedding text for a node carrying only node_type equals the single label, not a duplicated compound string.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-RETIRE-R005",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Per-stage timing instrumentation across the full ingest path",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "dd925ea09bf7"
      ],
      "verified_by": [],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Per-stage timing instrumentation across the full ingest path.** The code and repository ingest path in enrichment/pipeline.py and the repository-indexer module in core/ records per-stage timing through the same ingest-profile instrumentation already used on the document path, covering stages such as enumeration, parsing and resolution, filtering, call resolution, community detection, card generation, embedding and write, so ingest duration is measurable end to end. | Unit tests assert each pipeline stage emits a timing record through the ingest-profile instrumentation, and a full ingest run reports a non-zero duration for every stage.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-RETIRE-R006",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Delta ingest reaps nodes for deleted files",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "42f6dada3749",
        "4a5540dd2e3d",
        "5822ee9bef09",
        "bc7bba33932d"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/test_ingestion_perf_optimizations.py:362",
        "tests/unit/knowledge_graph/test_ingestion_perf_optimizations.py:380",
        "tests/unit/knowledge_graph/test_ingestion_perf_optimizations.py:393"
      ],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Delta ingest reaps nodes for deleted files.** The incremental delta ingest path in ingestion/engine.py removes graph nodes for files that were deleted from the source, so a deleted file leaves no stale node behind after a delta run. | An integration test deletes a previously ingested file, runs a delta ingest, and asserts the corresponding node no longer exists in the graph.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-RETIRE-R007",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Deterministic embedding admission classifier at the ingest chokepoint",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "82eff59f049d"
      ],
      "verified_by": [],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Deterministic embedding admission classifier at the ingest chokepoint.** The embedding admission classifier in ingestion/embedding_admission.py deterministically excludes lockfile, generated, vendored, minified and binary content, excludes typed SQL/CDC columns such as enums, foreign keys, timestamps, booleans and numerics, and excludes exact-duplicate content by hash, while its structured-token rule stays narrow enough that ordinary hyphenated entity names still reach the embedder. The classifier is enforced at the single envelope-preparation chokepoint so no connector can bypass it. | Unit and integration tests against the real chokepoint confirm each exclusion class is skipped, duplicate content is deduplicated, and a known set of ordinary entity names still reach the embedder.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-RETIRE-R008",
      "kind": "requirement",
      "parent": "AU-RETIRE",
      "source": "specs/au-engine-duplicate-retirement/status.json",
      "title": "Sequence ingestion-economics work ahead of file relocation",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "6a408267e403"
      ],
      "verified_by": [],
      "parent_title": "AU-RETIRE \u2014 Retire duplicate graph engine authority in AU",
      "definition": "**Sequence ingestion-economics work ahead of file relocation.** Design work on ingestion timing, edge provenance and embedding admission lands against AU's current ingestion/engine.py, enrichment/pipeline.py and the repository-indexer module in core/ and is inherited by any later relocation of those files, rather than the two efforts proceeding as independent, unreconciled changes to the same files. | A review confirms the ingestion-economics changes are merged before any in-scope module is migrated out of AU, with no conflicting concurrent rewrite of the same files.",
      "definition_source": "specs/au-engine-duplicate-retirement/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-INTEGRATION",
      "kind": "spec",
      "parent": null,
      "source": "specs/au-integration-reliability/status.json",
      "title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/au-integration-reliability/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/au-integration-reliability/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/uv_workspace.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/uv_workspace.py"
        },
        {
          "declared_in": "specs/au-integration-reliability/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-integration-reliability/requirements.md"
        },
        {
          "declared_in": "specs/au-integration-reliability/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-integration-reliability/status.json"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "AU-INTEGRATION-R001",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Clustered mode deliberately refuses local-only agent writes",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "34481f825411",
        "42f6dada3749",
        "daa321626142"
      ],
      "verified_by": [
        "tests/unit/orchestration/test_agent_library.py:204",
        "tests/unit/test_native_cypher_routing.py:294"
      ],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Clustered mode deliberately refuses local-only agent writes.** In clustered mode, direct writes to AgentComponent, AgentLibrary, AgentGraph, AgentTemplate and ConnectorPack are deliberately refused through an explicit local-only method list in the mutation planner (src/server/mutation/plan.rs), not as an accidental side effect, and the inventory of clustered-refused mutation methods stays complete. | An inventory test asserts every local-only mutation method is enumerated and refused when running in clustered mode.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-INTEGRATION-R002",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Control graph auto-creation and messaging intake propagation",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "46da005a6c4c"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Control graph auto-creation and messaging intake propagation.** The reserved __control__ graph is created automatically, or a typed error is returned, before the first WorkItem is processed on a fresh engine, rather than failing silently, and the messaging_intake_enabled setting is threaded through to InProcessBackend.apply so it actually takes effect. | Unit tests cover a fresh engine's first WorkItem against the control graph and confirm that toggling messaging_intake_enabled changes InProcessBackend.apply's behavior.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-INTEGRATION-R003",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Reconcile previously tracked fixes against current main",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "eabd68d558c0"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Reconcile previously tracked fixes against current main.** AU's dependency, contract-generation and test-baseline fixes are verified as already present and tested at the current merged head rather than tracked as separate pending work, so no duplicate fix remains open against code that already carries it. | A source and test audit at the current merged head confirms each fix is present in code and covered by an existing test, with no separate pending fix left open for the same defect.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-INTEGRATION-R004",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Remove the unintended nltk dependency from AU's lock",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5061f520d040",
        "eabd68d558c0"
      ],
      "verified_by": [
        "tests/unit/release/test_lock_no_nltk.py:11"
      ],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Remove the unintended nltk dependency from AU's lock.** AU's dependency lock does not pull in nltk indirectly for AU itself. Any nltk dependency is declared by the extra that actually needs it rather than leaking into AU's base lock. | A lockfile audit confirms no nltk entry appears outside the dependency set of the extra that declares it.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-INTEGRATION-R005",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Contract compatibility hook validates against a pinned artifact",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c15d278239d3"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Contract compatibility hook validates against a pinned artifact.** The epistemic-graph contract-compatibility hook validates AU's code against a pinned, published EG contract artifact, never by reading a sibling repository checkout from the local filesystem. | The hook runs correctly with no sibling repository present and still detects a deliberately introduced contract mismatch.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-INTEGRATION-R006",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "epistemic-graph is a core AU dependency",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "eabd68d558c0"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**epistemic-graph is a core AU dependency.** epistemic-graph[full] is declared as a core, always-installed AU dependency rather than an opt-in extra. | A dependency-manifest check confirms epistemic-graph[full] appears in AU's base dependency set with no extras flag required to install it.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-INTEGRATION-R007",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Gold-set generation is synthetic, not manually labelled",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "e48977329379"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Gold-set generation is synthetic, not manually labelled.** Gold-set generation for retrieval and evaluation work is produced synthetically by construction, consistent with evaluation requirement EG-DECISION-ENGINE-R053, and AU does not maintain a separate manual or human-labelling pipeline for this data. | An audit confirms the synthetic gold-set generator produces the required evaluation data and that no parallel manual-labelling process exists in AU.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-INTEGRATION-R008",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Regression baseline stays green with EG installed",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "ff819b4cc434"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Regression baseline stays green with EG installed.** AU's regression baseline, including tests for lazy configuration attribute resolution, shared-resource-lease fencing, Cypher session boundary handling, model-factory routing, the sessions gateway, and deployment-backend threading timeouts, passes with EG installed. | The full test baseline, including each of these specific tests, passes with EG installed.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-INTEGRATION-R009",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Resolve expired liveness deferrals with recorded evidence",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c15d278239d3"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Resolve expired liveness deferrals with recorded evidence.** AU's liveness gate carries no expired deferral: unused modules such as api/sparql_server.py, protocols/dataflows.py and protocols/quant_agent.py are removed, the harness/memorydata deferral is resolved, and ecosystem/agent_manager_dashboard.py is wired to a live caller, each with evidence recorded against its deferral. | The liveness gate runs with zero expired deferrals, and each resolved item's deletion or live-wiring evidence is checked in.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-INTEGRATION-R010",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Kafka enqueue-only-proof contract runs and passes honestly",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "35fde39bdb9d"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Kafka enqueue-only-proof contract runs and passes honestly.** The engine-owned Kafka enqueue-only-proof contract executes its build, unconstrained and constrained steps to completion without being short-circuited by an earlier failing tier, and AU reports its result as external dependency evidence rather than claiming it as AU-authored proof. | The constrained-parallelism gate runs end to end and all three Kafka steps complete with a zero exit code, visible in the run log.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-INTEGRATION-R011",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Prove disposability before pruning a branch checkout",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "79694ed969b6"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Prove disposability before pruning a branch checkout.** Before a development branch or its local checkout is removed, its commits and any uncommitted changes must be shown to already exist in an accepted public branch, or recorded in an explicit recovery artifact; having zero commits ahead of main is not by itself proof that a checkout is disposable. | A checkout audit records, for each candidate removal, either its containment in an accepted branch or a retained recovery reference, before the checkout is deleted.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-INTEGRATION-R012",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "External-graph contract check follows relocated docs",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "37eadb5dab34"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**External-graph contract check follows relocated docs.** AU's external-graph contract check keeps covering the two documents that moved out of AU by requiring an equivalent content-marker and environment-literal check exist in their new location, rather than silently covering zero documents once they move. | A test proves the relocated check fails against a deliberately broken input, and AU's own check inventory shows no orphaned entry for the moved documents.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-INTEGRATION-R013",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Privacy gate accepts canonical automation author identities",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "37eadb5dab34"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Privacy gate accepts canonical automation author identities.** AU's author-identity privacy gate accepts the exact canonical automation author identities, including the fully qualified Claude and Codex identities, as valid commit authors, instead of rejecting any author name that contains the bare word used inside those identities. | A test commits using each canonical identity string and confirms the gate accepts it, while an unrelated bare token, leaked credential, or private endpoint is still rejected.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-INTEGRATION-R014",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Benchmark query-serving improvements against the existing path",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "35fde39bdb9d",
        "64d317c9e385"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Benchmark query-serving improvements against the existing path.** Any proposed AI predicate-grouping, prompt or key-value reuse, or GPU-fairness improvement is measured against AU's existing typed query and model-serving path before integration, preserving tenant and purpose authorization gates, and is adopted only as an optimization inside that path rather than as a second independent query or storage authority. A component whose access control relies on a single shared token rather than a verified per-tenant, per-purpose identity does not meet the bar for integration. | A benchmark compares the candidate against the existing serving path on identical workloads, and an authorization test confirms tenant and purpose gates are enforced before any integration is accepted.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 18
    },
    {
      "id": "AU-INTEGRATION-R014.1",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Remaining scope of AU-INTEGRATION-R014 (slice .1): Benchmark query-serving improvements against the existing path",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "64d317c9e385"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Remaining scope of AU-INTEGRATION-R014 (slice .1): Benchmark query-serving improvements against the existing path.** Child slice of `AU-INTEGRATION-R014` (see tasks.md). | A benchmark compares the candidate against the existing serving path on identical workloads, and an authorization test confirms tenant and purpose gates are enforced before any integration is accepted",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 19
    },
    {
      "id": "AU-INTEGRATION-R015",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Remove the unused legacy ontology publisher surface",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "23920f0ed817",
        "acab91a1b198"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Remove the unused legacy ontology publisher surface.** AU removes the unused ontology_publisher module, the Fuseki/Stardog publish schedule token, the related vendor configuration, and the doctor, health and widget surfaces and documentation referencing them once no live caller exists, verified against a full module and catalog inventory. AU does not reintroduce a local named-graph publisher; if atomic named-graph publication is needed, the engine exposes the single method for it. | A caller and catalog census confirms zero remaining references to the removed publisher, schedule token, and related configuration, and the targeted test suite for the surrounding module continues to pass.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 20
    },
    {
      "id": "AU-INTEGRATION-R016",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Published ontology-deletion commit matches its source patch",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "43197d7c65a3"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Published ontology-deletion commit matches its source patch.** The publicly published commit that deletes all local ontology files and local semantic-authority code is verifiably the same change, by patch content rather than only by message, as the corresponding source change it replaces, with both the focused and the expanded ontology overlay test suites passing at that commit. | A patch-identity comparison confirms the published commit's patch matches the source change, and both the focused and expanded overlay test suites pass.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 21
    },
    {
      "id": "AU-INTEGRATION-R017",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Published source history is an ancestor of main",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "43197d7c65a3"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Published source history is an ancestor of main.** AU's publicly published source history is fully contained within the ancestry of the local main branch, so public history is a strict subset of main rather than a divergent line. | A history-ancestry check confirms each published commit is reachable as an ancestor of local main.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 22
    },
    {
      "id": "AU-INTEGRATION-R018",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Public docs site passes the full documentation gate suite",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "35fde39bdb9d",
        "64d317c9e385",
        "bf0a31f534e1"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Public docs site passes the full documentation gate suite.** AU's public documentation site matches the canonical README and theme, presents its home page in present tense, has zero orphan pages with full page-count parity against the site navigation, builds under strict MkDocs settings, and passes the current-only, privacy, accessibility, theme, workflow and version gates. | The documentation build and its current-only, privacy, accessibility, theme, workflow and version gates all run green against the published site, and a page-count and orphan-page check confirms full coverage.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 23
    },
    {
      "id": "AU-INTEGRATION-R018.1",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Remaining scope of AU-INTEGRATION-R018 (slice .1): Public docs site passes the full documentation gate suite",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "64d317c9e385"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Remaining scope of AU-INTEGRATION-R018 (slice .1): Public docs site passes the full documentation gate suite.** Child slice of `AU-INTEGRATION-R018` (see tasks.md). | The documentation build and its current-only, privacy, accessibility, theme, workflow and version gates all run green against the published site, and a page-count and orphan-page check confirms full coverage",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 24
    },
    {
      "id": "AU-INTEGRATION-R019",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Messaging direct turns use a configured budget and never discard an over-budget run",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "003679966f78",
        "42f6dada3749",
        "f94a3c109517"
      ],
      "verified_by": [
        "tests/unit/messaging/test_direct_reply_budget.py:20",
        "tests/unit/messaging/test_direct_reply_budget.py:30",
        "tests/unit/messaging/test_direct_reply_budget.py:39"
      ],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Messaging direct turns use a configured budget and never discard an over-budget run.** The direct/chat reply budget comes from `MESSAGING_DIRECT_REPLY_BUDGET_S` (default 60 s), not a literal. Direct turns stay interactive. When a messaging turn passes its budget, the run continues. Its final reply is sent once as a follow-up message to the same chat. The timeout text states that the reply follows. | Unit tests prove the setting sets the direct budget. A test proves an overrun returns the follow-up notice and delivers the late reply exactly once.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 25
    },
    {
      "id": "AU-INTEGRATION-R020",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Outbound chat text never carries the run envelope",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "42f6dada3749",
        "6778d5dfd79b",
        "b1fd0469c010"
      ],
      "verified_by": [
        "tests/unit/messaging/test_run_envelope_unwrap.py:29",
        "tests/unit/messaging/test_run_envelope_unwrap.py:36",
        "tests/unit/messaging/test_run_envelope_unwrap.py:43"
      ],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Outbound chat text never carries the run envelope.** One helper turns a run result into outbound text. It accepts a dict or JSON string envelope and returns only `output`. The envelope key set is shared with the renderer. `run_summary` stays for logs and trace links. | A regression test feeds the exact leaked Telegram envelope and asserts only the answer text. A second test unwraps every key the renderer emits.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 26
    },
    {
      "id": "AU-INTEGRATION-R021",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "An aggregate ask answers with its own rows, never a silent empty answer",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "00220bc40313",
        "671acde661a3"
      ],
      "verified_by": [],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**An aggregate ask answers with its own rows, never a silent empty answer.** `nl_planner.nl_query` recognizes the engine's \"without a governed node id\" denial of a sql/sparql aggregate projection and steers its bounded retry to the cypher dialect, the one dialect the engine authorizes for an aggregate/grouped read. `EvidenceBundle.from_nl_query` folds a successful result's first rows into `answer_candidate`, not just a row count. An execution denial that exhausts every retry still surfaces through the `error` field; it never reports as an empty, successful-looking answer. | Unit tests cover a sql-denied aggregate self-correcting to a successful cypher aggregate, an exhausted retry surfacing its denial through `error`, and `EvidenceBundle.from_nl_query` mapping aggregate rows into `answer_candidate`.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 27
    },
    {
      "id": "AU-INTEGRATION-R022",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "The maintenance scheduler syncs every configured connector source on an interval",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0f6916669b59",
        "7475a78b2fb3"
      ],
      "verified_by": [
        "tests/unit/core/test_connector_sync_sweep.py:19",
        "tests/unit/core/test_connector_sync_sweep.py:63"
      ],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**The maintenance scheduler syncs every configured connector source on an interval.** A recurring sweep enumerates the sources `sync_source` knows (its registry/dispatch table in `source_sync.py`), skips unconfigured ones exactly as the existing `_*_configured()` checks do, and dispatches `sync_source(engine, name, mode=\"delta\")` for each configured one \u2014 not just the three hardcoded research-feed sources (rss/freshrss/arxiv). One source failing does not stop the others. | A test with a fake engine and a monkeypatched registry proves configured sources are dispatched, unconfigured ones are skipped, and one source raising does not stop the rest from running.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 28
    },
    {
      "id": "AU-INTEGRATION-R023",
      "kind": "requirement",
      "parent": "AU-INTEGRATION",
      "source": "specs/au-integration-reliability/status.json",
      "title": "Native ChangeEnvelope mutations carry only the fields the engine contract allows",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "6a43f914f823"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/ingestion/test_native_envelope_ingest.py:615"
      ],
      "parent_title": "AU-INTEGRATION \u2014 AU integration and release reliability",
      "definition": "**Native ChangeEnvelope mutations carry only the fields the engine contract allows.** The mutation dict `_native_mutation()` builds for `client.changes.apply()` in `envelope_ingest.py` contains only `epistemic_graph.client`'s closed mutation fields (`batch_id`, `graph`, `idempotency_key`, `operations`, `outbox`, plus the optional `placement_epoch`, `expected_graph_version`, `fencing_token`); `schema_version`, `context`, `tenant` and `created_at_ms` are never drafted into it, since the engine mints tenant, context and timing from the already-verified session rather than accepting them from the caller. | The mutation built through the real `_native_mutation()`/`ingest_envelope()` path has a key set that is a subset of `epistemic_graph.client._CHANGE_MUTATION_REQUIRED` / `_CHANGE_MUTATION_OPTIONAL` and passes that module's own `_closed_mapping` validator offline.",
      "definition_source": "specs/au-integration-reliability/requirements.md",
      "definition_line": 29
    },
    {
      "id": "AU-SEMANTIC",
      "kind": "spec",
      "parent": null,
      "source": "specs/au-semantic-client/status.json",
      "title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/au-semantic-client/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/au-semantic-client/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/core/model_router.py:111",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/core/model_router.py#L111"
        },
        {
          "declared_in": "specs/au-semantic-client/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/core/resource_optimizer.py:232",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/core/resource_optimizer.py#L232"
        },
        {
          "declared_in": "specs/au-semantic-client/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/decide/consumers/routing.py:58",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/decide/consumers/routing.py#L58"
        },
        {
          "declared_in": "specs/au-semantic-client/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/harness/agentic_evolution_engine.py:316",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/harness/agentic_evolution_engine.py#L316"
        },
        {
          "declared_in": "specs/au-semantic-client/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/knowledge_graph/backends/epistemic_graph_backend.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/knowledge_graph/backends/epistemic_graph_backend.py"
        },
        {
          "declared_in": "specs/au-semantic-client/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/knowledge_graph/retrieval/context_compiler.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/knowledge_graph/retrieval/context_compiler.py"
        },
        {
          "declared_in": "specs/au-semantic-client/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/gates/test_epistemic_graph_schema_authority_cutover.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/tests/gates/test_epistemic_graph_schema_authority_cutover.py"
        },
        {
          "declared_in": "specs/au-semantic-client/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-semantic-client/requirements.md"
        },
        {
          "declared_in": "specs/au-semantic-client/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/au-semantic-client/status.json"
        }
      ],
      "relations": [],
      "plan_diagrams": [
        "sequenceDiagram\n  participant Host as graph-os\n  participant AU as AU application\n  participant Client as Generated EG client\n  participant EG as EG schema and state\n  Host->>AU: execute(verified context, RunSpec)\n  AU->>Client: inspect/query/validate typed request\n  Client->>EG: pinned contract digest + scoped request\n  EG-->>Client: typed result + receipt/provenance\n  Client-->>AU: exact generated result\n  AU-->>Host: agent outcome + emitted events\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "AU-SEMANTIC-R001",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "OntologyLifecycle.set_active() fails closed, not a silent local fallback",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "2648d0b28ad0",
        "42f6dada3749",
        "43197d7c65a3"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**OntologyLifecycle.set_active() fails closed, not a silent local fallback.** `OntologyLifecycle.set_active()` must not silently instantiate a local fallback implementation in place of the EG-served ontology lifecycle method; when that served method cannot be reached it fails closed instead of masking the condition. | A fault test forces the EG ontology-lifecycle method to be unavailable. It asserts `set_active()` raises rather than returning a local fallback instance.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-SEMANTIC-R002",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "AU verifies domain-pack class names against EG's schema-class list",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0e5fc3801885",
        "2648d0b28ad0"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/domain_packs/test_pack_loader.py:355",
        "tests/unit/knowledge_graph/domain_packs/test_pack_loader.py:365"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**AU verifies domain-pack class names against EG's schema-class list.** AU resolves every domain-pack class and property reference through EG's served graph-schema-classes read. It refuses to use a reference to an unknown class. It does not only flag the reference as unverified. | A negative test that references an unknown class in a domain pack asserts AU refuses it. AU does not merely record it as unverified.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-SEMANTIC-R003",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "AU's knowledge_graph shape files are published to the EG pack or removed",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "83a157bf120b"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**AU's knowledge_graph shape files are published to the EG pack or removed.** Every SHACL shape file under `knowledge_graph/shapes/` is either published into the EG-validated schema pack so EG applies it during validation, or deleted from AU together with the tests that reference it; AU holds no SHACL shape outside a published pack. | The previously skipped shape tests run and pass against EG-served validation, or are deleted along with the removed shape file.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-SEMANTIC-R004",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "AU's remaining SHACL shape files move into EG-owned schema packs",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "981194f50ab4",
        "afe05ab38e0f"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**AU's remaining SHACL shape files move into EG-owned schema packs.** AU's `knowledge_graph/shapes/*.ttl` files and `ontology/shapes/governance.shapes.ttl` are removed from AU and hosted only in EG-owned schema packs or sources. AU references each shape by IRI and performs no local SHACL parsing. | A forbidden-file census confirms the shape files are absent from AU and shape references resolve only through the EG-served contract.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-SEMANTIC-R005",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Ontology lifecycle, integrity and schema parsing become EG client calls",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "83a157bf120b"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Ontology lifecycle, integrity and schema parsing become EG client calls.** `knowledge_graph/ontology/lifecycle.py`, `ontology_integrity.py`, the pack/schema loaders (`domain_packs/pack_loader.py`, `models/schema_pack_loader.py`) and `extraction/extraction_schema.py` no longer parse or hash RDF/OWL/RDFS locally. Each becomes a typed call to the generated EG ontology-inspection client. | Generated-client conformance tests and a forbidden-import census confirm no local graph parsing remains in these modules.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-SEMANTIC-R006",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "AU removes rdflib and submits typed payloads to EG instead",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "b8ef12acba3c"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**AU removes rdflib and submits typed payloads to EG instead.** AU's runtime modules that build RDF documents for validation, including the harness, workflow, SHACL, connector-certification, connector-manifest and team-sharing gates, submit typed request payloads to the generated EG client instead of constructing RDF graphs; the `rdflib` dependency and its extras are removed from AU. Split: size score above 6, more than 2 code roots named, each gate module has independent call sites and tests; children land one gate module at a time. | `tests/gates/test_epistemic_graph_schema_authority_cutover.py` statically forbids `rdflib`, `pyshacl`, `owlrl` and `owlready2` imports across AU runtime and test code.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-SEMANTIC-R006.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The harness gate submits a typed payload instead of an rdflib graph",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "b8ef12acba3c"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The harness gate submits a typed payload instead of an rdflib graph.** `agent_utilities/harness/harness_gate.py` no longer imports `rdflib`; it builds the EG `shacl_validate_ad_hoc` request from a typed payload (dict/dataclass of parsed fields) rather than an `rdflib.Graph()`. | A forbidden-import test over `harness_gate.py` fails on any `rdflib` import, and the gate's existing validation tests still pass against the typed payload path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-SEMANTIC-R006.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The workflow gate submits a typed payload instead of an rdflib graph",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "eb94d8306a5b"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/test_workflow_gate.py:201",
        "tests/unit/knowledge_graph/test_workflow_gate.py:218",
        "tests/unit/knowledge_graph/test_workflow_gate.py:236"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The workflow gate submits a typed payload instead of an rdflib graph.** `agent_utilities/knowledge_graph/core/workflow_gate.py` no longer imports `rdflib`; it builds its EG validation request from a typed payload rather than an `rdflib.Graph()`. | A forbidden-import test over `workflow_gate.py` fails on any `rdflib` import, and the gate's existing tests still pass against the typed payload path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-SEMANTIC-R006.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The SHACL pipeline gate and pack loader submit typed payloads instead of rdflib graphs",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "f235aa252a91"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/pipeline/phases/test_shacl_gate_no_rdflib.py:22",
        "tests/unit/knowledge_graph/pipeline/phases/test_shacl_gate_no_rdflib.py:51",
        "tests/unit/knowledge_graph/pipeline/phases/test_shacl_gate_no_rdflib.py:76"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The SHACL pipeline gate and pack loader submit typed payloads instead of rdflib graphs.** `agent_utilities/knowledge_graph/pipeline/phases/shacl_gate.py` and `agent_utilities/knowledge_graph/domain_packs/pack_loader.py` no longer import `rdflib`; each builds its EG request from a typed payload rather than an `rdflib.Graph()`. | A forbidden-import test over both modules fails on any `rdflib` import, and their existing tests still pass against the typed payload path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-SEMANTIC-R006.4",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The connector-certification gate submits a typed payload instead of an rdflib graph",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "98efc7009d5f"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/integrations/test_connector_certification_no_rdflib.py:17",
        "tests/unit/knowledge_graph/integrations/test_connector_certification_no_rdflib.py:27"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The connector-certification gate submits a typed payload instead of an rdflib graph.** `agent_utilities/knowledge_graph/integrations/connector_certification.py` no longer imports `rdflib`; it builds its EG validation request from a typed payload rather than an `rdflib.Graph()`. | A forbidden-import test over `connector_certification.py` fails on any `rdflib` import, and the gate's existing tests still pass against the typed payload path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-SEMANTIC-R006.5",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The connector-manifest gate and generation scripts submit typed payloads instead of rdflib graphs",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The connector-manifest gate and generation scripts submit typed payloads instead of rdflib graphs.** `agent_utilities/knowledge_graph/ontology/connector_manifest_gate.py` and the `scripts/generate_connector_manifests.py`/`generate_native_connector_manifest.py`/`check_connector_capability_bundles.py`/`generate_connector_capability_bundles.py` scripts no longer import `rdflib`. Each builds its EG request from a typed payload rather than an `rdflib.Graph()`. | Rollup: closes when children R006.5.1 to R006.5.5 are all verified. The gate module is EG-dependent (canonical hash), the scripts are independent call sites.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-SEMANTIC-R006.5.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "connector_manifest_gate.py submits typed payloads instead of an rdflib graph",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**connector_manifest_gate.py submits typed payloads instead of an rdflib graph.** `agent_utilities/knowledge_graph/ontology/connector_manifest_gate.py` no longer imports `rdflib`; `_compiled_manifest_graph` and the integrity hash use a typed payload. Depends on epistemic-graph: it must serve a canonical (URDNA2015-equivalent) ontology hash for a Turtle payload, because `ontology_integrity.canonical_hash` is the only rdflib consumer and has no engine-native replacement yet. | A forbidden-import test over `connector_manifest_gate.py` fails on any `rdflib` import, and its existing tests still pass against the typed payload path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-SEMANTIC-R006.5.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "generate_connector_manifests.py submits typed payloads instead of an rdflib graph",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**generate_connector_manifests.py submits typed payloads instead of an rdflib graph.** `scripts/generate_connector_manifests.py` no longer imports `rdflib`; its ontology class/property extraction and hashing consume typed payloads. Depends on epistemic-graph for the canonical ontology hash. | A forbidden-import test over `generate_connector_manifests.py` fails on any `rdflib` import, and its existing tests still pass against the typed payload path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-SEMANTIC-R006.5.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "generate_native_connector_manifest.py submits typed payloads instead of an rdflib graph",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**generate_native_connector_manifest.py submits typed payloads instead of an rdflib graph.** `scripts/generate_native_connector_manifest.py` no longer imports `rdflib`; its integrity digest uses the typed canonical-hash payload. Depends on epistemic-graph for the canonical ontology hash. | A forbidden-import test over `generate_native_connector_manifest.py` fails on any `rdflib` import, and its existing tests still pass against the typed payload path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 18
    },
    {
      "id": "AU-SEMANTIC-R006.5.4",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "check_connector_capability_bundles.py submits typed payloads instead of an rdflib graph",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4463e2ba37cc"
      ],
      "verified_by": [
        "tests/unit/scripts/test_check_connector_capability_bundles_no_rdflib.py:25",
        "tests/unit/scripts/test_check_connector_capability_bundles_no_rdflib.py:35"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**check_connector_capability_bundles.py submits typed payloads instead of an rdflib graph.** `scripts/check_connector_capability_bundles.py` no longer imports `rdflib`; the `sh:targetClass` check reads the shapes via a typed payload or the existing text extraction. | A forbidden-import test over `check_connector_capability_bundles.py` fails on any `rdflib` import, and its existing tests still pass against the typed payload path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 19
    },
    {
      "id": "AU-SEMANTIC-R006.5.5",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "generate_connector_capability_bundles.py submits typed payloads instead of an rdflib graph",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "fd044131b941"
      ],
      "verified_by": [
        "tests/unit/scripts/test_generate_connector_capability_bundles_no_rdflib.py:19",
        "tests/unit/scripts/test_generate_connector_capability_bundles_no_rdflib.py:29"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**generate_connector_capability_bundles.py submits typed payloads instead of an rdflib graph.** `scripts/generate_connector_capability_bundles.py` no longer imports `rdflib`; shapes parsing uses a typed payload or text extraction. | A forbidden-import test over `generate_connector_capability_bundles.py` fails on any `rdflib` import, and its existing tests still pass against the typed payload path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 20
    },
    {
      "id": "AU-SEMANTIC-R006.6",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The team-sharing gate, remaining ontology modules and `rdflib` dependency removal close R006",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The team-sharing gate, remaining ontology modules and `rdflib` dependency removal close R006.** `agent_utilities/knowledge_graph/core/ontological_team_sharing.py`, `extraction/extraction_schema.py`, `observability/portfolio_intelligence.py`, `ontology/ontology_integrity.py` and `scripts/format_ttl.py`/`update_ontology_lock.py` no longer import `rdflib`, and the `rdflib` dependency and its extras are removed from AU's packaging metadata, closing `AU-SEMANTIC-R006`. | `tests/gates/test_epistemic_graph_schema_authority_cutover.py` statically forbids `rdflib`, `pyshacl`, `owlrl` and `owlready2` imports across AU runtime and test code, and passes with `rdflib` absent from AU's dependency metadata.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 21
    },
    {
      "id": "AU-SEMANTIC-R007",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "AU tests drop pyshacl and assert through EG shape validation",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "981194f50ab4",
        "afe05ab38e0f"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**AU tests drop pyshacl and assert through EG shape validation.** AU test files no longer import `pyshacl` or use an `importorskip('pyshacl')` guard that silently skips the assertion; every shape assertion runs against the EG-served `shacl_validate_ad_hoc` method or a committed validation path. | A forbidden-import census over AU tests fails on any `pyshacl` import, and the affected tests execute, rather than skip, against served EG validation.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 22
    },
    {
      "id": "AU-SEMANTIC-R008",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Reasoning-topology selection uses a served policy, not a local outcome store",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "b8ef12acba3c"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Reasoning-topology selection uses a served policy, not a local outcome store.** `agent_utilities/graph/reasoning/topology.py` selects a reasoning-graph topology, such as chain-of-thought or tree-of-thought, through a served, calibrated decision policy with explicit abstention rather than from its own self-reported outcome store; the local exponential-moving-average outcome store is deleted. Split producer-first: no served topology-decision-policy op exists yet to call; see `AU-SEMANTIC-R008.1`/`.2`. | `check_topology_authority.py` is extended to fail if topology selection reads from a local outcome store instead of the served decision policy.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 23
    },
    {
      "id": "AU-SEMANTIC-R008.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "A typed topology decision-policy client contract fails closed while no served policy exists",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "b8ef12acba3c"
      ],
      "verified_by": [
        "tests/unit/api/test_topology_decision_policy_client.py:16",
        "tests/unit/api/test_topology_decision_policy_client.py:31",
        "tests/unit/api/test_topology_decision_policy_client.py:40",
        "tests/unit/api/test_topology_decision_policy_client.py:55",
        "tests/unit/api/test_topology_decision_policy_client.py:66"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**A typed topology decision-policy client contract fails closed while no served policy exists.** `api/topology_decision_policy_client.py` declares the typed request/response shape (including an explicit abstention response) and `TopologyDecisionPolicyClient` Protocol `topology.py` will call once a served, calibrated decision policy is available, and `resolve_topology_decision_policy_client()` raises `TopologyDecisionPolicyUnavailableError` rather than falling back to the local EMA outcome store while no such policy is served. | A test confirms `resolve_topology_decision_policy_client()` raises with no served policy client installed, and that the Protocol/dataclasses have the declared shape including the abstention case.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 24
    },
    {
      "id": "AU-SEMANTIC-R008.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Topology selection consumes the served decision policy and the local outcome store is deleted",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "b8ef12acba3c"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Topology selection consumes the served decision policy and the local outcome store is deleted.** Once a served, calibrated topology decision policy is reachable, `topology.py`'s `record_topology_outcome`/selection path is wired to call `resolve_topology_decision_policy_client()` instead of writing the local exponential-moving-average outcome store, and the EMA store is deleted, closing `AU-SEMANTIC-R008`. | `check_topology_authority.py` is extended to fail if topology selection reads from a local outcome store instead of the served decision policy.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 25
    },
    {
      "id": "AU-SEMANTIC-R008.2.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`topology.py` calls the served decision-policy client instead of the local EMA store",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`topology.py` calls the served decision-policy client instead of the local EMA store.** `record_topology_outcome()` in `agent_utilities/graph/reasoning/topology.py` is wired to call `resolve_topology_decision_policy_client()` for its outcome update and the selection path consumes the client's decision, rather than reading/writing the local EMA state. **BLOCKED (epistemic-graph):** the installed engine client has no `epistemic_graph.generated.reasoning_policy` module and no `ReasoningPolicyClient.select_topology` method (the served `select_topology` decision-policy op), so `resolve_topology_decision_policy_client()` fails closed with `TopologyDecisionPolicyUnavailableError`; wiring `topology.py` to it would make selection permanently unavailable. Unblock by landing the served `select_topology` op and regenerated client in epistemic-graph. | A test confirms `record_topology_outcome()` calls `resolve_topology_decision_policy_client()` and performs no local EMA read/write.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 27
    },
    {
      "id": "AU-SEMANTIC-R008.2.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The local EMA outcome-store code is deleted from `topology.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The local EMA outcome-store code is deleted from `topology.py`.** Once `AU-SEMANTIC-R008.2.2` lands, the now-dead local exponential-moving-average state and its helper code are removed from `agent_utilities/graph/reasoning/topology.py`. | `check_topology_authority.py` passes with no local-outcome-store code present in `topology.py`.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 28
    },
    {
      "id": "AU-SEMANTIC-R009",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The local engine facade is deleted in favor of the generated EG client",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "703c3eb9d88d"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The local engine facade is deleted in favor of the generated EG client.** AU removes its local engine facade and orchestration modules, including `kg/core/engine.py` and its task, ingestion, memory, query, resolver, transport, lock and breaker companions, `kg/facade.py`, and `kg/orchestration/engine_*.py`, and reaches the equivalent functionality only through the generated EG client. Split producer-first: this requirement depends on EG's not-yet-shipped `runnable_skill_derivation` op (tracked by `EG-REPO-INGEST-R002`'s `skill_workflow_ingest` capability); see `AU-SEMANTIC-R009.1`/`.2`. | A caller-inventory and import census confirm every public entry point that used the deleted facade now resolves through the generated client with equivalent authorization and error semantics.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 29
    },
    {
      "id": "AU-SEMANTIC-R009.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "A typed `runnable_skill_derivation` client contract fails closed while EG's op is absent",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4eac8c6dc419"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**A typed `runnable_skill_derivation` client contract fails closed while EG's op is absent.** `api/skill_derivation_client.py` declares the typed request/response shape and `RunnableSkillDerivationClient` Protocol AU will call once EG's generated `SourceIngest` client exposes `runnable_skill_derivation` (producer: `EG-REPO-INGEST-R002`), and `resolve_runnable_skill_derivation_client()` raises `RunnableSkillDerivationUnavailableError` rather than deriving locally or returning a default while that op is absent. | A test confirms `resolve_runnable_skill_derivation_client()` raises with EG's generated client absent or lacking the op, and that the Protocol/dataclasses have the declared shape.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 30
    },
    {
      "id": "AU-SEMANTIC-R009.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "AU's engine-facade callers consume the shipped `runnable_skill_derivation` op",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "b8ef12acba3c"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**AU's engine-facade callers consume the shipped `runnable_skill_derivation` op.** Once `EG-REPO-INGEST-R002` ships `runnable_skill_derivation` on the generated `SourceIngest` client, `resolve_runnable_skill_derivation_client()` is wired to the real call, and the local engine-facade modules this requirement names are deleted, closing `AU-SEMANTIC-R009`. Split: wiring the real call and deleting the facade (`kg/core/engine.py` and its task/ingestion/memory/query/resolver/transport/lock/breaker companions, `kg/facade.py`, `kg/orchestration/engine_*.py`) are independent steps with more than 2 code roots in the deletion; see `AU-SEMANTIC-R009.2.1`/`.2.2`. | A caller-inventory and import census confirm every public entry point that used the deleted facade now resolves through the generated client with equivalent authorization and error semantics.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 31
    },
    {
      "id": "AU-SEMANTIC-R009.2.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`resolve_runnable_skill_derivation_client()` wires the real call when EG's op is present",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "b8ef12acba3c"
      ],
      "verified_by": [
        "tests/unit/api/test_skill_derivation_client.py:63"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`resolve_runnable_skill_derivation_client()` wires the real call when EG's op is present.** `api/skill_derivation_client.py`'s resolver calls the installed generated `SourceIngestClient.runnable_skill_derivation` method and returns its typed response when the op is present on the installed client, continuing to raise `RunnableSkillDerivationUnavailableError` only while it is genuinely absent (import failure or missing attribute); it no longer refuses a detected, present op. | A test installs a fake generated client exposing `runnable_skill_derivation` and asserts the resolver returns a working client that delegates to it, while a test with the op absent still raises.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 32
    },
    {
      "id": "AU-SEMANTIC-R009.2.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The local engine-facade modules are deleted once callers consume the wired client",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "b8ef12acba3c"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The local engine-facade modules are deleted once callers consume the wired client.** `kg/core/engine.py` and its task, ingestion, memory, query, resolver, transport, lock and breaker companions, `kg/facade.py`, and `kg/orchestration/engine_*.py` are deleted, and every caller that used them is migrated to `resolve_runnable_skill_derivation_client()` or the generated EG client directly, closing `AU-SEMANTIC-R009.2` and `AU-SEMANTIC-R009`. | A caller-inventory and import census confirm every public entry point that used the deleted facade now resolves through the generated client with equivalent authorization and error semantics.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 33
    },
    {
      "id": "AU-SEMANTIC-R010",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Graph-compute and session facades route through the generated EG client",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5d44f029d3fd"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Graph-compute and session facades route through the generated EG client.** AU's graph-compute and session modules, including `kg/core/graph_compute.py`, `session.py`, `epistemic_row.py`, `ogm.py`, the `company_brain*` modules, and `core/registry/kg_adapter.py`, are replaced by calls into the generated EG client, with AU keeping exactly one typed composition of that client under `api/`. | Caller-parity tests confirm callers of the removed facades now use the single `api/` client composition with equivalent behavior.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 34
    },
    {
      "id": "AU-SEMANTIC-R010.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "AU holds one typed composition of the generated EG client for graph-compute/session ops",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5d44f029d3fd"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**AU holds one typed composition of the generated EG client for graph-compute/session ops.** AU defines `GraphComputeClient`/`GeneratedGraphComputeSurface` under `api/graph_compute_client.py` as the single typed model callers will compose against for the surface `kg/core/graph_compute.py`, `session.py`, `epistemic_row.py`, `ogm.py`, the `company_brain*` modules, and `core/registry/kg_adapter.py` currently serve locally; it holds no local graph-compute/session logic of its own. | A negative test confirms construction fails closed with `GraphComputeClientUnavailable` when the installed EG client is `None` or does not implement the required surface, and succeeds and delegates when it does.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 35
    },
    {
      "id": "AU-SEMANTIC-R011",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Durable jobs, queues and state move to EG",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "b881d5bca432"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Durable jobs, queues and state move to EG.** AU's durable-work modules, including `kg/core/work_durability.py` and its queue-backend, scheduler, drain, ingest-routing, event and bitemporal companions, its ingest/analytics worker entry points, `core/shared_resource_leases.py`, and `core/state_store.py`/`chat_persistence.py`, are replaced by calls to EG's served durable-job, capacity-lease and state methods; AU holds no durable queue or state authority of its own. | A restart/fault test confirms durable work and state survive through EG rather than a local store, and the removed worker scripts are absent.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 36
    },
    {
      "id": "AU-SEMANTIC-R011.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/core/queue_backend.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/knowledge_graph/core/queue_backend.py`.** The local queue-backend abstraction is removed and its importers switched to the EG-served durable-job path. | A forbidden-module census confirms `knowledge_graph/core/queue_backend.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 38
    },
    {
      "id": "AU-SEMANTIC-R011.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/core/kafka_queue_backend.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/knowledge_graph/core/kafka_queue_backend.py`.** The local Kafka queue-backend implementation is removed and its importers switched to the EG-served durable-job path. | A forbidden-module census confirms `knowledge_graph/core/kafka_queue_backend.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 39
    },
    {
      "id": "AU-SEMANTIC-R011.4",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/core/postgres_queue_backend.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/knowledge_graph/core/postgres_queue_backend.py`.** The local Postgres queue-backend implementation is removed and its importers switched to the EG-served durable-job path. | A forbidden-module census confirms `knowledge_graph/core/postgres_queue_backend.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 40
    },
    {
      "id": "AU-SEMANTIC-R011.5",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/core/worker_scheduler.py` (rollup of R011.5.1 to R011.5.5)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/knowledge_graph/core/worker_scheduler.py` (rollup of R011.5.1 to R011.5.5).** The local work-item scheduler companion is removed and its importers switched to the EG-served durable-job path. | A forbidden-module census confirms `knowledge_graph/core/worker_scheduler.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 41
    },
    {
      "id": "AU-SEMANTIC-R011.5.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Repoint `engine_tasks.py` off the local worker scheduler",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Repoint `engine_tasks.py` off the local worker scheduler.** `knowledge_graph/core/engine_tasks.py` stops importing `WorkerRegistry`, `AdmissionPolicy`, `scheduler_config_from_env`, `resolve_engine_shard_writers` and `durable_shard_writers` from `worker_scheduler.py` (five import sites) and takes worker admission, lane floors and shard-writer width from EG's served durable-job and capacity-lease methods. | A census confirms ``engine_tasks.py`` no longer imports `knowledge_graph/core/worker_scheduler`, and its tests pass against the EG-served path. **BLOCKED on an epistemic-graph capability:** the installed client and EG origin/main serve only `SubmitWorkItem` admission and resource capacity leases (`_validate_capacity_lease_fences`); they serve no worker registry (`WorkerRegistry`), no reserved-worker fair admission decision (`AdmissionPolicy`), no scheduler config / lane-floor policy (`scheduler_config_from_env`) and no shard-writer width (`resolve_engine_shard_writers`, `durable_shard_writers`). EG must add those served methods before this row can be delivered.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 42
    },
    {
      "id": "AU-SEMANTIC-R011.5.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Repoint `ingest_routing.py` off the local worker scheduler",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Repoint `ingest_routing.py` off the local worker scheduler.** `knowledge_graph/core/ingest_routing.py` stops importing `durable_shard_writers` and reads the engine's shard-writer width from the EG-served path. | A census confirms ``ingest_routing.py`` no longer imports `knowledge_graph/core/worker_scheduler`, and its tests pass against the EG-served path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 43
    },
    {
      "id": "AU-SEMANTIC-R011.5.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Repoint scheduler tests, part 1",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Repoint scheduler tests, part 1.** `tests/unit/knowledge_graph/test_worker_scheduler.py` and `test_admission_policy_live_path.py` are deleted or rewritten against the EG-served admission path. | A census confirms `those tests` no longer imports `knowledge_graph/core/worker_scheduler`, and its tests pass against the EG-served path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 44
    },
    {
      "id": "AU-SEMANTIC-R011.5.4",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Repoint scheduler tests, part 2",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Repoint scheduler tests, part 2.** `test_ingest_graph_routing.py`, `test_ingest_tail_optimization.py`, `test_workitem_claim_metrics.py` and `tests/unit/mcp/test_graphos_bootstrap_isolation.py` stop patching or importing `worker_scheduler`. | A census confirms `those tests` no longer imports `knowledge_graph/core/worker_scheduler`, and its tests pass against the EG-served path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 45
    },
    {
      "id": "AU-SEMANTIC-R011.5.5",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete the module once no importer remains",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete the module once no importer remains.** `knowledge_graph/core/worker_scheduler.py` is removed along with its entries in `docs/concepts.yaml`, `docs/architecture/*.md`, `scripts/constrained_parallelism_gate.sh` and the R020 duplicate inventory, and a `@pytest.mark.spec` deletion test binds the absence. | A forbidden-module census confirms `knowledge_graph/core/worker_scheduler.py` is absent and nothing under `agent_utilities/` or `scripts/` imports it.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 46
    },
    {
      "id": "AU-SEMANTIC-R011.6",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/core/chunked_drain.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/knowledge_graph/core/chunked_drain.py`.** The local drain companion is removed and its importers switched to the EG-served durable-job path. | A forbidden-module census confirms `knowledge_graph/core/chunked_drain.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 47
    },
    {
      "id": "AU-SEMANTIC-R011.7",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/core/ingest_routing.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/knowledge_graph/core/ingest_routing.py`.** The local ingest-routing companion is removed and its importers switched to the EG-served durable-job path. | A forbidden-module census confirms `knowledge_graph/core/ingest_routing.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 48
    },
    {
      "id": "AU-SEMANTIC-R011.8",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/core/bitemporal.py` (rollup of R011.8.1 to R011.8.5)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/knowledge_graph/core/bitemporal.py` (rollup of R011.8.1 to R011.8.5).** The local bitemporal companion is removed once every importer is repointed to a served replacement. | A forbidden-module census confirms `knowledge_graph/core/bitemporal.py` is absent and nothing under `agent_utilities/` or `scripts/` imports it.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 49
    },
    {
      "id": "AU-SEMANTIC-R011.8.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Repoint `core/engine.py` off local bitemporal stamping",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Repoint `core/engine.py` off local bitemporal stamping.** `engine.py` stops importing `stamp_bitemporal` (two sites: node and relationship creation) and takes `storage_time`/`event_time`/`valid_from`/`valid_to` stamping from the EG-served write path. | A census confirms `engine.py` no longer imports `knowledge_graph/core/bitemporal`, and its tests pass against the served path. **BLOCKED on a served replacement:** the installed epistemic-graph client and EG origin/main serve no write-time bitemporal stamping (`stamp_bitemporal`); EG must add it before this row can be delivered, and the caller must not be made to fail closed in its place.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 50
    },
    {
      "id": "AU-SEMANTIC-R011.8.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Repoint `memory/learning_engine.py` off local bitemporal stamping",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Repoint `memory/learning_engine.py` off local bitemporal stamping.** `learning_engine.py` stops importing `stamp_bitemporal` (two sites) and gets edit-edge validity stamping from the EG-served write path. | A census confirms `learning_engine.py` no longer imports `knowledge_graph/core/bitemporal`, and its tests pass against the served path. **BLOCKED on a served replacement:** the installed epistemic-graph client and EG origin/main serve no write-time bitemporal stamping (`stamp_bitemporal`); EG must add it before this row can be delivered, and the caller must not be made to fail closed in its place.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 51
    },
    {
      "id": "AU-SEMANTIC-R011.8.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Repoint writeback and envelope ingest off source-validity stamping",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Repoint writeback and envelope ingest off source-validity stamping.** `enrichment/writeback/core.py` (`stamp_bitemporal`) and `ingestion/envelope_ingest.py` (`stamp_valid_from_source`, `stamp_valid_until_from_source`) stop importing the local module and take valid-from/valid-until stamping from the EG-served ingest path. | A census confirms those files no longer imports `knowledge_graph/core/bitemporal`, and its tests pass against the served path. **BLOCKED on a served replacement:** the installed epistemic-graph client and EG origin/main serve no source-reported valid-from/valid-until stamping (`stamp_valid_from_source`, `stamp_valid_until_from_source`); EG must add it before this row can be delivered, and the caller must not be made to fail closed in its place.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 52
    },
    {
      "id": "AU-SEMANTIC-R011.8.4",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Repoint `orchestration/engine_query.py` off local as-of filtering and supersession",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Repoint `orchestration/engine_query.py` off local as-of filtering and supersession.** `engine_query.py` stops importing `filter_as_of`, `resolve_precedence` and `supersede` and uses EG's served as-of read and supersession methods. | A census confirms `engine_query.py` no longer imports `knowledge_graph/core/bitemporal`, and its tests pass against the served path. **BLOCKED on a served replacement:** the installed epistemic-graph client and EG origin/main serve no as-of row filter (`filter_as_of`) or event-time contradiction precedence/supersession (`resolve_precedence`, `supersede`); EG must add it before this row can be delivered, and the caller must not be made to fail closed in its place.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 53
    },
    {
      "id": "AU-SEMANTIC-R011.8.5",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete the module once no importer remains",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete the module once no importer remains.** `knowledge_graph/core/bitemporal.py` is removed along with `tests/unit/knowledge_graph/test_kg_2_11_bitemporal.py` and its entry in `tests/gates/test_boundary_r018_r022_eg_duplicate_inventory.py`, and a `@pytest.mark.spec` deletion test binds the absence. | A forbidden-module census confirms `knowledge_graph/core/bitemporal.py` is absent and nothing under `agent_utilities/` or `scripts/` imports it.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 54
    },
    {
      "id": "AU-SEMANTIC-R011.9",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/ingest_worker.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "b02e3995039e"
      ],
      "verified_by": [
        "tests/gates/test_semantic_r011_9_deleted.py:19",
        "tests/gates/test_semantic_r011_9_deleted.py:29",
        "tests/gates/test_semantic_r011_9_deleted.py:60"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/knowledge_graph/ingest_worker.py`.** The local ingest-worker entry point is removed in favor of the EG-served durable-job path. | A forbidden-module census confirms `knowledge_graph/ingest_worker.py` is absent.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 55
    },
    {
      "id": "AU-SEMANTIC-R011.10",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/analytics_worker.py`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "92974bae8c3e"
      ],
      "verified_by": [
        "tests/gates/test_semantic_r011_10_deleted.py:33",
        "tests/gates/test_semantic_r011_10_deleted.py:42",
        "tests/gates/test_semantic_r011_10_deleted.py:62"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/knowledge_graph/analytics_worker.py`.** The local analytics-worker entry point is removed in favor of the EG-served durable-job path. | A forbidden-module census confirms `knowledge_graph/analytics_worker.py` is absent.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 56
    },
    {
      "id": "AU-SEMANTIC-R011.11",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/core/shared_resource_leases.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/core/shared_resource_leases.py`.** The local capacity-lease module is removed and its importers switched to EG's served capacity-lease methods. | A forbidden-module census confirms `core/shared_resource_leases.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 57
    },
    {
      "id": "AU-SEMANTIC-R011.12",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/core/state_store.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/core/state_store.py`.** The local state-store module is removed and its importers switched to EG's served state methods. | A forbidden-module census confirms `core/state_store.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 58
    },
    {
      "id": "AU-SEMANTIC-R011.13",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/core/chat_persistence.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/core/chat_persistence.py`.** The local chat-persistence module is removed and its importers switched to EG's served state methods. | A forbidden-module census confirms `core/chat_persistence.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 59
    },
    {
      "id": "AU-SEMANTIC-R012",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Tenancy, topology and admission authority move to EG",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8b325ddf1818"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Tenancy, topology and admission authority move to EG.** AU's tenancy, shard-topology, cluster-discovery, scoped-read and admission modules, including `tenant_sharing.py`, `tenant_registry.py`, `tenant_engine_pool.py`, `shard_topology.py`, `cluster_discovery.py`, `placement_catalog.py`, `secured_reads.py`, `cypher_scoping.py`, `host_lock.py`, `file_lock.py`, the `security/*_rbac_admission` modules, `admission_authority.py`, `permissions_kernel.py` and `entitlements.py`, are replaced by calls to EG's served identity-RBAC-admission and graph-ACL-isolation capabilities. | Negative tenant-isolation and admission tests confirm access decisions are made by the served EG capability and fail closed when it is unavailable.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 60
    },
    {
      "id": "AU-SEMANTIC-R013",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Reasoning and analytics duplicates are deleted only with proven EG parity",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Reasoning and analytics duplicates are deleted only with proven EG parity.** AU's local reasoning and graph-analytics modules, including `formal_reasoning_core.py`, `graph_primitives.py`, `inference_engine.py`, `reasoner.py`, `semantic_subsumption.py`, the topological, spectral, synergy, analogy, hypergraph, blast-radius, natural-language-query, hydration, world-model, ownership-claim and fingerprint modules, and the `kg/maintenance`, `id_management`, `argumentation` and `actions` packages, are deleted only after each one has documented, per-method parity evidence against its EG-native replacement. Split: size score above 6, more than 2 code roots named; children land the typed migration-scope manifest first, then per-module parity reports and deletion one group at a time. | A per-method parity report pairs each deleted AU function with its EG-native replacement and a passing equivalence test before the deletion lands.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 61
    },
    {
      "id": "AU-SEMANTIC-R013.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The AU-SEMANTIC-R013 core-reasoning migration scope is a typed, validated manifest",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "1558cd9d0726"
      ],
      "verified_by": [
        "tests/unit/core/test_r013_migration_scope.py:17",
        "tests/unit/core/test_r013_migration_scope.py:23",
        "tests/unit/core/test_r013_migration_scope.py:28"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The AU-SEMANTIC-R013 core-reasoning migration scope is a typed, validated manifest.** `agent_utilities/core/r013_migration_scope.py` enumerates the core reasoning modules (`formal_reasoning_core.py`, `graph_primitives.py`, `inference_engine.py`, `reasoner.py`, `semantic_subsumption.py`) in this first slice of the R013 migration scope as a typed tuple of repository-relative paths, with a validator that fails loud when a listed path is absent from the checkout, so the scope cannot silently drift from the requirement prose before the per-method parity reports and deletion children land. | `tests/unit/core/test_r013_migration_scope.py` asserts every listed path exists in the checkout and that the validator refuses (raises) on a manifest naming a missing path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 62
    },
    {
      "id": "AU-SEMANTIC-R014",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Ingestion commit and derivation logic moves to EG's SourceIngest",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "743e98cda405"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Ingestion commit and derivation logic moves to EG's SourceIngest.** The EG-owned half of AU's ingestion pipeline, including envelope ingest, change envelope, evidence spine, semantic event model, object-centric derivation, process conformance, embedding admission, GPU slot scheduling, promotion, supersession, dead letter, hydration manifest, skill/workflow ingest and governed documentation, is removed from AU and performed by the generated `SourceIngest` method on EG; `kg/ingestion/engine.py` is dissolved rather than kept as a single module. | Caller-parity tests confirm ingestion commit and derivation reach the served `SourceIngest` method with no remaining AU authority over the deleted modules.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 63
    },
    {
      "id": "AU-SEMANTIC-R015",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Enterprise source sync becomes an SDK runner over EG SourceIngest",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "703c3eb9d88d"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Enterprise source sync becomes an SDK runner over EG SourceIngest.** `kg/core/source_sync.py` is replaced by an SDK-hosted runner that calls EG's `SourceIngest` method and EG-provided manifest presets. The related external-graph, GraphQL-connection, Debezium-envelope, event-log and OCEL adapters, `governance_import.py`, `ecosystem/ea_clients.py`, `data_prep/**`, and `core/connection_profiler.py`/`data_prep_runtime.py`/`source_resolver.py` move out of AU accordingly. Split producer-first: this requirement depends on EG's not-yet-shipped `workflow_derivation` op (tracked by `EG-REPO-INGEST-R002`'s `skill_workflow_ingest` capability). See `AU-SEMANTIC-R015.1`/`.2`. | Source-ingestion ACL/admission negative tests confirm a denied source fails closed through the SDK runner and served EG manifest.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 64
    },
    {
      "id": "AU-SEMANTIC-R015.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "A typed `workflow_derivation` client contract fails closed while EG's op is absent",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4eac8c6dc419"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**A typed `workflow_derivation` client contract fails closed while EG's op is absent.** `api/workflow_derivation_client.py` declares the typed request/response shape and `WorkflowDerivationClient` Protocol the SDK-hosted source-sync runner will call once EG's generated `SourceIngest` client exposes `workflow_derivation` (producer: `EG-REPO-INGEST-R002`), and `resolve_workflow_derivation_client()` raises `WorkflowDerivationUnavailableError` rather than deriving locally via `kg/core/source_sync.py` or returning a default while that op is absent. | A test confirms `resolve_workflow_derivation_client()` raises with EG's generated client absent or lacking the op, and that the Protocol/dataclasses have the declared shape.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 65
    },
    {
      "id": "AU-SEMANTIC-R015.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The SDK-hosted source-sync runner consumes the shipped `workflow_derivation` op",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The SDK-hosted source-sync runner consumes the shipped `workflow_derivation` op.** Once `EG-REPO-INGEST-R002` ships `workflow_derivation` on the generated `SourceIngest` client, `resolve_workflow_derivation_client()` is wired to the real call and `kg/core/source_sync.py` and its listed adapters are removed from AU, closing `AU-SEMANTIC-R015`. Split producer-first: this requirement depends on EG's not-yet-shipped `workflow_derivation` op; `AU-SEMANTIC-R015.2.1` ships the typed migration-scope manifest the later cutover-and-deletion child builds against once the producer op ships. | Source-ingestion ACL/admission negative tests confirm a denied source fails closed through the SDK runner and served EG manifest.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 66
    },
    {
      "id": "AU-SEMANTIC-R015.2.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The AU-SEMANTIC-R015.2 migration scope is a typed, validated manifest",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "1558cd9d0726"
      ],
      "verified_by": [
        "tests/unit/core/test_r015_2_migration_scope.py:17",
        "tests/unit/core/test_r015_2_migration_scope.py:23",
        "tests/unit/core/test_r015_2_migration_scope.py:28"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The AU-SEMANTIC-R015.2 migration scope is a typed, validated manifest.** `agent_utilities/core/r015_2_migration_scope.py` enumerates `kg/core/source_sync.py` and its named adapters (`governance_import.py`, `ecosystem/ea_clients.py`, `connection_profiler.py`, `data_prep_runtime.py`, `source_resolver.py`) as a typed tuple of repository-relative paths, with a validator that fails loud when a listed path is absent from the checkout, so the scope cannot silently drift from the requirement prose before the EG-producer-blocked cutover and deletion land. | `tests/unit/core/test_r015_2_migration_scope.py` asserts every listed path exists in the checkout and that the validator refuses (raises) on a manifest naming a missing path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 67
    },
    {
      "id": "AU-SEMANTIC-R016",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Document, session and feed source ingestion moves to the SDK",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "76d440ff79dc"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Document, session and feed source ingestion moves to the SDK.** AU's document, repository, feed and conversation-ingestion modules, including its hosted-repository indexer, `conversation_ingestion.py`, `kg/ingestion/web_fetch.py`/`package_install_ingest.py`/`repo_*`, the top-level `ingestion/**`, `automation/worldmodel_pipeline.py`/`feed_sources.py`/`file_watcher.py`, `sdd/watcher.py`, the non-model-backed half of `kg/kb/**`, `kg/extraction/readers*`/`pdf`, and `ecosystem/media/**`, move to the connector SDK. Split: size score above 6, more than 2 code roots named, and cross-repo (AU \u2192 connector SDK). Children land producer (SDK) first, then the AU importer switch and deletion; `AU-SEMANTIC-R016.1` ships the AU-side typed migration-scope manifest the later children build against. | Caller-parity tests confirm document, session and feed ingestion reach the SDK connector path with equivalent behavior after the AU modules are removed.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 68
    },
    {
      "id": "AU-SEMANTIC-R016.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The AU-SEMANTIC-R016 migration scope is a typed, validated manifest",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "117359dabc9a",
        "1558cd9d0726",
        "76d440ff79dc"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The AU-SEMANTIC-R016 migration scope is a typed, validated manifest.** `agent_utilities/core/r016_migration_scope.py` enumerates the AU modules in the R016 migration scope as a typed tuple of repository-relative paths, with a validator that fails loud when a listed path is absent from the checkout, so the scope cannot silently drift from the requirement prose before the SDK copy and AU deletion children land. | `tests/unit/core/test_r016_migration_scope.py` asserts every listed path exists in the checkout and that the validator refuses (raises) on a manifest naming a missing path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 69
    },
    {
      "id": "AU-SEMANTIC-R017",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Vendor enrichment extraction and writeback move to the SDK and EG",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "2e5c8d7f2d8b"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Vendor enrichment extraction and writeback move to the SDK and EG.** AU's vendor-enrichment extractors under `kg/enrichment/extractors/**` become SDK manifest presets and adapters, its writeback logic under `kg/enrichment/writeback/**` moves behind the SDK `writeback/` module and EG's served `WriteBack` method, and `enrichment/git_history.py`/`source_adapters.py` move into the SDK's repository adapter. | Caller-parity and generated-contract tests confirm enrichment and writeback calls reach the SDK/EG path with no remaining AU-local writeback authority.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 70
    },
    {
      "id": "AU-SEMANTIC-R018",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Deterministic derivation modules move to EG",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Deterministic derivation modules move to EG.** AU's deterministic derivation modules, including `kg/enrichment/semantic.py`/`relation_projection.py`/`materialize.py`/`git_coupling.py`/`graph_collapse.py`/`provenance.py`, `kg/assimilation/**`, `kg/etl/**`, `kg/streams/**`, and the time-series portion of `kg/memory/**`, are removed from AU and performed by EG. Split: size score above 6, more than 2 code roots named. `AU-SEMANTIC-R018.1` ships the typed migration-scope manifest for the named `kg/enrichment` modules the later deletion and forbidden-module-census children build against. | Caller-parity tests and a forbidden-module census confirm the deleted paths resolve only through the served EG derivation methods.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 71
    },
    {
      "id": "AU-SEMANTIC-R018.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The AU-SEMANTIC-R018 enrichment migration scope is a typed, validated manifest",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "1558cd9d0726"
      ],
      "verified_by": [
        "tests/unit/core/test_r018_migration_scope.py:17",
        "tests/unit/core/test_r018_migration_scope.py:23",
        "tests/unit/core/test_r018_migration_scope.py:28"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The AU-SEMANTIC-R018 enrichment migration scope is a typed, validated manifest.** `agent_utilities/core/r018_migration_scope.py` enumerates the named `kg/enrichment` derivation modules (`semantic.py`, `relation_projection.py`, `materialize.py`, `git_coupling.py`, `graph_collapse.py`, `provenance.py`) in this first slice of the R018 migration scope as a typed tuple of repository-relative paths, with a validator that fails loud when a listed path is absent from the checkout, so the scope cannot silently drift from the requirement prose before the `kg/assimilation`/`kg/etl`/`kg/streams` children, deletion, and forbidden-module census land. | `tests/unit/core/test_r018_migration_scope.py` asserts every listed path exists in the checkout and that the validator refuses (raises) on a manifest naming a missing path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 72
    },
    {
      "id": "AU-SEMANTIC-R019",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Remaining EG-bound standardization, infra and governance modules move out",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "2e5c8d7f2d8b"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Remaining EG-bound standardization, infra and governance modules move out.** AU's remaining EG-bound modules, including `kg/standardization/**` excluding drift detection, `kg/infra/**`, `kg/quantum/**`, `kg/security/**`, `protocols/enterprise/**`, the `ecosystem/ard_*` modules, `observability/trace_ontology.py`/`self_ingest.py`/`audit_logger.py`, `governance/relational_authority.py`, and `research/placement_mining.py`, are removed from AU and their function is performed by EG. | A forbidden-module census and caller-parity tests confirm these modules are absent from AU and equivalent behavior is served by EG.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 73
    },
    {
      "id": "AU-SEMANTIC-R019.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/observability/trace_ontology.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/observability/trace_ontology.py`.** The local trace-ontology module (including `TraceCursor`/`load_trace_cursor`) is removed and its importers switched to EG's served equivalent. | A forbidden-module census confirms `observability/trace_ontology.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 75
    },
    {
      "id": "AU-SEMANTIC-R019.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/observability/self_ingest.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/observability/self_ingest.py`.** The local self-ingest module is removed and its importers switched to EG's served equivalent. Split: four production importers (`__main__.py`, `gateway/daemon.py`, `orchestration/engine.py`, `observability/__init__.py`) and two test files (`tests/unit/test_self_ingest.py`, `tests/gates/test_r028x_module_census.py`) need log-handler install and `emit_run_trace` behaviour that has no served EG replacement yet. Each importer is repointed in its own child before the module is deleted. See `AU-SEMANTIC-R019.3.1` to `.5`. | A forbidden-module census confirms `observability/self_ingest.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 76
    },
    {
      "id": "AU-SEMANTIC-R019.3.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`__main__.py` installs self-ingest logging through the EG-served client",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`__main__.py` installs self-ingest logging through the EG-served client.** `agent_utilities/__main__.py`'s `install_self_ingest_logging` call is repointed; the missing replacement is an EG-served OTLP log and RunTrace ingestion client (a generated `SelfIngest`/telemetry-ingest op on the EG client or SDK), which no served EG surface provides today, so this caller must be repointed to it once it ships and must not be stubbed or made to fail closed. | A test asserts `agent_utilities/__main__.py` does not import `observability.self_ingest`.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 77
    },
    {
      "id": "AU-SEMANTIC-R019.3.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`gateway/daemon.py` installs self-ingest logging through the EG-served client",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`gateway/daemon.py` installs self-ingest logging through the EG-served client.** `agent_utilities/gateway/daemon.py`'s `install_self_ingest_logging` call is repointed; the missing replacement is an EG-served OTLP log and RunTrace ingestion client (a generated `SelfIngest`/telemetry-ingest op on the EG client or SDK), which no served EG surface provides today, so this caller must be repointed to it once it ships and must not be stubbed or made to fail closed. | A test asserts `gateway/daemon.py` does not import `observability.self_ingest`.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 78
    },
    {
      "id": "AU-SEMANTIC-R019.3.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`orchestration/engine.py` exports run traces through the EG-served client",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`orchestration/engine.py` exports run traces through the EG-served client.** `_export_self_ingest_run_trace`'s `emit_run_trace` call is repointed; the missing replacement is an EG-served OTLP log and RunTrace ingestion client (a generated `SelfIngest`/telemetry-ingest op on the EG client or SDK), which no served EG surface provides today, so this caller must be repointed to it once it ships and must not be stubbed or made to fail closed. | A test asserts `orchestration/engine.py` does not import `observability.self_ingest`.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 79
    },
    {
      "id": "AU-SEMANTIC-R019.3.4",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`observability/__init__.py` no longer re-exports the self-ingest sink API",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`observability/__init__.py` no longer re-exports the self-ingest sink API.** The `from .self_ingest import ...` block and the matching `__all__` entries are removed after every consumer of those names is repointed; the missing replacement is an EG-served OTLP log and RunTrace ingestion client (a generated `SelfIngest`/telemetry-ingest op on the EG client or SDK), which no served EG surface provides today, so this caller must be repointed to it once it ships and must not be stubbed or made to fail closed. | A test asserts `observability/__init__.py` does not import `self_ingest`.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 80
    },
    {
      "id": "AU-SEMANTIC-R019.3.5",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`observability/self_ingest.py` is deleted",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`observability/self_ingest.py` is deleted.** With no importer left after `AU-SEMANTIC-R019.3.1` to `.4`, the module, `tests/unit/test_self_ingest.py`, its entries in `tests/gates/test_r028x_module_census.py`, and its `docs/concepts.yaml` references are removed. | A forbidden-module census confirms `observability/self_ingest.py` is absent and nothing under `agent_utilities/` or `scripts/` imports it.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 81
    },
    {
      "id": "AU-SEMANTIC-R019.4",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/observability/audit_logger.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/observability/audit_logger.py`.** The local audit-logger module is removed and its importers switched to EG's served equivalent. | A forbidden-module census confirms `observability/audit_logger.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 82
    },
    {
      "id": "AU-SEMANTIC-R019.5",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/governance/relational_authority.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/governance/relational_authority.py`.** The local relational-authority module is removed and its importers switched to EG's served equivalent. | A forbidden-module census confirms `governance/relational_authority.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 83
    },
    {
      "id": "AU-SEMANTIC-R019.6",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Delete `agent_utilities/knowledge_graph/research/placement_mining.py`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Delete `agent_utilities/knowledge_graph/research/placement_mining.py`.** The local placement-mining module is removed and its importers switched to EG's served equivalent. Split: three production importer surfaces (`core/engine_tasks.py`, `research/loop_controller.py`, `mcp/tools/state_tools.py`) plus the generated action manifests, the `PLACEMENT_CONTROL_LOOP_ENABLED` flag and five test files have no EG replacement to repoint to, so each surface is removed in its own child before the module itself is deleted; see `AU-SEMANTIC-R019.6.1` to `.4`. | A forbidden-module census confirms `knowledge_graph/research/placement_mining.py` is absent and prior importers' tests pass against the EG path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 84
    },
    {
      "id": "AU-SEMANTIC-R019.6.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The reactive placement-mining tick is removed from the engine scheduler",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "6b889c64f003"
      ],
      "verified_by": [
        "tests/gates/test_au_semantic_r019_6_1_tick_removed.py:18",
        "tests/gates/test_au_semantic_r019_6_1_tick_removed.py:24"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The reactive placement-mining tick is removed from the engine scheduler.** `_placement_mining_subscription`/`_tick_placement_mining_reactive` and the `placement_mining_reactive` maintenance job registration in `knowledge_graph/core/engine_tasks.py`, and its job-name entry in `core/schedule_engine.py`, are removed along with `tests/unit/graph/test_engine_subscription_reactive.py`'s placement-mining case and the related `test_concept_matcher.py` note. | A test asserts `engine_tasks.py` and `schedule_engine.py` contain no `placement_mining` reference and the engine's scheduled-job set no longer lists `placement_mining_reactive`.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 85
    },
    {
      "id": "AU-SEMANTIC-R019.6.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The `placement_control` stage and its setting are removed from the loop controller and config",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The `placement_control` stage and its setting are removed from the loop controller and config.** Split: the setting is referenced by seven files (`research/loop_controller.py`, `core/config.py`, `research/placement_mining.py` and the tests `test_loop_controller.py`, `test_config.py`, `test_config_generator.py`, `test_placement_mining.py`), more than one bite-sized change; see `AU-SEMANTIC-R019.6.2.1` and `.2`. | A test asserts a loop cycle report has no `placement_control` key and `config` has no `placement_control_loop_enabled` field.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 86
    },
    {
      "id": "AU-SEMANTIC-R019.6.2.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The `placement_control` stage is removed from the loop controller",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8e7d9986a683"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/test_loop_controller.py:590"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The `placement_control` stage is removed from the loop controller.** The `placement_control` report key, its `stage(...)` call and docstring mentions in `knowledge_graph/research/loop_controller.py` are removed, with `test_run_one_cycle_placement_control_uses_typed_opt_in` in `tests/unit/knowledge_graph/test_loop_controller.py`. | A test asserts a `run_one_cycle` report has no `placement_control` key.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 87
    },
    {
      "id": "AU-SEMANTIC-R019.6.2.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The `placement_control_loop_enabled` setting is removed from config",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "bb4178637fc9"
      ],
      "verified_by": [
        "tests/unit/core/test_config.py:20"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The `placement_control_loop_enabled` setting is removed from config.** The field in `core/config.py`, its opt-in read in `placement_control_loop` (`research/placement_mining.py`, which then requires an explicit `enabled`), `tests/unit/core/test_config.py`'s typed-opt-in test, `test_config_reference_exposes_placement_control_opt_in` in `tests/unit/deployment/test_config_generator.py` and the config monkeypatches in `tests/unit/knowledge_graph/test_placement_mining.py` are removed or updated. Depends on `AU-SEMANTIC-R019.6.2.1`. | A test asserts `AgentConfig` has no `placement_control_loop_enabled` field.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 88
    },
    {
      "id": "AU-SEMANTIC-R019.6.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The `graph_loops` `placement_control` action is removed",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The `graph_loops` `placement_control` action is removed.** Split: removing the action changes `mcp/tools/state_tools.py` and three generated artifacts (`mcp/_graphos_action_manifest.py`, `docs/capabilities-power.json`/`.md`, `knowledge_graph/retrieval/capabilities-power.json`), and the generators (`scripts/gen_graphos_manifest.py`, `scripts/gen_capability_power.py`) only reproduce the committed manifests in an environment that has the full engine tool surface installed (a bare worktree venv drops the `engine_*` tools and rewrites unrelated entries); see `AU-SEMANTIC-R019.6.3.1` and `.2`. | A test asserts the `graph_loops` action list and generated manifests no longer name `placement_control`.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 89
    },
    {
      "id": "AU-SEMANTIC-R019.6.3.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The `placement_control` action and its parameters are removed from `graph_loops`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "e21a74412b1b"
      ],
      "verified_by": [
        "tests/unit/mcp/test_graph_loops_placement_removed.py:12"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The `placement_control` action and its parameters are removed from `graph_loops`.** `_loops_placement_control_action`, its dispatch entry, the action-list description text, the `placement_scan_limit`/`placement_canary_tolerance` fields of `_LoopsParams` and the tool signature, and their pass-through, are removed from `mcp/tools/state_tools.py`. | A test asserts `mcp/tools/state_tools.py` contains no `placement_control`, `placement_scan_limit` or `placement_canary_tolerance`.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 90
    },
    {
      "id": "AU-SEMANTIC-R019.6.3.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The generated manifests are regenerated without `placement_control`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The generated manifests are regenerated without `placement_control`.** Run `scripts/gen_graphos_manifest.py` and `scripts/gen_capability_power.py --write` in an environment with the full tool surface (engine tools present) so only the `graph_loops_placement_control` entry and the `placement_control` parameter text change in `mcp/_graphos_action_manifest.py`, `docs/capabilities-power.json`/`.md` and `knowledge_graph/retrieval/capabilities-power.json`. Depends on `AU-SEMANTIC-R019.6.3.1`. | A test asserts the action manifest and the three capability catalogs name no `placement_control`.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 91
    },
    {
      "id": "AU-SEMANTIC-R019.6.4",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`knowledge_graph/research/placement_mining.py` is deleted",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`knowledge_graph/research/placement_mining.py` is deleted.** With no importer left after `AU-SEMANTIC-R019.6.1` to `.3`, the module, `tests/unit/knowledge_graph/test_placement_mining.py` and its entries in `tests/gates/test_r028x_module_census.py` and `tests/unit/observability/test_trace_ontology.py` are removed. | A forbidden-module census confirms `knowledge_graph/research/placement_mining.py` is absent and nothing under `agent_utilities/` or `scripts/` imports it.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 92
    },
    {
      "id": "AU-SEMANTIC-R020",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The ontology object model moves to EG",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5a201ecff633"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The ontology object model moves to EG.** AU's ontology object-model modules under `kg/ontology/**`, including `object_set`, `property_types`, `derived_properties`, `links`, `functions/**`, `edits/**`, `indexing/**`, `classification_claims`, `permissioning*`, `document_processing`, `schema_graph`, `ops_causal_crosswalk`, `repository_provenance`, `style_lint`, the `*_objects` modules and `object_path`, move to EG, apart from the files retained for the AU-SEMANTIC-R021 emitter cut and the SDK manifest files; `sync_conflict` and `leanix_metamodel` move to the SDK instead. Split: size score above 6, more than 2 code roots named. Children land the typed migration-scope manifest first, then the EG copy and the AU importer switch and deletion; `AU-SEMANTIC-R020.1` ships the AU-side migration-scope manifest. | A forbidden-module census and generated-client conformance tests confirm the ontology object model resolves through EG with AU retaining no local authority.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 93
    },
    {
      "id": "AU-SEMANTIC-R020.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The AU-SEMANTIC-R020 migration scope is a typed, validated manifest",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5a201ecff633"
      ],
      "verified_by": [
        "tests/unit/core/test_r020_migration_scope.py:17",
        "tests/unit/core/test_r020_migration_scope.py:23",
        "tests/unit/core/test_r020_migration_scope.py:28"
      ],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The AU-SEMANTIC-R020 migration scope is a typed, validated manifest.** `agent_utilities/core/r020_migration_scope.py` enumerates the AU ontology object-model modules in the R020 migration scope (excluding the AU-SEMANTIC-R021 emitter-cut files, the SDK manifest files, and `sync_conflict`/`leanix_metamodel`) as a typed tuple of repository-relative paths, with a validator that fails loud when a listed path is absent from the checkout, so the scope cannot silently drift from the requirement prose before the EG copy and deletion children land. | `tests/unit/core/test_r020_migration_scope.py` asserts every listed path exists in the checkout and that the validator refuses (raises) on a manifest naming a missing path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 94
    },
    {
      "id": "AU-SEMANTIC-R021",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "AU's hand-written RDF/OWL/SHACL emitters move behind EG pack compilation",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "2e5c8d7f2d8b",
        "5a201ecff633",
        "9f04ed59f946"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**AU's hand-written RDF/OWL/SHACL emitters move behind EG pack compilation.** AU's hand-written ontology emitters (`ontology/value_types.py`/`interfaces.py`/`manifest_compiler.py`/`leanix_metamodel.py`), `extraction/schema_discovery.py`, `core/ontology_publisher.py`, `scripts/scaffold_ontology_leg.py`, and the declared-semantic-validation step in connector certification are removed; AU keeps only typed declarations, and connector-manifest-to-ontology compilation runs as EG pack compilation. | A forbidden-import census and a generated-contract test confirm AU emits no RDF/OWL/SHACL text and that manifest compilation succeeds through the EG pack-compilation path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 95
    },
    {
      "id": "AU-SEMANTIC-R021.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`core/ontology_publisher.py` is removed",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "023174b91e2e"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`core/ontology_publisher.py` is removed.** AU's `core/ontology_publisher.py` RDF/OWL/SHACL publisher, and its one caller in `setup/database_environment.py`, are removed; AU emits no RDF/OWL/SHACL text from this module. | A forbidden-import census confirms `core/ontology_publisher.py` is absent from AU and nothing imports it.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 96
    },
    {
      "id": "AU-SEMANTIC-R021.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`extraction/schema_discovery.py` moves behind EG pack compilation",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "690785a51851"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`extraction/schema_discovery.py` moves behind EG pack compilation.** AU's `extraction/schema_discovery.py` hand-written schema-discovery emitter is removed; connector-manifest-to-ontology compilation runs as EG pack compilation instead. | A forbidden-import census and a generated-contract test confirm `extraction/schema_discovery.py` is absent and manifest compilation succeeds through the EG pack-compilation path.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 97
    },
    {
      "id": "AU-SEMANTIC-R021.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The `ontology/` hand-written emitters move behind EG pack compilation",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "472e6ab23472"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The `ontology/` hand-written emitters move behind EG pack compilation.** AU's `ontology/value_types.py`, `interfaces.py`, `manifest_compiler.py` and `leanix_metamodel.py` hand-written RDF/OWL/SHACL emitters are removed; AU keeps only typed declarations. | A forbidden-import census confirms these four modules are absent from AU and connector certification's declared-semantic-validation step runs through EG pack compilation instead.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 98
    },
    {
      "id": "AU-SEMANTIC-R021.4",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "`scripts/scaffold_ontology_leg.py` and its connector-certification step are removed",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "023174b91e2e",
        "690785a51851"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**`scripts/scaffold_ontology_leg.py` and its connector-certification step are removed.** AU's `scripts/scaffold_ontology_leg.py` scaffolding script and the declared-semantic-validation step in connector certification that calls it are removed. | A forbidden-import census confirms the script and its certification step are absent from AU.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 99
    },
    {
      "id": "AU-SEMANTIC-R022",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Graph-schema DTOs become EG-generated types",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c23e42b6ed43"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Graph-schema DTOs become EG-generated types.** AU's hand-maintained graph-schema models, including `models/knowledge_graph.py`/`schema_definition.py`/`evidence_bundle.py`/`knowledge_pack.py`/`codemap.py`/`graph.py`/`knowledge_base.py`, `models/schema_pack*`, and `models/schema_packs/**`, are replaced by EG-generated types, followed by `kg/domain_packs/**` once AU-SEMANTIC-R005 has removed `pack_loader`. | Model-level unit tests assert callers use the EG-generated DTOs, and a duplicate-type census finds no second hand-written definition.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 100
    },
    {
      "id": "AU-SEMANTIC-R022.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Typed composition of the generated graph-schema DTO surface",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "da51647a7383"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Typed composition of the generated graph-schema DTO surface.** `api/graph_schema_types.py` adds `GraphSchemaTypes`, the one typed composition callers of `models/knowledge_graph.py`/`schema_definition.py`/`evidence_bundle.py` will build EG-generated DTO instances through, failing closed with `GraphSchemaTypesUnavailable` when the installed EG client is `None` or missing the required constructor surface. | A unit test asserts `GraphSchemaTypes.for_client` refuses a missing/partial EG client and delegates DTO construction when the surface is present; call-site migrations are separate `.2`+ children.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 101
    },
    {
      "id": "AU-SEMANTIC-R023",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Legacy SPARQL backend and setup modules are deleted",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "a05257fb6541"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Legacy SPARQL backend and setup modules are deleted.** AU deletes `kg/backends/sparql/**`, `kg/setup/**` including its database-setup script, and `kg/integrations/stardog_sync.py`/`sparql_ingestor.py`, since these address only already-legacy external SPARQL stores that are out of scope for the federation covered by AU-SEMANTIC-R024. | A file census confirms the listed modules and script are absent from AU.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 102
    },
    {
      "id": "AU-SEMANTIC-R024",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "External graph and database backends move into EG as federation sources",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "274d4c375294"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**External graph and database backends move into EG as federation sources.** AU's remaining external graph/database backend modules, including `fanout_backend`, `postgresql_backend`, `cypher_transpiler`, `age_backend`, `contrib/**`, `mirror_target`, `outbox`, `brain_guarded_backend`, `trino_backend` and `spark_jobs`, covering Postgres/AGE, Neo4j, FalkorDB, the fan-out mirror, Trino and Spark, move into EG as federation and mirror targets; none of them are deleted outright. | Caller-parity tests and a forbidden-module census confirm each backend resolves through the EG federation path with equivalent behavior.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 103
    },
    {
      "id": "AU-SEMANTIC-R025",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Retrieval and neural-search engines move to EG",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c23e42b6ed43"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Retrieval and neural-search engines move to EG.** AU's retrieval and neural-search modules, including the hybrid, semantic, reranking, hierarchical-document, memory, code-context, lineage and autocut retrievers under `kg/retrieval/**`, `kg/neural/**`, and the OpenSearch change-data-capture indexer in `kg/search/**`, move to EG; AU retains only context compilation and the capability index. | Tenant-scoped served-read tests confirm retrieval resolves through EG with AU keeping no local retrieval authority beyond context compilation.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 104
    },
    {
      "id": "AU-SEMANTIC-R025.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Typed composition of the generated EG retrieval surface",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c23e42b6ed43",
        "da51647a7383"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Typed composition of the generated EG retrieval surface.** `api/retrieval_client.py` adds `RetrievalClient`, the one typed composition AU's retained context-compilation call sites will route hybrid/semantic/rerank retrieval through, failing closed with `RetrievalClientUnavailable` when the installed EG client is `None` or missing the required surface. | A unit test asserts `RetrievalClient.for_client` refuses a missing/partial EG client and delegates when the surface is present; call-site migrations are separate `.2`+ children.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 105
    },
    {
      "id": "AU-SEMANTIC-R026",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "The schema-drift package is re-homed before it lands",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "5e15da9f9e40"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**The schema-drift package is re-homed before it lands.** AU's unlanded `kg/schema_drift/` package is re-homed so that its drift gate (`gate`, `shape`, `classify`, `report`) runs inside the SDK's connector-sync runner between drain and apply, and its `candidate.py` SHACL rendering, `contract_store` and `activation` move to EG instead of running inside AU. | A forbidden-SHACL-rendering census confirms AU no longer renders SHACL in `candidate.py`, and an integration test confirms the drift gate runs correctly from the SDK runner.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 106
    },
    {
      "id": "AU-SEMANTIC-R027",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Capability-gap checks must search the target system's own vocabulary",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c23e42b6ed43"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Capability-gap checks must search the target system's own vocabulary.** Before concluding that a capability is missing from the generated EG client, the check searches EG's own public surface, such as its method catalog, generated contract or documentation, under EG's own naming, rather than grepping EG source for AU's internal names; a zero-match search for AU vocabulary is not treated as proof the capability does not exist. | A capability-gap determination records which EG-side surface was searched, under EG's own terms, before any migration work is filed against it.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 107
    },
    {
      "id": "AU-SEMANTIC-R027.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Typed capability-gap record refuses an unverified \"missing\" verdict",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c23e42b6ed43",
        "da51647a7383"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Typed capability-gap record refuses an unverified \"missing\" verdict.** `api/capability_gap_check.py` adds `CapabilityGapResult`/`EGSurfaceSearch`, the typed record of an EG-side surface search (method catalog, generated contract, or documentation); `CapabilityGapResult.determine` raises `CapabilityGapUnverified` when a \"missing\" verdict carries no recorded EG-side search. | A unit test asserts a \"missing\" verdict is refused without a recorded search and accepted once one is attached; the migration-filing call sites are separate `.2`+ children.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 108
    },
    {
      "id": "AU-SEMANTIC-R028",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Configured embedding dimension must match the deployed model's output size",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "12e4a7fe9749"
      ],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Configured embedding dimension must match the deployed model's output size.** The `kg_embedding_dim` setting in `agent_utilities/core/config.py`, overridable via `KG_EMBEDDING_DIM`, must equal the actual output dimensionality of the configured embedding model, since the PostgreSQL, AGE and Neo4j backends and the schema-definition and ontology document-processing/property-type modules all size their vector columns from this one setting; a mismatch between the configured value and the model's real dimension must be caught rather than silently applied. | A negative test asserts `configured_embedding_dimension()`/`validate_embedding_vectors` fail loud on a dimension mismatch instead of silently degrading enrichment.",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 109
    },
    {
      "id": "AU-SEMANTIC-R029",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Evolution runs apply a received per-stage model allocation and record cost in the trace",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Evolution runs apply a received per-stage model allocation and record cost in the trace.** agent-utilities applies the allocation it receives from EG-DECISION-ENGINE to each stage of a multi-step evolution run. It records each stage's model and cost in the run trace. [arXiv:2604.07725] | `See children `AU-SEMANTIC-R029.1` to `AU-SEMANTIC-R029.6`.`",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 110
    },
    {
      "id": "AU-SEMANTIC-R029.1",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Model.** `StageAllocation` in `agent_utilities/harness/agentic_evolution_engine.py` carries the stage, the received model identifier and the observed cost. `RunBudget` carries the received total cost limit. EG-DECISION-ENGINE produces both the allocation and the limit. | `tests/unit/harness/test_stage_model_allocation.py::test_stage_allocation_fields`",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 111
    },
    {
      "id": "AU-SEMANTIC-R029.2",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Behavior.** The engine must apply the received model for each stage. It must stop when the received `RunBudget` is spent. It must not choose a model itself. | `tests/unit/harness/test_stage_model_allocation.py::test_applies_received_allocation`",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 112
    },
    {
      "id": "AU-SEMANTIC-R029.3",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Wiring.** `run_evolution_cycle` (`agent_utilities/harness/agentic_evolution_engine.py:316`) must apply the allocation for each stage. Its production caller is `_analysis_action_evolve_variants` at `agent_utilities/mcp/tools/analysis_tools.py:976`. No stage model is applied there today. | `tests/unit/harness/test_stage_model_allocation.py::test_cycle_calls_allocation`",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 113
    },
    {
      "id": "AU-SEMANTIC-R029.4",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Refusal.** When the received budget cannot cover a stage, the engine must refuse with the typed reason `budget_exhausted`. When no allocation is received, the engine must abstain and must not default to the strongest model. | `tests/unit/harness/test_stage_model_allocation.py::test_budget_exhausted_refuses`",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 114
    },
    {
      "id": "AU-SEMANTIC-R029.5",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Evidence.** Each stage must write its model identifier, cost and the running total to the run trace through the `trace_id` already accepted at `agent_utilities/harness/agentic_evolution_engine.py:316`. | `tests/unit/harness/test_stage_model_allocation.py::test_allocation_in_trace`",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 115
    },
    {
      "id": "AU-SEMANTIC-R029.6",
      "kind": "requirement",
      "parent": "AU-SEMANTIC",
      "source": "specs/au-semantic-client/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-SEMANTIC \u2014 AU semantic client and generated contract",
      "definition": "**Hot-path proof.** The entry point is the served `evolve_variants` analysis action. A run given an allocation with one stronger stage must apply that model there and record cost for each stage. Test path: `tests/integration/test_stage_allocation_served.py`. | `tests/integration/test_stage_allocation_served.py::test_served_evolve_variants_allocation`",
      "definition_source": "specs/au-semantic-client/requirements.md",
      "definition_line": 116
    },
    {
      "id": "AU-BASELINE",
      "kind": "spec",
      "parent": null,
      "source": "specs/baseline-ingestion/status.json",
      "title": "AU-BASELINE \u2014 Baseline ingestion and served ontology content",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/baseline-ingestion/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/baseline-ingestion/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/check_complexity_staged.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/check_complexity_staged.py"
        },
        {
          "declared_in": "specs/baseline-ingestion/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/check_event_loop_blocking.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/check_event_loop_blocking.py"
        },
        {
          "declared_in": "specs/baseline-ingestion/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/check_no_env_sprawl.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/check_no_env_sprawl.py"
        },
        {
          "declared_in": "specs/baseline-ingestion/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/check_swallowed_errors.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/check_swallowed_errors.py"
        },
        {
          "declared_in": "specs/baseline-ingestion/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "spec.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/baseline-ingestion/spec.md"
        },
        {
          "declared_in": "specs/baseline-ingestion/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "test-spec.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/baseline-ingestion/test-spec.md"
        },
        {
          "declared_in": "specs/baseline-ingestion/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "plan.md#architecture",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/baseline-ingestion/plan.md#architecture"
        },
        {
          "declared_in": "specs/baseline-ingestion/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "plan.md#interfaces-and-data-model",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/baseline-ingestion/plan.md#interfaces-and-data-model"
        },
        {
          "declared_in": "specs/baseline-ingestion/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "plan.md#live-integration-path",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/baseline-ingestion/plan.md#live-integration-path"
        },
        {
          "declared_in": "specs/baseline-ingestion/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements table",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/baseline-ingestion/requirements.md"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "AU-BASELINE-R001",
      "kind": "requirement",
      "parent": "AU-BASELINE",
      "source": "specs/baseline-ingestion/status.json",
      "title": "The daemon role starts baseline ingestion in the background after boot",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "06a3810b9373",
        "f9b25e33b179"
      ],
      "verified_by": [],
      "parent_title": "AU-BASELINE \u2014 Baseline ingestion and served ontology content",
      "definition": "**The daemon role starts baseline ingestion in the background after boot.** `start_background_daemons` starts one `KG-Baseline-Ingest` thread under the verified daemon session. The thread plans and enqueues WorkItems, then ends. A launch or planning error logs once and never propagates. `KG_BASELINE_INGEST=0` disables it, and `KG_DEV_MODE` silences it with the other daemons. | Unit tests prove one start per engine, the off switch, a swallowed launch error and a swallowed planning error.",
      "definition_source": "specs/baseline-ingestion/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-BASELINE-R002",
      "kind": "requirement",
      "parent": "AU-BASELINE",
      "source": "specs/baseline-ingestion/status.json",
      "title": "The baseline covers grounding content only",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "06a3810b9373"
      ],
      "verified_by": [],
      "parent_title": "AU-BASELINE \u2014 Baseline ingestion and served ontology content",
      "definition": "**The baseline covers grounding content only.** It enqueues one prompt-library WorkItem, one `skill_workflows` WorkItem per configured skill provider and one `codebase` WorkItem per in-scope workspace repository, capped by `KG_BASELINE_MAX_CODEBASES`. Skill targets name a provider, never a machine path. The baseline never calls `source_sync source=all`. | Unit tests prove the planned legs, the provider targets, the `core`, `all`, list and `none` scopes, the cap and a workspace scan failure that keeps the other legs.",
      "definition_source": "specs/baseline-ingestion/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-BASELINE-R003",
      "kind": "requirement",
      "parent": "AU-BASELINE",
      "source": "specs/baseline-ingestion/status.json",
      "title": "Baseline ingestion is idempotent and isolated per item",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "06a3810b9373"
      ],
      "verified_by": [],
      "parent_title": "AU-BASELINE \u2014 Baseline ingestion and served ontology content",
      "definition": "**Baseline ingestion is idempotent and isolated per item.** Each leg reuses a content-hash delta ingest path. A target with a live WorkItem is deduplicated by `submit_task`. One rejected item never blocks the others. | Unit tests prove per-item rejection reporting. Existing delta tests cover the reused prompt, skill and code ingest paths.",
      "definition_source": "specs/baseline-ingestion/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-BASELINE-R004",
      "kind": "requirement",
      "parent": "AU-BASELINE",
      "source": "specs/baseline-ingestion/status.json",
      "title": "AU orders ingestion by the EG stage sequence",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "06a3810b9373"
      ],
      "verified_by": [],
      "parent_title": "AU-BASELINE \u2014 Baseline ingestion and served ontology content",
      "definition": "**AU orders ingestion by the EG stage sequence.** The table maps S1 to `fast`, S2 and S3 to `medium`, and S4 to S6 to `slow_heavy`. Each AU task type has an entry stage. The baseline enqueues in class order at the class priority bucket and stamps leg, class and stage on each WorkItem. | Unit tests prove the stage table, the task-type routing, the priority buckets and the stamped metadata.",
      "definition_source": "specs/baseline-ingestion/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-BASELINE-R005",
      "kind": "requirement",
      "parent": "AU-BASELINE",
      "source": "specs/baseline-ingestion/status.json",
      "title": "Factory-built fleet servers serve ontology providers as MCP resources",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "06a3810b9373"
      ],
      "verified_by": [],
      "parent_title": "AU-BASELINE \u2014 Baseline ingestion and served ontology content",
      "definition": "**Factory-built fleet servers serve ontology providers as MCP resources.** `create_mcp_server` registers each `agent_utilities.ontology_providers` root through the SDK `register_ontology_resources` helper. Ontology files become `ontology://` resources and shape files become `shapes://` resources. One bad provider is skipped with a warning. | Unit tests read the resources through an MCP client and prove the skip and the degrade-to-zero paths.",
      "definition_source": "specs/baseline-ingestion/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-HARNESS",
      "kind": "spec",
      "parent": null,
      "source": "specs/harness-evolution/status.json",
      "title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/harness-evolution/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/capabilities/composition.py:160",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/capabilities/composition.py#L160"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/capabilities/telemetry_instrumentation.py:40",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/capabilities/telemetry_instrumentation.py#L40"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/core/model_concurrency.py:296",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/core/model_concurrency.py#L296"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/core/registry/kg_adapter.py:660",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/core/registry/kg_adapter.py#L660"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/harness/aegis_loop.py:274",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/harness/aegis_loop.py#L274"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/harness/assimilation_benchmark.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/harness/assimilation_benchmark.py"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/harness/edit_engine.py:457",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/harness/edit_engine.py#L457"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/harness/harness_gate.py:127",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/harness/harness_gate.py#L127"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/harness/substrate_trainer.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/harness/substrate_trainer.py"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/observability/custom_observability.py:850",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/observability/custom_observability.py#L850"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/observability/replay_engine.py:48",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/observability/replay_engine.py#L48"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/observability/replay_engine.py:81",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/observability/replay_engine.py#L81"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/orchestration/agent_runner.py:702",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/orchestration/agent_runner.py#L702"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/rlm/config.py:60",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/rlm/config.py#L60"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/rlm/repl.py:470",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/rlm/repl.py#L470"
        },
        {
          "declared_in": "specs/harness-evolution/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/rlm/repl.py:972",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/rlm/repl.py#L972"
        },
        {
          "declared_in": "specs/harness-evolution/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/harness-evolution/requirements.md"
        },
        {
          "declared_in": "specs/harness-evolution/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/harness-evolution/status.json"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/harness-evolution/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "agent control plane",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/agent-control-plane/spec.md"
        }
      ],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "AU-HARNESS-R001",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Capability-gated capture of policy trajectories",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3279dcc7d1d7",
        "42f6dada3749",
        "fdeabad709b3"
      ],
      "verified_by": [
        "tests/unit/harness/test_policy_evolution.py:189",
        "tests/unit/harness/test_policy_evolution.py:213",
        "tests/unit/harness/test_policy_evolution.py:234"
      ],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Capability-gated capture of policy trajectories.** AU attests a model provider's capability before capturing anything. The provider exposes chosen-token log probabilities, an immutable behavior-policy version, and a fixed tokenizer/decode identity. AU then records each terminal trajectory in the engine's existing content-addressed blob store. The record holds frozen sampler log probabilities, version, action mask, reward and provenance. It reuses the existing trajectory start/step and WorkItem authority rather than inventing new storage. Capture, training and promotion are three independent controls that default to off. No gradients or saved model-weight bytes are written to the graph. | Capability and default-off negative tests confirm capture refuses unsupported, closed or unversioned providers, and that training and promotion stay off until each is explicitly enabled.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-HARNESS-R002",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "External training path supports an optional KLPO method",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "37a3800dd3b1",
        "42f6dada3749",
        "fdeabad709b3"
      ],
      "verified_by": [
        "tests/unit/harness/test_substrate_trainer.py:148"
      ],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**External training path supports an optional KLPO method.** AU extends its provider-capability and job-receipt model to support an optional KLPO training method alongside GRPO, DPO and SFT. The initial experiment produces only a new LoRA adapter artifact rather than overwriting a base model. Training runs as externally leased jobs that protect the existing inference service-level objective. Any serving-pointer promotion requires a passing held-out evaluation. Training and promotion stay off until their receipts pass. | Injected-dispatcher and receipt tests confirm a KLPO job emits a valid run receipt. They confirm that promotion is blocked until held-out evaluation passes.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-HARNESS-R003",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Graph-driven work market on Gap and WorkItem contracts",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "42f6dada3749",
        "d1fdedd885f3",
        "d856d0bd92f6",
        "fdeabad709b3"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/test_work_market.py:83"
      ],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Graph-driven work market on Gap and WorkItem contracts.** An evidence signal atomically upserts a single canonical Gap and its corresponding WorkItem through the typed engine contract. AU derives a versioned work offer, including expected utility, closure probability, cost, uncertainty, blast radius, cooldown and dependencies, from that evidence; the engine's Decide contract ranks legal offers with an initial deterministic utility-rate function and commits its decision record; and only then does the existing fenced WorkItem claim, progress-tracking and terminal-outcome authority admit execution. Selection runs from event triggers plus a bounded periodic reconciliation pass, with no separate AU-side sort or scheduler. | A fixture test shows one evidence signal produces exactly one Gap and one claimable WorkItem, and that execution only proceeds after a committed Decide record exists.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-HARNESS-R004",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "AU proposes corrections through the graph, never writes Git directly",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "26bfecfbde1a"
      ],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**AU proposes corrections through the graph, never writes Git directly.** AU records a proposed gap, specification, change and supporting evidence through the typed engine contract and submits it for authorization; AU itself never creates a Git checkout, applies a patch, or commits a change directly. Only after an authorized correction is materialized through repository-manager and an immutable receipt is re-ingested does the originating gap become eligible to resolve, and AU removes its own local publishing and direct-Git code paths along with any dual-write fallback. Split (score > 6, cross-cutting: typed model, authorization routing, repository-manager materialization, receipt ingestion, and removal of `change_publisher`'s direct-Git path each touch distinct code roots): `AU-HARNESS-R004.1` ships the typed proposal model first; later children route it through authorization, materialize it, ingest the receipt, and retire the direct-Git path. | A source gate confirms no AU code path writes to Git directly, and an end-to-end test shows a gap only resolves after a materialization receipt is ingested.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-HARNESS-R004.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Typed correction-proposal model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "068bd9c17859",
        "42f6dada3749"
      ],
      "verified_by": [
        "tests/knowledge_graph/research/test_correction_proposal.py:31",
        "tests/knowledge_graph/research/test_correction_proposal.py:47",
        "tests/knowledge_graph/research/test_correction_proposal.py:53"
      ],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Typed correction-proposal model.** AU defines a typed `CorrectionProposal` (gap reference, specification, change reference, evidence, lifecycle status) and a typed `MaterializationReceipt`, with no Git-side fields (no repo path, worktree, branch, commit sha, patch or diff). Construction validates required fields and known statuses and refuses a proposal carrying any direct-Git metadata field. A `materialized` proposal is eligible to resolve only once it carries a `MaterializationReceipt`. | Validation tests cover every required field and the unknown-status case; refusal tests cover a missing receipt on `materialized` status and a proposal carrying a direct-Git metadata field.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-HARNESS-R005",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Defer generative model work pending evidence-backed need",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "42f6dada3749",
        "a754f1299033"
      ],
      "verified_by": [
        "tests/harness/test_generative_model_policy.py:20"
      ],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Defer generative model work pending evidence-backed need.** AU defers requesting a microGPT-style generative model, in-engine autograd, a generative UQL-producing model, or a KLPO loss implementation until a separate evidence-backed need demonstrates held-out benefit, cost and safety. In the meantime, AU reuses the existing typed Decide ladder, covering legal-option derivation, calibrated probabilities, cost-sensitive optimal choice, provenance, abstention, natural-language templating and constrained UQL generation, and does not treat a bounded resident scorer as authorization for a generative model. | A review confirms no generative or autograd model work proceeds without an approved held-out benefit, cost and safety record, and Decide-ladder tests cover legal-option derivation, calibration, abstention and constrained UQL output.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-HARNESS-R006",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Statistical scoring head ranks work-market offers",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "42f6dada3749",
        "75dc28c16382",
        "c0e12b7034f3"
      ],
      "verified_by": [
        "tests/unit/knowledge_graph/test_work_market.py:202",
        "tests/unit/knowledge_graph/test_work_market.py:243"
      ],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Statistical scoring head ranks work-market offers.** AU defines a feature schema and slate-crediting method and builds a gold evaluation set to fit and evaluate a scoring head for work-market offers, promoting it only through the governed promotion gate; offer expected cost is computed from the Decide-based work-market design. A synthetic width-quality benchmark exercises the scorer end to end. | Benchmarks measure scorer quality against the synthetic width-quality fixture, and head-promotion tests confirm promotion only occurs through the governed gate.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-HARNESS-R007",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "One typed L4 harness port",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "05d0acdf70b2",
        "3df03825a497",
        "42f6dada3749",
        "579815031bcd",
        "b15fd573cb5b"
      ],
      "verified_by": [
        "tests/unit/layers/test_harness_port.py:116",
        "tests/unit/layers/test_harness_port.py:125",
        "tests/unit/layers/test_harness_port.py:135"
      ],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**One typed L4 harness port.** AU defines one `HarnessPort` protocol between L3 agent graphs and runtimes. A port has a `name` and an async `run` method. `run` takes a frozen `HarnessRequest` and returns a frozen `RunOutcome`. The outcome carries status, final text, structured output, exit code, transcript reference, diff stat, usage, cost, model, duration and error. A port that cannot start returns a typed `refused` outcome. A new runtime, such as a LangGraph runner, is one class registered by name. No stub adapter ships for it. | A shared conformance check passes for every shipped adapter. A strictness test rejects an unknown status and any mutation.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-HARNESS-R008",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Native harness over the pydantic-ai path",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "579815031bcd",
        "b15fd573cb5b"
      ],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Native harness over the pydantic-ai path.** The `native` adapter calls `run_agent` unchanged and requests its run-summary envelope. That path keeps typed tool calls, structured output, token accounting, Langfuse and OTel trace export and the RunTrace write. The adapter maps the envelope into a `RunOutcome` and marks it recorded. It enforces the request timeout and never writes a second trace. | Tests with an injected runner prove the call arguments, envelope mapping, JSON output parsing, degraded failure text and typed timeout.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-HARNESS-R009",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Claude Code headless harness",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "579815031bcd",
        "b15fd573cb5b"
      ],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Claude Code headless harness.** The `claude-code` adapter runs `claude -p --output-format json` once per request. Flags are pinned: strict MCP configuration, project setting sources only, an explicit permission mode and the MCP configuration file. The MCP configuration names graph-os as its only server, so every MCP tool call goes through graph-os. The prompt goes on standard input. The working directory is the provided worktree. A timeout kills the whole process group. The child receives only an allowlisted environment plus explicit variables. The adapter reads the final JSON result object and never scrapes the terminal interface. It reports exit code, final text, session transcript reference, read-only diff stat, token usage, cost and model. It refuses before launch without a worktree, configuration file or executable. | Tests use a fake executable script. They prove the pinned arguments, working directory, standard-input prompt and environment allowlist. They also prove success, error, unparseable output, timeout kill, refusals and diff stat. No test calls the real CLI.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-HARNESS-R010",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Per-node harness selection and L5 recording",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "579815031bcd",
        "b15fd573cb5b"
      ],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Per-node harness selection and L5 recording.** `AgentSpec` carries a `harness` field with default `native` and an optional worktree. The parallel engine keeps its in-process path for `native` nodes. It runs every other node through the registered port. An unknown harness name raises an error and never falls back. Each non-native `RunOutcome` feeds the existing ordered RunTrace writer and the usage recorder. A native outcome already carries its RunTrace and is not written again. | Tests prove default selection, selection by field, the unknown-name error, parallel-engine dispatch, request mapping and the L5 writer calls.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-HARNESS-R011",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Run outcomes feed propose-only prompt evolution",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "755db4bb36b8",
        "b15fd573cb5b",
        "e9a23c4a2f57"
      ],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Run outcomes feed propose-only prompt evolution.** The existing native optimization sweep runs a `prompt_evolution` target. For each known agent prompt, AU reads new `RunTrace` outcomes past a durable per-agent trace cursor. AU turns them into reference-only training rows and runs a pluggable program optimizer. The default optimizer is the native `eg-program` job, which owns the DSPy-family optimizers. AU records the result as a `PromptVersion` node with status `proposal` and a `was_derived_from` edge to every source trace. AU never writes the prompt file and never promotes the version. One pending candidate per agent blocks further candidates until review. No DSPy package is imported or required. | Unit tests with a graph double and a fake optimizer prove provenance and propose-only behavior. They also prove cursor resume, idle cases and failure isolation. One test drives the default native optimizer through a fake engine. A sweep test proves the scheduled dispatch.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-HARNESS-R012",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Run-loop configuration comes from the envelope only",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Run-loop configuration comes from the envelope only.** The run loop must read its harness configuration from the signed dispatch envelope and from no other source. A run with no `harness_config` must end in a typed refusal. The loop must never apply a built-in default policy. | The end-to-end row proves one envelope reaches the loop. Negative rows prove refusal without the field.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-HARNESS-R012.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "`HarnessConfig` model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**`HarnessConfig` model.** `agent_utilities/layers/harness_config.py` defines a frozen `HarnessConfig` with `context_policy` (`none`, `elide`, `elide_then_summarize`), `soft_threshold`, `hard_threshold`, `recent_window_fraction`, `plan_scaffold`, `action_space` (`tool_set`, `shell_only`), `allowed_tool_subset`, `stuck_reminder_after` (default 5), `stuck_terminate_after` (default 8), `tool_result_max_chars` and `context_budget_tokens`. The model must reject `soft_threshold` at or above `hard_threshold`. The model must reject any fraction outside 0 to 1. | `tests/harness/test_harness_config.py::test_config_frozen_and_thresholds_ordered`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 18
    },
    {
      "id": "AU-HARNESS-R012.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Carry the config on `HarnessRequest`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Carry the config on `HarnessRequest`.** `agent_utilities/layers/harness_port.py:39` gains a `harness_config` field, and `NativeHarness.run` (`harness_native.py:116`) passes it to `run_agent`. A request without it returns the existing typed `refused` outcome with reason `harness_config_absent`. | `tests/harness/test_harness_native.py::test_request_without_config_is_refused`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 19
    },
    {
      "id": "AU-HARNESS-R012.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "`run_agent` accepts and applies the config",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**`run_agent` accepts and applies the config.** `run_agent` (`agent_utilities/orchestration/agent_runner.py:702`) gains a `harness_config` parameter beside `allowed_tools`. It builds one `HarnessRuntime` after `validate_tool_contract` (`agent_runner.py:783`). The runtime must hold the config, the counters and the termination reason for that run. | `tests/harness/test_harness_runtime.py::test_run_agent_builds_runtime_from_config`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 20
    },
    {
      "id": "AU-HARNESS-R012.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Worker reads the envelope field",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Worker reads the envelope field.** `_run_agent_turn_kind` (`agent_utilities/orchestration/agent_dispatch_worker.py:1764`) must read the signed `harness_config` from the claimed `AgentTurnEnvelope`. It must then pass the config to `run_agent`. The worker must refuse the job when the carrier rejects the signature. It must also refuse when the field is absent. | `tests/unit/test_agent_dispatch_worker.py::test_worker_passes_envelope_harness_config`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 21
    },
    {
      "id": "AU-HARNESS-R012.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "End-to-end proof of the envelope path",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**End-to-end proof of the envelope path.** One test enqueues an `AgentTurnEnvelope` through `enqueue_agent_turn` (`agent_dispatch.py:737`). A worker claims it and `run_agent` runs a scripted model. The test must assert that the applied config in the trace equals the signed config. | `tests/harness/test_runloop_envelope_e2e.py::test_envelope_config_reaches_run_loop`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 22
    },
    {
      "id": "AU-HARNESS-R013",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Context manager with elision and summarization",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Context manager with elision and summarization.** One `ContextManager` capability must keep the preamble and the recent window verbatim. At the soft threshold it must replace stale tool observations in the middle region with stubs. At the hard threshold it must fold the oldest middle events into a running summary. The manager must read thresholds from `harness_config` only. It ships no recall tool by default. The source study measured a median of zero recall calls and no accuracy gain. The loop must end a run that still exceeds the budget with the typed termination `context_overflow`. | The end-to-end row drives a scripted run across both thresholds and asserts the live capability fired.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 23
    },
    {
      "id": "AU-HARNESS-R013.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Reuse decision: one implementation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Reuse decision: one implementation.** `ContextManager` replaces `MementoCompaction` (`agent_utilities/capabilities/memento.py:154`) in `default_runtime_capabilities` (`capabilities/composition.py:102`). The `memento_compaction` parameter (`agent/factory.py:666`, `:921`) is removed. The manager reuses `enforce_tool_pair_safety` (`capabilities/compaction/_shared.py:61`) and the `before_model_request` hook (`memento.py:243`). `ToolOutputEviction` (`capabilities/eviction.py:28`) stays, because it bounds one oversized result and does not manage history. | `tests/unit/test_composition.py::test_default_capabilities_hold_one_context_manager`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 24
    },
    {
      "id": "AU-HARNESS-R013.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Token counter against the budget",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Token counter against the budget.** `ContextManager` must measure the message list in tokens and compare it with `context_budget_tokens` before each model request. The manager must record the peak as `peakContextTokens` on the runtime. | `tests/harness/test_context_manager.py::test_peak_tokens_tracked`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 25
    },
    {
      "id": "AU-HARNESS-R013.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Region split",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Region split.** The manager must split messages into the preamble (system prompt and task), the middle region and the recent window. The recent window must cover `recent_window_fraction` of the budget and at least the last two turns. A tool call and its return must never fall on opposite sides of a boundary. | `tests/harness/test_context_manager.py::test_regions_keep_tool_pairs_together`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 26
    },
    {
      "id": "AU-HARNESS-R013.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Elision at the soft threshold",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Elision at the soft threshold.** When usage reaches `soft_threshold` times the budget, the manager must replace each stale tool observation in the middle region with a stub naming the tool, its arguments and the original size. The manager must leave the preamble and the recent window unchanged. | `tests/harness/test_context_manager.py::test_elision_stubs_middle_observations_only`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 27
    },
    {
      "id": "AU-HARNESS-R013.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Summarization at the hard threshold",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Summarization at the hard threshold.** When usage still reaches `hard_threshold` times the budget after elision, the manager must act. It must fold the oldest middle events into one running summary message. The summary call must use the run's own model and must count toward `costUsd`. | `tests/harness/test_context_manager.py::test_summarization_folds_oldest_middle`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 28
    },
    {
      "id": "AU-HARNESS-R013.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Policy gating",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Policy gating.** A `context_policy` of `none` must attach no manager. A policy of `elide` must never summarize. Only `elide_then_summarize` may call the model for a summary. | `tests/harness/test_context_manager.py::test_policy_gates_each_mechanism`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 29
    },
    {
      "id": "AU-HARNESS-R013.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Typed `context_overflow` termination",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Typed `context_overflow` termination.** The loop must catch two cases. In the first, the history exceeds the budget after both mechanisms. In the second, the provider rejects the request for length. The loop must end the run with `terminationReason` `context_overflow` and the partial output. It must never surface an unhandled provider error. | `tests/harness/test_context_manager.py::test_overflow_is_typed_termination`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 30
    },
    {
      "id": "AU-HARNESS-R013.8",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Mechanism counters",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Mechanism counters.** The manager must increment `elisionCount` and `summarizationCount` on the runtime for each event it performs. | `tests/harness/test_context_manager.py::test_counters_increment`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 31
    },
    {
      "id": "AU-HARNESS-R013.9",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "End-to-end proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**End-to-end proof.** A scripted `run_agent` with a small budget must take its `harness_config` from an envelope. It must show one elision, one summarization and a final answer. A second case with an impossible budget must end in `context_overflow`. | `tests/harness/test_context_manager_e2e.py::test_live_run_elides_summarizes_and_overflows`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 32
    },
    {
      "id": "AU-HARNESS-R013.10",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** Each summary the manager writes must carry a quality score from a judge. The judge checks retained values, methods and validation steps. A score below `summary_min_score` (default 0.7) must trigger one regeneration before the summary replaces the raw block. | `tests/harness/test_context_summary_quality.py::test_low_score_regenerates_once`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 33
    },
    {
      "id": "AU-HARNESS-R013.11",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Wiring.** The quality check attaches in `ContextManager.before_model_request`, which replaces the hook at `agent_utilities/capabilities/memento.py:243`. The model request path of `run_agent` (`agent_runner.py:702`) calls it on every turn. | `tests/harness/test_context_summary_quality.py::test_hook_runs_on_every_request`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 34
    },
    {
      "id": "AU-HARNESS-R013.12",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Refusal.** A summary that still scores below `summary_min_score` after regeneration must not replace the raw block. The manager must keep the raw block and record a `summary_rejected` observation. | `tests/harness/test_context_summary_quality.py::test_second_failure_keeps_raw_block`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 35
    },
    {
      "id": "AU-HARNESS-R013.13",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Model.** A `SummaryNode` holds a summary text, the identifiers of its source messages and a parent link. Nodes form a directed acyclic graph. Every node must resolve to its original messages without loss. | `tests/harness/test_context_summary_dag.py::test_node_resolves_to_sources`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 36
    },
    {
      "id": "AU-HARNESS-R013.14",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** The manager must retrieve the original messages of any summary node on demand. Summaries of summaries must keep pointers to the same originals. Retrieval must never call the model. | `tests/harness/test_context_summary_dag.py::test_nested_summary_expands_to_originals`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 37
    },
    {
      "id": "AU-HARNESS-R013.15",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** When a tool result or subgraph exceeds `large_output_chars` (default 20000), the run loop must store it in a named run variable. The model request receives a stub with the variable name, size and a 500-character head. A read-slice tool returns ranges of the variable. | `tests/harness/test_large_output_variable.py::test_oversize_result_becomes_variable`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 38
    },
    {
      "id": "AU-HARNESS-R013.16",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Wiring.** The variable store attaches where the truncation guard of `AU-HARNESS-R016.6` runs, ahead of `ToolOutputEviction` (`agent_utilities/capabilities/eviction.py:28`). The run loop calls it for every tool result. The read-slice tool registers beside `update_plan`. | `tests/harness/test_large_output_variable.py::test_store_runs_before_eviction`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 39
    },
    {
      "id": "AU-HARNESS-R013.17",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Refusal.** A slice request outside the stored length must return a typed `slice_out_of_range` observation. The raw output must never enter the model request when a variable holds it. | `tests/harness/test_large_output_variable.py::test_bad_slice_refused_raw_never_injected`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 40
    },
    {
      "id": "AU-HARNESS-R013.18",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Evidence.** The runtime must record `summaryRegenerationCount`, `summaryRejectedCount` and `variableStoredCount` in the run trace. Each counter follows the write path of `AU-HARNESS-R017.4`. | `tests/harness/test_run_trace_fields.py::test_summary_and_variable_counters`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 41
    },
    {
      "id": "AU-HARNESS-R013.19",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Hot-path proof.** The entry point is the run loop through `run_agent` with an envelope `harness_config`. A scripted run has an oversize tool result and a poor first summary. It must end with a final answer and the three counters set. | `tests/harness/test_context_manager_quality_e2e.py::test_run_loop_summary_quality_and_variable`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 42
    },
    {
      "id": "AU-HARNESS-R014",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Plan scaffold as run state",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Plan scaffold as run state.** When `plan_scaffold` is `on`, the run loop must register an `update_plan` tool and inject the current plan into each model request. The plan must never enter stored history. This scaffold is run state that the model edits. It never composes agents, tools or models, so `AU-CONTROL-R027` stays the only planner. | The end-to-end row proves the plan appears in each request and in no stored message.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 43
    },
    {
      "id": "AU-HARNESS-R014.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "`PlanState` model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**`PlanState` model.** `agent_utilities/layers/harness_plan.py` defines a frozen `PlanItem` (text, status `pending`, `in_progress`, `done`) and a `PlanState` holding the items of one run. Updates must replace the whole list. | `tests/harness/test_harness_plan.py::test_plan_state_replaces_list`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 44
    },
    {
      "id": "AU-HARNESS-R014.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "`update_plan` tool",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**`update_plan` tool.** The loop registers `update_plan` only when `plan_scaffold` is `on`. The tool must validate its argument against `PlanItem` and return the new plan as its observation. Malformed input returns a typed error observation. | `tests/harness/test_harness_plan.py::test_update_plan_tool_gated_by_config`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 45
    },
    {
      "id": "AU-HARNESS-R014.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Per-turn injection outside history",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Per-turn injection outside history.** A `before_model_request` hook must append the rendered plan to the outgoing request only. The hook must not write the plan to the stored message list. The `ContextManager` must not count stored plan text twice. | `tests/harness/test_harness_plan.py::test_plan_injected_not_stored`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 46
    },
    {
      "id": "AU-HARNESS-R014.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Planner boundary",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Planner boundary.** The scaffold module must import nothing from `agent_utilities/decide/consumers/task_planner.py`. The tool must never name an agent, a skill or a model. | `tests/harness/test_harness_plan.py::test_scaffold_imports_no_planner`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 47
    },
    {
      "id": "AU-HARNESS-R014.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "End-to-end proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**End-to-end proof.** A scripted run with the scaffold on must call `update_plan` twice. Every captured model request must contain the plan, and the stored history must contain none of it. | `tests/harness/test_harness_plan_e2e.py::test_plan_in_every_request_never_in_history`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 48
    },
    {
      "id": "AU-HARNESS-R015",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Action space applied at tool registration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Action space applied at tool registration.** The run loop must apply `action_space` and `allowed_tool_subset` when it registers tools. In `shell_only` it must register one shell tool and nothing else from the tool set. In `tool_set` it must register only the tools in the subset. A call to any other tool must return a typed refusal as an observation. | The end-to-end row proves both modes against the live registration path.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 49
    },
    {
      "id": "AU-HARNESS-R015.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Registration filter",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Registration filter.** `run_agent` must filter the tools it passes to the agent by `allowed_tool_subset` after `validate_tool_contract` (`agent_runner.py:783`). The filter must run before the first model request. | `tests/harness/test_action_space.py::test_registration_filters_to_subset`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 50
    },
    {
      "id": "AU-HARNESS-R015.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "`shell_only` mode",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**`shell_only` mode.** In `shell_only` the loop must register the shell tool alone, plus `update_plan` when the scaffold is on. The mode must be a registration decision and must not rewrite tool descriptions. | `tests/harness/test_action_space.py::test_shell_only_registers_one_tool`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 51
    },
    {
      "id": "AU-HARNESS-R015.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Call-time refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Call-time refusal.** A tool call outside the allowed set must return a `tool_not_allowed` observation naming the tool. The tool must never start. The refusal must reuse the carrier check at `agent_dispatch.py:445`. | `tests/harness/test_action_space.py::test_out_of_set_call_returns_refusal_observation`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 52
    },
    {
      "id": "AU-HARNESS-R015.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "End-to-end proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**End-to-end proof.** A scripted model calls an allowed and a disallowed tool in `tool_set` mode, then runs in `shell_only` mode. The test must assert registered names, the refusal observation and no side effect. | `tests/harness/test_action_space_e2e.py::test_live_registration_and_refusal`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 53
    },
    {
      "id": "AU-HARNESS-R016",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Run guards",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Run guards.** The loop must detect stuck runs, append diagnostics to edit results, enforce read-before-write, return tool errors as observations, truncate tool results and run read-only tools in parallel. Each guard must emit a counter in the trace. | Each child names its own proof. The end-to-end row drives all guards in one scripted run.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 54
    },
    {
      "id": "AU-HARNESS-R016.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Stuck reminder",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Stuck reminder.** After `stuck_reminder_after` identical tool calls in a row, the loop must append one reminder to the next observation. Identity is the tool name plus canonical arguments. | `tests/harness/test_run_guards.py::test_reminder_after_identical_calls`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 55
    },
    {
      "id": "AU-HARNESS-R016.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Stuck termination",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Stuck termination.** After `stuck_terminate_after` identical failing calls, the loop must end the run with `terminationReason` `stuck`. A success between calls resets the count. | `tests/harness/test_run_guards.py::test_stuck_termination_after_failing_repeats`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 56
    },
    {
      "id": "AU-HARNESS-R016.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Post-edit diagnostics",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Post-edit diagnostics.** After an edit tool succeeds, the loop must run the diagnostics command for the edited file and append its output to the edit result. A missing diagnostics command must append nothing and raise nothing. | `tests/harness/test_run_guards.py::test_edit_result_carries_diagnostics`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 57
    },
    {
      "id": "AU-HARNESS-R016.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Read-before-write",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Read-before-write.** The loop must record a content hash for each file a read tool returns. A write tool must refuse a file never read or changed since the read. The refusal is a typed observation. | `tests/harness/test_run_guards.py::test_write_requires_fresh_read_hash`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 58
    },
    {
      "id": "AU-HARNESS-R016.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Tool errors as observations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Tool errors as observations.** A tool exception must become an `error` observation to the model. The loop must continue. Only a cancellation may propagate. | `tests/harness/test_run_guards.py::test_tool_error_becomes_observation`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 59
    },
    {
      "id": "AU-HARNESS-R016.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Result truncation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Result truncation.** The loop must truncate any tool result longer than `tool_result_max_chars` and mark the cut. This guard is separate from `ToolOutputEviction` and must run first. | `tests/harness/test_run_guards.py::test_long_result_truncated_with_marker`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 60
    },
    {
      "id": "AU-HARNESS-R016.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Parallel read-only tools",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Parallel read-only tools.** When one model turn requests two or more tools, the loop must run those marked `read_only` concurrently and the rest in order. The marker comes from the connector contract's `read_only` field, read as `readOnlyHint` at `agent_utilities/mcp/connector_surface.py:73`. A tool with no marker runs serially. | `tests/harness/test_run_guards.py::test_read_only_tools_run_concurrently`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 61
    },
    {
      "id": "AU-HARNESS-R016.8",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "End-to-end proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**End-to-end proof.** A scripted run must trigger a reminder, a diagnostics append, a refused write, a truncation and a parallel read batch. It must then end with `stuck`. | `tests/harness/test_run_guards_e2e.py::test_all_guards_fire_in_live_loop`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 62
    },
    {
      "id": "AU-HARNESS-R017",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Run trace with termination reason and counters",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Run trace with termination reason and counters.** Every run must write one typed termination reason and the brief's counters through the existing RunTrace export. The loop must never write a second trace store. | The end-to-end row reads the persisted trace for each termination reason.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 63
    },
    {
      "id": "AU-HARNESS-R017.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "`TerminationReason` enum",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**`TerminationReason` enum.** `harness_runtime.py` defines `final_answer`, `context_overflow`, `stuck`, `step_budget` and `error`. A run must end with exactly one value. A second assignment must raise. | `tests/harness/test_harness_runtime.py::test_single_termination_reason`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 64
    },
    {
      "id": "AU-HARNESS-R017.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Map existing exits",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Map existing exits.** Each exit path of `run_agent` must set a reason. The `UsageLimits` breach from `_direct_run_usage_limits` (`agent_runner.py:4450`) must map to `step_budget`. Every other exception must map to `error`. | `tests/harness/test_harness_runtime.py::test_every_exit_sets_reason`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 65
    },
    {
      "id": "AU-HARNESS-R017.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Counters",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Counters.** The runtime must hold `peakContextTokens`, `contextBudgetTokens`, `elisionCount`, `summarizationCount`, `turnCount`, `toolCallCount`, `costUsd` and the applied `harness_config`. | `tests/harness/test_harness_runtime.py::test_counters_cover_brief`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 66
    },
    {
      "id": "AU-HARNESS-R017.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Write through `_record_execution_trace`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Write through `_record_execution_trace`.** `_record_execution_trace` (`agent_runner.py:5305`) gains these fields. Its ordered wrapper at `agent_runner.py:5453` must carry them to the engine. The engine run-trace vocabulary owns the field names, so this row follows the `EG` run-trace vocabulary row. | `tests/harness/test_run_trace_fields.py::test_trace_write_carries_reason_and_counters`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 67
    },
    {
      "id": "AU-HARNESS-R017.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Non-native path",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Non-native path.** `record_outcome` in `harness_record.py` must write the same reason for a non-native `RunOutcome`. The reason `error` applies when the adapter reports none. | `tests/harness/test_run_trace_fields.py::test_non_native_outcome_has_reason`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 68
    },
    {
      "id": "AU-HARNESS-R017.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "End-to-end proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**End-to-end proof.** Five scripted runs, one per reason, must each persist one trace with the right reason through a fake engine. | `tests/harness/test_run_trace_e2e.py::test_each_reason_persisted`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 69
    },
    {
      "id": "AU-HARNESS-R018",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Matched ablation runner",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Matched ablation runner.** AU must run one task set repeatedly with one component varied and compare task-paired outcomes. It must report success rate, cost per task and overflow rate. It must submit the measured model facts to the engine as a governed proposal. No ablation or McNemar code exists today, so the runner is new code. | The end-to-end row runs a synthetic task set through two arms and reaches a submitted proposal.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 70
    },
    {
      "id": "AU-HARNESS-R018.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Arm and task-set types",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Arm and task-set types.** `agent_utilities/harness/ablation.py` defines a frozen `AblationArm` (component name, `harness_config`) and a frozen `TaskSet` (task ids, fixed seed). Two arms must differ in exactly one `HarnessConfig` field. The runner must refuse arms that differ in more. | `tests/harness/test_ablation.py::test_arms_differ_in_one_component`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 71
    },
    {
      "id": "AU-HARNESS-R018.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Paired execution",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Paired execution.** For each task the runner must run both arms through `run_agent` and record outcome, cost, `terminationReason` and counters. The stored records come from the trajectory capture of `AU-HARNESS-R001`. | `tests/harness/test_ablation.py::test_paired_outcomes_recorded`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 72
    },
    {
      "id": "AU-HARNESS-R018.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Exact McNemar test",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Exact McNemar test.** The runner computes the exact two-sided binomial test on discordant pairs. Zero discordant pairs must give a p-value of 1. | `tests/harness/test_ablation.py::test_exact_mcnemar_known_values`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 73
    },
    {
      "id": "AU-HARNESS-R018.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Benjamini-Hochberg correction",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Benjamini-Hochberg correction.** The runner adjusts the p-values of all compared components at false-discovery rate 0.05 and reports which differences hold. | `tests/harness/test_ablation.py::test_bh_adjustment`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 74
    },
    {
      "id": "AU-HARNESS-R018.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Report",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Report.** The report lists success rate, mean cost per task and overflow rate per arm. It also lists `contextWindowTokens`, `shellProficiency` and `stoppingBehaviour` derived from the run. A value without enough pairs is reported as `insufficient`. | `tests/harness/test_ablation.py::test_report_fields_and_insufficient`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 75
    },
    {
      "id": "AU-HARNESS-R018.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Governed proposal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Governed proposal.** The runner must submit each measured fact to the engine as a proposal that cites its run identifier. It must never write the fact itself. The engine writes the fact through the `EG` run-trace rows for the measured-fact write. | `tests/harness/test_ablation.py::test_facts_submitted_as_proposals_only`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 76
    },
    {
      "id": "AU-HARNESS-R018.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "End-to-end proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**End-to-end proof.** A synthetic task set over two arms must produce a report and one proposal per fact through a fake engine. | `tests/harness/test_ablation_e2e.py::test_two_arms_to_proposal`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 77
    },
    {
      "id": "AU-HARNESS-R019",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Studied sources become compared, admitted proposals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Studied sources become compared, admitted proposals.** AU runs one study pipeline: a paper, repository or article becomes a feature record, a capability comparison and a reviewed proposal. AU must not write code, specs or prompts from a study directly. | `tests/harness/test_study_pipeline.py::test_end_to_end` drives a fake source to a pending proposal.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 78
    },
    {
      "id": "AU-HARNESS-R019.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Locate and wire the study attach point",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Locate and wire the study attach point.** The first child locates the entry beside `agent_utilities/harness/assimilation_benchmark.py` and wires `study_pipeline.run_study` into the evolution sweep. | `test_study_pipeline.py::test_sweep_dispatch`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 79
    },
    {
      "id": "AU-HARNESS-R019.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Typed `StudySource` and `FeatureRecord`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Typed `StudySource` and `FeatureRecord`.** `agent_utilities/harness/study_models.py` defines `StudySource` (kind, locator, content digest) and `FeatureRecord` (source, claim, mechanism, evidence span). Records without an evidence span are refused. | `test_study_models.py::test_span_required`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 80
    },
    {
      "id": "AU-HARNESS-R019.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Study intake deduplicates by content digest",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Study intake deduplicates by content digest.** `study_intake.fetch_once` reads each source through its declared contract (scholarx for papers, archive for pages) and skips a digest already studied. It must not copy the source body into the graph; it stores the digest and locator. | `test_study_intake.py::test_duplicate_digest_skipped`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 81
    },
    {
      "id": "AU-HARNESS-R019.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Batch study scales to ten times the source count",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Batch study scales to ten times the source count.** `study_batch.run_batch` processes sources in bounded concurrency set by the compute governor. One failed source must not stop the batch and yields a typed failure row. | `test_study_batch.py::test_one_failure_isolated` with 100 fake sources.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 82
    },
    {
      "id": "AU-HARNESS-R019.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Capability comparison matrix against the platform",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Capability comparison matrix against the platform.** `study_compare.compare` asks the engine for matching capabilities per feature and returns a verdict of `covered`, `gap` or `exceeds`. AU must not keep a private capability inventory. | `test_study_compare.py::test_verdicts_from_engine_double`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 83
    },
    {
      "id": "AU-HARNESS-R019.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Matrix report lists every feature with its verdict",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Matrix report lists every feature with its verdict.** `study_compare.render_matrix` emits one row per feature and source, including `covered` rows. A study with no extractable feature reports `no_features`, not an empty success. | `test_study_compare.py::test_no_features_abstains`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 84
    },
    {
      "id": "AU-HARNESS-R019.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Gap features become proposals only",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Gap features become proposals only.** `study_propose.propose` records each `gap` as a proposal node linked by `was_derived_from` to its feature records. AU must not edit a repository, spec or prompt, and must not promote a proposal. | `test_study_propose.py::test_propose_only_no_writes`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 85
    },
    {
      "id": "AU-HARNESS-R019.8",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "One open proposal per feature blocks duplicates",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**One open proposal per feature blocks duplicates.** `study_propose.propose` must skip a gap whose feature digest has an open or rejected proposal. It must return the existing proposal ID. | `test_study_propose.py::test_duplicate_gap_blocked`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 86
    },
    {
      "id": "AU-HARNESS-R019.9",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Admission requires a measured lift",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Admission requires a measured lift.** `study_admit.admit` must refuse a reviewed proposal that lacks a baseline-versus-candidate benchmark result from the assimilation benchmark suite. A refusal names the missing measurement. | `test_study_admit.py::test_unmeasured_refused`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 87
    },
    {
      "id": "AU-HARNESS-R019.10",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Admission is a governed decision, not an AU choice",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Admission is a governed decision, not an AU choice.** `study_admit.admit` sends the benchmark result to the engine decision service and applies the returned verdict. AU must not rank or accept proposals itself. | `test_study_admit.py::test_verdict_applied_from_engine`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 88
    },
    {
      "id": "AU-HARNESS-R019.11",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Research goals drive source discovery",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Research goals drive source discovery.** `study_discover.discover` reads active goals from the engine and queries declared feeds, scholarx and prompt folders for new sources. It must stop at a per-run source cap of 50. | `test_study_discover.py::test_cap_and_goal_filter`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 89
    },
    {
      "id": "AU-HARNESS-R019.12",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Background study yields to interactive work",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Background study yields to interactive work.** `study_batch.run_batch` must pause when the compute governor reports interactive load, and resume from its cursor without repeating a source. | `test_study_batch.py::test_pause_resume_cursor`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 90
    },
    {
      "id": "AU-HARNESS-R020",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Parallel workers share a typed workspace",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Parallel workers share a typed workspace.** A wide search must run its workers against one shared workspace. The workspace holds the subtask checklist, the target schema and one result slot per worker. Results conform to the schema or the engine refuses them. A synthesizer must read results by reference. | tests/harness/test_parallel_workspace_e2e.py drives the rollup end to end.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 91
    },
    {
      "id": "AU-HARNESS-R020.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Model.** `ParallelWorkspace` in `agent_utilities/graph/parallel_workspace.py` holds a checklist, a frozen result schema, one `WorkerSlot` per worker and a version counter. Each slot holds a status, a typed result and a conflict note. | `tests/harness/test_parallel_workspace.py::test_workspace_model_frozen_schema`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 92
    },
    {
      "id": "AU-HARNESS-R020.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** Each worker reads the other slots before it starts a subtask and skips a subtask another slot already covers. Two slots with the same key and different values must raise a `conflict` entry for the synthesizer. | `tests/harness/test_parallel_workspace.py::test_duplicate_skipped_conflict_recorded`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 93
    },
    {
      "id": "AU-HARNESS-R020.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** The run must bound concurrency by `max_parallel_workers` (default 8) and each worker by `worker_timeout_seconds` (default 120). After `breaker_after_failures` consecutive failures (default 3) the breaker must stop new workers. | `tests/harness/test_parallel_workspace.py::test_bound_timeout_and_breaker`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 94
    },
    {
      "id": "AU-HARNESS-R020.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** The synthesizer reads typed slot objects programmatically and never receives worker output as prompt text. Strategy is `flat` up to 8 workers, `hierarchical` above that, and `progressive` when total output exceeds `progressive_output_chars` (default 60000). | `tests/harness/test_parallel_workspace.py::test_strategy_chosen_by_count_and_size`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 95
    },
    {
      "id": "AU-HARNESS-R020.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Wiring.** `parallel_batch_processor` (`agent_utilities/graph/_router_impl.py:1772`) builds the workspace and passes it to each worker. The router step `_dispatch_parallel_batch` (`_router_impl.py:1677`) calls it in production. | `tests/harness/test_parallel_workspace.py::test_batch_processor_builds_workspace`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 96
    },
    {
      "id": "AU-HARNESS-R020.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Refusal.** A worker result that violates the schema must be refused with a typed `schema_violation` row. The slot stays open. The breaker counts the refusal as a failure. | `tests/harness/test_parallel_workspace.py::test_schema_violation_refused`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 97
    },
    {
      "id": "AU-HARNESS-R020.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Evidence.** The run trace must record the strategy chosen, worker count, conflict count, refusal count and breaker state. Each field follows the write path of `AU-HARNESS-R017.4`. | `tests/harness/test_parallel_workspace.py::test_trace_records_strategy_and_breaker`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 98
    },
    {
      "id": "AU-HARNESS-R020.8",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Hot-path proof.** The entry point is the served graph run through `_dispatch_parallel_batch`. A run has four fake workers, one schema violation and one conflict. It must end with a synthesized result and a trace. | `tests/harness/test_parallel_workspace_e2e.py::test_router_batch_to_synthesis`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 99
    },
    {
      "id": "AU-HARNESS-R021",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Evaluation gates separate safety from accuracy",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Evaluation gates separate safety from accuracy.** Evaluation of model-backed work must report accuracy and a safety measure apart. A judge score is trusted only while an independent outcome agrees. A recommendation reaches human approval only after a bounds and provenance check. | tests/harness/test_eval_gates_e2e.py drives the rollup end to end.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 100
    },
    {
      "id": "AU-HARNESS-R021.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Model.** `EvalGateReport` in `agent_utilities/harness/eval_gates.py` holds accuracy, `safetyErrorRate`, `judgeScore`, `independentOutcome`, a divergence value and a typed verdict `promote`, `hold` or `refuse`. | `tests/harness/test_eval_gates.py::test_report_fields_and_verdicts`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 101
    },
    {
      "id": "AU-HARNESS-R021.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** `safetyErrorRate` counts confident, high-risk or evidence-contradicting errors over all answers. A rollup must not be promoted when accuracy rises and `safetyErrorRate` rises by more than `safety_regression_margin` (default 0.01). | `tests/harness/test_eval_gates.py::test_accuracy_gain_with_safety_regression_held`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 102
    },
    {
      "id": "AU-HARNESS-R021.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** Divergence is the judge score trend minus the independent outcome trend over the last `divergence_window` runs (default 20). A divergence above `divergence_threshold` (default 0.15) must flag exploitation onset. | `tests/harness/test_eval_gates.py::test_divergence_flags_onset`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 103
    },
    {
      "id": "AU-HARNESS-R021.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** Before surfacing a recommendation, the gate must check every value against its declared bound. It must also check provenance. Pluggable scorers for length, pattern and schema feed the same report. | `tests/harness/test_eval_gates.py::test_bounds_provenance_and_scorers`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 104
    },
    {
      "id": "AU-HARNESS-R021.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Wiring.** `ContinuousEvaluationEngine.evaluate` (`agent_utilities/harness/continuous_evaluation_engine.py:1103`) calls the gate once per round. The ablation report of `AU-HARNESS-R018.5` reads the same report. This row creates the call site at that function. | `tests/harness/test_eval_gates.py::test_evaluate_calls_gate`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 105
    },
    {
      "id": "AU-HARNESS-R021.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Refusal.** A run whose judge score rises while the independent outcome does not must be refused as evidence. A recommendation with missing provenance or an out-of-bound value must be refused and escalated. | `tests/harness/test_eval_gates.py::test_divergent_run_and_unbounded_recommendation_refused`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 106
    },
    {
      "id": "AU-HARNESS-R021.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Evidence.** The report must persist to the graph as evidence with its run identifiers and the verdict reason. A refusal must carry the premise that triggered it. | `tests/harness/test_eval_gates.py::test_report_persisted_with_premise`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 107
    },
    {
      "id": "AU-HARNESS-R021.8",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Hot-path proof.** The entry point is the evaluation round through `ContinuousEvaluationEngine.evaluate`. A scripted round with rising judge score and flat outcome must produce a `refuse` verdict and a persisted report. | `tests/harness/test_eval_gates_e2e.py::test_round_refuses_divergent_run`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 108
    },
    {
      "id": "AU-HARNESS-R022",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Run experience becomes reusable skills",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Run experience becomes reusable skills.** AU must distill finished runs into action-level experiences and task-level skills. It consolidates them across at least three rollouts and retrieves them by current context. Usage outcomes update their standing without any change to model parameters. | tests/harness/test_experience_distill_e2e.py drives the rollup end to end.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 109
    },
    {
      "id": "AU-HARNESS-R022.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Model.** `ExperienceRecord` and `SkillCandidate` in `agent_utilities/knowledge_graph/distillation/experience_models.py` hold a kind (`action` or `task`), source run identifiers, a context key, a use count and a success count. | `tests/harness/test_experience_models.py::test_records_typed`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 110
    },
    {
      "id": "AU-HARNESS-R022.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** Consolidation merges records from at least `min_rollouts` runs (default 3) that share a context key. A task whose workflow succeeds `skill_after_successes` times (default 3) must scaffold a skill directory that the graph references, not copies. | `tests/harness/test_experience_distill.py::test_consolidation_and_scaffold`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 111
    },
    {
      "id": "AU-HARNESS-R022.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** Retrieval ranks records by context-key match and success rate. After each use, the outcome must update the use count and success count of the retrieved record. | `tests/harness/test_experience_distill.py::test_retrieval_and_feedback`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 112
    },
    {
      "id": "AU-HARNESS-R022.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Wiring.** The distiller attaches to `SkillGraphPipeline` at `agent_utilities/knowledge_graph/distillation/skill_graph_pipeline.py:836`, and `record_outcome` in `harness_record.py` calls it after each run. This row creates the call site in `record_outcome`. | `tests/harness/test_experience_distill.py::test_record_outcome_calls_distiller`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 113
    },
    {
      "id": "AU-HARNESS-R022.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Refusal.** A candidate from fewer than `min_rollouts` runs, or one without a source run identifier, must be refused with a typed `insufficient_evidence` row. A skill with a success rate under 0.5 after 10 uses must be retired. | `tests/harness/test_experience_distill.py::test_insufficient_evidence_and_retirement`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 114
    },
    {
      "id": "AU-HARNESS-R022.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Evidence.** Each record must link by `was_derived_from` to its source run traces. The run trace must record which records were retrieved for the run. | `tests/harness/test_experience_distill.py::test_provenance_and_retrieval_trace`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 115
    },
    {
      "id": "AU-HARNESS-R022.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Hot-path proof.** The entry point is the run loop through `run_agent`. Three scripted successful runs must scaffold one skill, and a fourth run must retrieve it and update its use count. | `tests/harness/test_experience_distill_e2e.py::test_three_runs_scaffold_and_fourth_retrieves`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 116
    },
    {
      "id": "AU-HARNESS-R023",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Replay a received run program against observed state",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Replay a received run program against observed state.** The run loop must replay a program received from the engine. It must check observed state before each action and refuse on mismatch with a typed `deviation`. [arXiv:2606.17929] | tests/harness/test_run_program_e2e.py drives the rollup end to end.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 117
    },
    {
      "id": "AU-HARNESS-R023.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Model.** `RunProgram` and `ProgramStep` in `agent_utilities/harness/run_program.py` are new. They are received from EG-DECISION-ENGINE as admitted by GRAPHOS-A2A. A step holds a `precondition` over observed state, one tool action and an `expected_effect`. The nearest existing code is `ReplayManifest` and `InteractionRecord` (`agent_utilities/observability/replay_engine.py:20`, `:36`), which hold no preconditions. | `tests/harness/test_run_program.py::test_program_model_fields`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 118
    },
    {
      "id": "AU-HARNESS-R023.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** The replayer checks each step precondition against observed state before the action. A match performs the action with no model call. `precondition_matcher` is a replaceable default. | `tests/harness/test_run_program.py::test_replay_without_model_calls`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 119
    },
    {
      "id": "AU-HARNESS-R023.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** A mismatch ends the replay with a typed `deviation`. The replayer then returns control to the agent with the performed prefix. | `tests/harness/test_run_program.py::test_deviation_hands_back`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 120
    },
    {
      "id": "AU-HARNESS-R023.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Wiring.** `run_agent` (`agent_utilities/orchestration/agent_runner.py:702`) asks the engine for a program by task signature before its first model request. A received program replays, and a deviation falls through to the existing agent path. No production caller reaches `ReplayManifest` or `DistributedReplayEngine` today (`replay_engine.py:48` has no production caller). This row creates the call site in `run_agent`. | `tests/harness/test_run_program.py::test_run_agent_replays_received_program`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 121
    },
    {
      "id": "AU-HARNESS-R023.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Refusal.** The replayer must refuse a program that the engine did not mark admitted. It must refuse a step whose precondition fails. Both cases give a typed row, `program_not_admitted` or `deviation`, and the agent path runs. | `tests/harness/test_run_program.py::test_unadmitted_program_not_replayed`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 122
    },
    {
      "id": "AU-HARNESS-R023.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Evidence.** The run trace must record `programId`, `replayed`, `deviationStep` and `modelCallsAvoided`. Each field follows the write path of `AU-HARNESS-R017.4`. | `tests/harness/test_run_program.py::test_trace_fields_for_replay`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 123
    },
    {
      "id": "AU-HARNESS-R023.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Hot-path proof.** The entry point is the run loop through `run_agent`. A scripted engine returns an admitted program for one task. The run must finish with zero model calls. A run with a changed screen state must deviate and finish through the agent. | `tests/harness/test_run_program_e2e.py::test_received_program_replays_then_deviates`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 124
    },
    {
      "id": "AU-HARNESS-R024",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Emit a span for every agent call, graph step and tool call",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Emit a span for every agent call, graph step and tool call.** The run loop must emit one connected span tree per run to the engine trace sink. The engine owns the trace records. | tests/harness/test_end_to_end_trace_e2e.py drives the rollup end to end.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 125
    },
    {
      "id": "AU-HARNESS-R024.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Model.** `RunSpanContract` in `agent_utilities/observability/run_span_contract.py` is new. It receives the span kinds and required attributes from EG-ORCH-VOCAB. Fallback defaults are `agent_call`, `tool_call`, `orchestration_step`, `flow_diagram` and `experience_read`. Required attributes are run id, node id, parent span id, tool name and decision id. Existing instrumentation is `build_fleet_instrumentation` (`agent_utilities/capabilities/telemetry_instrumentation.py:40`) and `setup_otel` (`agent_utilities/observability/custom_observability.py:850`). Neither fixes kinds or attributes. | `tests/harness/test_end_to_end_trace.py::test_span_kinds_and_attributes`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 126
    },
    {
      "id": "AU-HARNESS-R024.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** Each graph orchestration step opens a span under the run span. Each tool call opens a child span. The flow diagram attaches to the run span as one attribute when `trace_flow_diagram` is on (default on). | `tests/harness/test_end_to_end_trace.py::test_step_tool_and_diagram_spans`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 127
    },
    {
      "id": "AU-HARNESS-R024.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** Each span carries a model request digest, tool arguments and a result digest. The engine uses them to replay a step. A named default `span_attribute_redactor` drops content when content capture is off. | `tests/harness/test_end_to_end_trace.py::test_spans_carry_replay_digests`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 128
    },
    {
      "id": "AU-HARNESS-R024.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Wiring.** `default_runtime_capabilities` (`agent_utilities/capabilities/composition.py:160`) already attaches the instrumentation, and every `run_agent` call reaches it. Graph steps in `_dispatch_parallel_batch` (`agent_utilities/graph/_router_impl.py:1677`) and the tool path open no spans today. This row creates those call sites. `DistributedReplayEngine.record_step` (`replay_engine.py:81`) has no production caller today. | `tests/harness/test_end_to_end_trace.py::test_graph_step_opens_span`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 129
    },
    {
      "id": "AU-HARNESS-R024.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Refusal.** With no collector configured the run must continue and record a typed `trace_export_disabled` observation once. The emitter must drop and count a span that lacks a required attribute. A dropped span must never fail the run. | `tests/harness/test_end_to_end_trace.py::test_no_collector_and_incomplete_span`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 130
    },
    {
      "id": "AU-HARNESS-R024.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Evidence.** The runtime must record `spanCount`, `droppedSpanCount` and `traceId` in the run trace. Each field follows the write path of `AU-HARNESS-R017.4`. | `tests/harness/test_end_to_end_trace.py::test_trace_id_in_run_trace`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 131
    },
    {
      "id": "AU-HARNESS-R024.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Hot-path proof.** The entry point is a served graph run through `_dispatch_parallel_batch` with a scripted model and an in-memory span exporter. The test must find one connected trace holding the agent, tool and orchestration spans and the diagram attribute. | `tests/harness/test_end_to_end_trace_e2e.py::test_served_run_exports_connected_trace`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 132
    },
    {
      "id": "AU-HARNESS-R025",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Make each harness edit a revertible change that carries a declared prediction",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Make each harness edit a revertible change that carries a declared prediction.** The loop must declare a prediction before each edit. It must apply the verdict it receives from the engine. [arXiv:2604.25850] | tests/harness/test_harness_edit_prediction_e2e.py drives the rollup end to end.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 133
    },
    {
      "id": "AU-HARNESS-R025.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Model.** `HarnessEditRecord` in `agent_utilities/harness/harness_edit_record.py` is new. It holds the changed file paths and a version-control revision. It holds a `DeclaredPrediction`: the task ids expected to flip and the direction. It holds the verdict `pending`, `verified`, `falsified` or `unverified`, received from EG-DECISION-ENGINE. Nearest code: `HarnessGate.check` (`agent_utilities/harness/harness_gate.py:127`) gates concentration only. `rollback_prompt` (`agent_utilities/core/registry/kg_adapter.py:660`) reverts prompts only. | `tests/harness/test_harness_edit_record.py::test_record_fields_and_verdicts`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 134
    },
    {
      "id": "AU-HARNESS-R025.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** After the next round the loop sends the task outcomes and the prediction to the engine. The engine returns the verdict. `verification_rounds` and `min_flip_fraction` are received from the engine; fallback defaults are 1 and 0.5. | `tests/harness/test_harness_edit_record.py::test_verdict_received_from_engine`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 135
    },
    {
      "id": "AU-HARNESS-R025.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** The loop applies an `unverified` or `falsified` verdict as a version-control revert of exactly the recorded files. The revert is itself a recorded change. No other file is touched. | `tests/harness/test_harness_edit_record.py::test_revert_touches_only_recorded_files`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 136
    },
    {
      "id": "AU-HARNESS-R025.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Wiring.** `AegisLoop` (`agent_utilities/harness/aegis_loop.py:91`, gate call at `:274`) is the production caller of `HarnessGate`. This row creates the call site that opens a `HarnessEditRecord` before each edit and closes it after the next round. Edits by `apply_edits` (`agent_utilities/harness/edit_engine.py:457`) have no declared prediction today. | `tests/harness/test_harness_edit_record.py::test_aegis_loop_opens_and_closes_record`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 137
    },
    {
      "id": "AU-HARNESS-R025.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Refusal.** The loop must refuse an edit with no declared prediction. It must also refuse an edit that touches a path outside its declared files. Both cases give a typed `prediction_missing` row before the edit applies. | `tests/harness/test_harness_edit_record.py::test_edit_without_prediction_refused`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 138
    },
    {
      "id": "AU-HARNESS-R025.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Evidence.** The loop must send the record to the engine. It holds the revision, prediction, verdict and run identifiers of both rounds. A revert links to its edit by `was_derived_from`. | `tests/harness/test_harness_edit_record.py::test_record_sent_with_runs`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 139
    },
    {
      "id": "AU-HARNESS-R025.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Hot-path proof.** The entry point is one evolution round through `AegisLoop` with a scripted engine verdict. A scripted round applies two edits. One verdict is `verified` and one is `falsified`. The test must show one kept edit, one reverted file and two sent records. | `tests/harness/test_harness_edit_prediction_e2e.py::test_failed_prediction_is_reverted`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 140
    },
    {
      "id": "AU-HARNESS-R026",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Apply parallel-map primitives and recursive decomposition within received limits",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Apply parallel-map primitives and recursive decomposition within received limits.** The harness must fan an operation over a collection and split an over-window prompt into snippets. It must stop at the depth, cost and concurrency limits received from the engine. [arXiv:2512.24601] | tests/harness/test_bounded_decomposition_e2e.py drives the rollup end to end.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 141
    },
    {
      "id": "AU-HARNESS-R026.1",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Model.** `MapPrimitive` and `DecompositionBudget` in `agent_utilities/rlm/bounded_map.py` are new. A primitive names an operation, a collection reference and a result schema. A budget holds `max_depth`, `max_items`, `max_cost_usd` and `max_model_calls`, received from EG-DECISION-ENGINE. Fallback defaults apply only when the engine gives none. Existing code: `map_concurrent` (`agent_utilities/core/model_concurrency.py:296`) fans out with no budget, and `RLMConfig.max_depth` (`agent_utilities/rlm/config.py:60`) bounds depth only. | `tests/harness/test_bounded_map.py::test_primitive_and_budget_fields`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 142
    },
    {
      "id": "AU-HARNESS-R026.2",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** The harness runs a primitive over the collection with one result slot per item. The item count is fixed before the run starts. `max_items` is received from the engine; fallback default 1000. A sub-call that spawns a further primitive consumes one depth level. | `tests/harness/test_bounded_map.py::test_map_stops_with_fixed_item_count`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 143
    },
    {
      "id": "AU-HARNESS-R026.3",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Behavior.** The engine marks a prompt as over the window using `context_window_fraction` (fallback default 0.8). The harness then stores the prompt as a variable. It gives the model the variable metadata and the primitives, never the text. Results combine programmatically through `run_full_rlm` (`agent_utilities/rlm/repl.py:972`). | `tests/harness/test_bounded_map.py::test_oversize_prompt_becomes_variable`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 144
    },
    {
      "id": "AU-HARNESS-R026.4",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Wiring.** `RLMEnvironment.run_parallel_sub_calls` (`agent_utilities/rlm/repl.py:470`) is the implementation. It has no production caller today. This row creates the call site inside `run_full_rlm`, which production reaches from `agent_utilities/graph/_router_impl.py:811` and `agent_utilities/graph/parallel_engine.py:1535`. The primitives replace unbounded loops in the sandbox namespace. | `tests/harness/test_bounded_map.py::test_run_full_rlm_uses_primitives`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 145
    },
    {
      "id": "AU-HARNESS-R026.5",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Refusal.** The sandbox must refuse a model-written loop over a collection. The refusal is a typed `loop_refused` observation that names the primitive to use. A breach of the depth, item, cost or call limit must end the work. The result is a typed `budget_exhausted` value. | `tests/harness/test_bounded_map.py::test_model_loop_refused_and_budget_breach_typed`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 146
    },
    {
      "id": "AU-HARNESS-R026.6",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Evidence.** The run trace must record `decompositionDepth`, `mapItemCount`, `subCallCount`, `decompositionCostUsd` and the budget outcome. Each field follows the write path of `AU-HARNESS-R017.4`. | `tests/harness/test_bounded_map.py::test_decomposition_fields_traced`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 147
    },
    {
      "id": "AU-HARNESS-R026.7",
      "kind": "requirement",
      "parent": "AU-HARNESS",
      "source": "specs/harness-evolution/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-HARNESS \u2014 Harness evolution and governed work",
      "definition": "**Hot-path proof.** The entry point is the planning step through `_router_impl.py:811`. It uses a scripted model, scripted limits and a prompt of 3 times the window. The test must show a combined answer and no raw prompt in any request. It must also show one refused loop and a cost under the limit. | `tests/harness/test_bounded_decomposition_e2e.py::test_oversize_prompt_answered_within_budget`.",
      "definition_source": "specs/harness-evolution/requirements.md",
      "definition_line": 148
    },
    {
      "id": "AU-FREEZE",
      "kind": "spec",
      "parent": null,
      "source": "specs/release-evidence-freeze/status.json",
      "title": "AU-FREEZE \u2014 Freeze authoritative AU release evidence",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/release-evidence-freeze/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/release-evidence-freeze/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/_version.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/_version.py"
        },
        {
          "declared_in": "specs/release-evidence-freeze/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/release/assemble_manifest.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/release/assemble_manifest.py"
        },
        {
          "declared_in": "specs/release-evidence-freeze/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/release/check_compatibility.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/release/check_compatibility.py"
        },
        {
          "declared_in": "specs/release-evidence-freeze/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/release/generate_component_evidence.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/release/generate_component_evidence.py"
        },
        {
          "declared_in": "specs/release-evidence-freeze/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/source_freeze_gate.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/scripts/source_freeze_gate.py"
        },
        {
          "declared_in": "specs/release-evidence-freeze/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/release-evidence-freeze/requirements.md"
        },
        {
          "declared_in": "specs/release-evidence-freeze/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/release-evidence-freeze/status.json"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "AU-FREEZE-R001",
      "kind": "requirement",
      "parent": "AU-FREEZE",
      "source": "specs/release-evidence-freeze/status.json",
      "title": "Canonical AU release-evidence freeze manifest",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4059a262d70e"
      ],
      "verified_by": [],
      "parent_title": "AU-FREEZE \u2014 Freeze authoritative AU release evidence",
      "definition": "**Canonical AU release-evidence freeze manifest.** AU generates a canonical, machine-readable freeze manifest from one exact Git commit, covering repository URL, tree hash, version, tracked source digest, lock and manifest hashes, the generated EG client digest, build toolchain and timestamp, and binds it to the build artifact digest and each mandatory scanner and test result together with its immutable CI run URL. | Regenerating the manifest at the same commit produces byte-identical output except for a separately declared observation timestamp, and a dirty working tree or an unknown input fails generation.",
      "definition_source": "specs/release-evidence-freeze/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-FREEZE-R002",
      "kind": "requirement",
      "parent": "AU-FREEZE",
      "source": "specs/release-evidence-freeze/status.json",
      "title": "Quarantine unresolved scanner findings from the freeze",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4059a262d70e"
      ],
      "verified_by": [],
      "parent_title": "AU-FREEZE \u2014 Freeze authoritative AU release evidence",
      "definition": "**Quarantine unresolved scanner findings from the freeze.** A scanner finding that has not been remediated and merged is kept quarantined, separate from the frozen evidence set, so an unresolved finding cannot be counted as a passing mandatory scanner result. | A qualification check confirms the freeze blocks when an in-scope candidate still has a quarantined, unresolved scanner finding.",
      "definition_source": "specs/release-evidence-freeze/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-FREEZE-R003",
      "kind": "requirement",
      "parent": "AU-FREEZE",
      "source": "specs/release-evidence-freeze/status.json",
      "title": "CI installs the engine from the EG release wheel",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4059a262d70e",
        "64d317c9e385"
      ],
      "verified_by": [],
      "parent_title": "AU-FREEZE \u2014 Freeze authoritative AU release evidence",
      "definition": "**CI installs the engine from the EG release wheel.** The `gates` job installs the Linux engine wheel from the epistemic-graph `engine-main` prerelease. It verifies the wheel against `SHA256SUMS` and records the source commit. An unavailable release falls back to the PyPI floor with a warning. The PyPI resolvability job stays advisory. | A `gates` run summary names the engine source commit, and `epistemic_graph` imports in the test environment.",
      "definition_source": "specs/release-evidence-freeze/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-RETRIEVAL",
      "kind": "spec",
      "parent": null,
      "source": "specs/retrieval-evaluation/status.json",
      "title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/retrieval-evaluation/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/retrieval-evaluation/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/harness/citation_tracker.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/harness/citation_tracker.py"
        },
        {
          "declared_in": "specs/retrieval-evaluation/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "agent_utilities/knowledge_graph/retrieval/evaluation_corpus.py",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/agent_utilities/knowledge_graph/retrieval/evaluation_corpus.py"
        },
        {
          "declared_in": "specs/retrieval-evaluation/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/retrieval-evaluation/requirements.md"
        },
        {
          "declared_in": "specs/retrieval-evaluation/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/retrieval-evaluation/status.json"
        },
        {
          "declared_in": "specs/retrieval-evaluation/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "test-spec.md",
          "repository": "Knuckles-Team/agent-utilities",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/50c313ab01871ff7e10aee2a9d0254fa55d71f07/specs/retrieval-evaluation/test-spec.md"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "AU-RETRIEVAL-R001",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Benchmark structure-aware retrieval against served hybrid search",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "64d317c9e385"
      ],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Benchmark structure-aware retrieval against served hybrid search.** AU benchmarks constrained section-leaf selection against hierarchical-document retrieval and the production hybrid vector-plus-graph retrieval path, using a versioned synthetic fixture corpus and optionally held-out ecosystem documents, under identical visible candidate sets and token budgets, measuring citation validity, visibility correctness, p50/p95 latency and index/update cost. | A reproducible benchmark report compares all methods on the fixture corpus with Recall@1/3, nDCG, citation-validity and latency metrics, and adoption requires a statistically defensible gain on a held-out set with no visibility or citation regression.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 5
    },
    {
      "id": "AU-RETRIEVAL-R002",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Studied retrieval techniques enter only through the benchmark",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Studied retrieval techniques enter only through the benchmark.** AU must run a technique proposed by the study pipeline through the `AU-RETRIEVAL-R001` harness under identical candidate sets and budgets. AU must refuse admission without a paired result. | `tests/retrieval/test_study_admission.py` proves refusal without a result and acceptance with one.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 6
    },
    {
      "id": "AU-RETRIEVAL-R003",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Iterative memory expansion stops at a declared budget and abstains",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Iterative memory expansion stops at a declared budget and abstains.** Agent memory access expands from cues through associative tags to content. It prunes paths using the evidence gathered so far and stops at a declared expansion budget. An exhausted budget returns abstention with the partial path. | See children `AU-RETRIEVAL-R003.1` to `AU-RETRIEVAL-R003.6`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 7
    },
    {
      "id": "AU-RETRIEVAL-R003.1",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Model.** `ExpansionBudget` holds a maximum step count, a maximum node count and a token cap. `ExpansionPath` holds the ordered cue, tag and content nodes with the evidence score of each step. Both live in `agent_utilities/knowledge_graph/retrieval/`. | `tests/retrieval/test_memory_expansion.py::test_budget_and_path_types`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 8
    },
    {
      "id": "AU-RETRIEVAL-R003.2",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Behavior.** Each step must expand the best-scoring frontier node, then prune paths whose evidence score falls below a named, replaceable threshold. Expansion must stop on enough evidence or on any budget limit [arXiv:2606.06036]. | `tests/retrieval/test_memory_expansion.py::test_prune_and_stop_rules`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 9
    },
    {
      "id": "AU-RETRIEVAL-R003.3",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Wiring.** The expansion attaches to `retrieve_hybrid_budgeted` (`agent_utilities/knowledge_graph/retrieval/hybrid_retriever.py:1898`), which calls `retrieve_hybrid` today. This row creates the call site that passes cue nodes into the expansion when the caller requests memory mode. | `tests/retrieval/test_memory_expansion.py::test_memory_mode_reaches_expansion`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 10
    },
    {
      "id": "AU-RETRIEVAL-R003.4",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Refusal.** An exhausted budget must return `RetrievalAbstention` with reason `expansion_budget_exhausted` and the partial `ExpansionPath`. The retriever must not return the partial path as an answer. | `tests/retrieval/test_memory_expansion.py::test_exhausted_budget_abstains`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 11
    },
    {
      "id": "AU-RETRIEVAL-R003.5",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Evidence.** The retrieval trace must record the steps taken, the nodes pruned, the budget spent and the stop reason. The paired benchmark in `AU-RETRIEVAL-R001` must report these fields. | `tests/retrieval/test_memory_expansion.py::test_trace_budget_fields`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 12
    },
    {
      "id": "AU-RETRIEVAL-R003.6",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Hot-path proof.** The entry point is the served memory retrieval operation. A cue with enough evidence must answer within budget. A cue in a sparse graph must abstain with the partial path. The test observes the trace for both. | `tests/retrieval/test_memory_expansion_served.py::test_served_memory_retrieval_budget`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 13
    },
    {
      "id": "AU-RETRIEVAL-R004",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "The generation loop requests more evidence when told it is insufficient, then abstains with a typed refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**The generation loop requests more evidence when told it is insufficient, then abstains with a typed refusal.** The loop receives the sufficiency verdict and the fallback policy from the engine. It must request another round on `insufficient`. Under strict fallback it must abstain and never answer. | See children `AU-RETRIEVAL-R004.1` to `AU-RETRIEVAL-R004.6`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 14
    },
    {
      "id": "AU-RETRIEVAL-R004.1",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Model.** The loop receives `EvidenceSufficiency` (`sufficient`, `insufficient`) and `FallbackPolicy` (`lenient`, `strict`) from `EG-FEDERATED-QUERY`. The round limit is received from the engine; fallback default 2. The harness defines no sufficiency rule. | `tests/retrieval/test_insufficient_evidence.py::test_loop_receives_verdict_and_policy`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 15
    },
    {
      "id": "AU-RETRIEVAL-R004.2",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Behavior.** `ExecutableRagProgram.run` (`executable_rag.py:236`) must request another round when the verdict is `insufficient`. It must stop requesting at the received round limit. Then the received policy applies. `lenient` returns the extractive answer. `strict` abstains. | `tests/retrieval/test_insufficient_evidence.py::test_loop_requests_rounds_then_applies_policy`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 16
    },
    {
      "id": "AU-RETRIEVAL-R004.3",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Wiring.** The run loop reads the verdict where it now reads the marker test at `executable_rag.py:256` and `executable_rag.py:266`. `HybridRetriever.retrieve_executable` (`hybrid_retriever.py:1917`) passes the received policy. Its production caller is `_analysis_action_executable_rag` (`analysis_tools.py:2294`). | `tests/retrieval/test_insufficient_evidence.py::test_policy_reaches_answer_step`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 17
    },
    {
      "id": "AU-RETRIEVAL-R004.4",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Refusal.** Under `strict` the loop must return `RetrievalAbstention` with reason `insufficient_evidence` and the evidence gathered. It must not return an answer string. The type is the one in `AU-RETRIEVAL-R003.4`. | `tests/retrieval/test_insufficient_evidence.py::test_strict_abstains_without_answer`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 18
    },
    {
      "id": "AU-RETRIEVAL-R004.5",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Evidence.** The loop must emit each round, the received verdict, the received policy and the outcome (`answered` or `abstained`) as `StepTrace` events (`executable_rag.py:66`). | `tests/retrieval/test_insufficient_evidence.py::test_trace_records_rounds_and_outcome`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 19
    },
    {
      "id": "AU-RETRIEVAL-R004.6",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Hot-path proof.** The entry point is the served `executable_rag` analysis action. With a scripted `strict` policy and an `insufficient` verdict, the loop must abstain after the round limit. The test observes the trace. | `tests/retrieval/test_insufficient_evidence_served.py::test_served_executable_rag_abstains_under_strict`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 20
    },
    {
      "id": "AU-RETRIEVAL-R005",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "The iterative loop stops when the engine's stop verdict says so",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**The iterative loop stops when the engine's stop verdict says so.** The loop receives a stop verdict, with its reason and margin, each round. It must stop on `stop` and continue otherwise. It must trace the received reason. | See children `AU-RETRIEVAL-R005.1` to `AU-RETRIEVAL-R005.6`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 21
    },
    {
      "id": "AU-RETRIEVAL-R005.1",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Model.** The loop receives `StopDecision` (reason, margin, threshold) from `EG-FEDERATED-QUERY`. The engine computes the calibrated margin. The harness holds no calibration table. Any threshold is received from the engine; fallback default is the repeat-only rule. | `tests/retrieval/test_confidence_margin_stop.py::test_loop_receives_stop_decision`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 22
    },
    {
      "id": "AU-RETRIEVAL-R005.2",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Behavior.** The loop must pass each round's answer to the engine and stop when the verdict says stop. It must not compare confidences itself. | `tests/retrieval/test_confidence_margin_stop.py::test_loop_obeys_stop_verdict`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 23
    },
    {
      "id": "AU-RETRIEVAL-R005.3",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Wiring.** The loop calls the engine at `iterative_expansion.py:171` and `iterative_expansion.py:229`, and at `active_reconstruction.py:237` and `active_reconstruction.py:282`. The production caller of the first is `engine_query.py:1509` through `IterativeQueryExpander.run`. | `tests/retrieval/test_confidence_margin_stop.py::test_expander_applies_engine_verdict`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 24
    },
    {
      "id": "AU-RETRIEVAL-R005.4",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Refusal.** When the engine gives no verdict, the loop must use the fallback repeat-only rule and record the margin as `unavailable`. A malformed verdict must raise a typed validation error. | `tests/retrieval/test_confidence_margin_stop.py::test_missing_or_invalid_verdict`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 25
    },
    {
      "id": "AU-RETRIEVAL-R005.5",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Evidence.** The loop must emit the received stop reason, margin, threshold and round count to the trace. | `tests/retrieval/test_confidence_margin_stop.py::test_trace_stop_reason_fields`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 26
    },
    {
      "id": "AU-RETRIEVAL-R005.6",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Hot-path proof.** The entry point is the query operation in `engine_query.py` that builds the expander. A scripted `stop` verdict must end the loop early. A `continue` verdict must keep it running. The test observes the trace. | `tests/retrieval/test_confidence_margin_stop_served.py::test_served_query_obeys_stop_verdict`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 27
    },
    {
      "id": "AU-RETRIEVAL-R006",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "The answer step applies the engine's arbitration verdict",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**The answer step applies the engine's arbitration verdict.** The step receives the verdict between model prior and retrieved evidence from the engine. It must return the chosen candidate, or abstain with a typed refusal. | See children `AU-RETRIEVAL-R006.1` to `AU-RETRIEVAL-R006.6`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 28
    },
    {
      "id": "AU-RETRIEVAL-R006.1",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Model.** The step receives `ArbitrationResult` (chosen candidate or abstention, both candidates, evidence classes) from `EG-FEDERATED-QUERY`. The engine owns the margin and the prior probe. Any margin is received from the engine; fallback default is abstain. | `tests/retrieval/test_prior_evidence_arbitration.py::test_step_receives_arbitration_result`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 29
    },
    {
      "id": "AU-RETRIEVAL-R006.2",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Behavior.** The step must return the chosen candidate when the engine chooses one. It must abstain when the engine abstains. It must not compare the candidates itself. | `tests/retrieval/test_prior_evidence_arbitration.py::test_step_applies_verdict`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 30
    },
    {
      "id": "AU-RETRIEVAL-R006.3",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Wiring.** The step applies the verdict at the answer step of `ExecutableRagProgram.run` (`executable_rag.py:256`), after `answer_fn`. The production caller is `_analysis_action_executable_rag` (`analysis_tools.py:2294`). | `tests/retrieval/test_prior_evidence_arbitration.py::test_verdict_applied_at_answer_step`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 31
    },
    {
      "id": "AU-RETRIEVAL-R006.4",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Refusal.** On an abstain verdict the step must return `RetrievalAbstention` with reason `prior_evidence_conflict`. It must carry both candidates and both evidence classes. | `tests/retrieval/test_prior_evidence_arbitration.py::test_abstain_verdict_carries_both`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 32
    },
    {
      "id": "AU-RETRIEVAL-R006.5",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Evidence.** The step must emit the received verdict, both candidates, the margin used and the evidence classes to the trace. | `tests/retrieval/test_prior_evidence_arbitration.py::test_trace_records_both_candidates`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 33
    },
    {
      "id": "AU-RETRIEVAL-R006.6",
      "kind": "requirement",
      "parent": "AU-RETRIEVAL",
      "source": "specs/retrieval-evaluation/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "AU-RETRIEVAL \u2014 Reproducible structure-aware retrieval evaluation",
      "definition": "**Hot-path proof.** The entry point is the served `executable_rag` analysis action. A scripted choose verdict must return the candidate. A scripted abstain verdict must abstain with both candidates. The test observes the trace. | `tests/retrieval/test_prior_evidence_arbitration_served.py::test_served_verdict_application`.",
      "definition_source": "specs/retrieval-evaluation/requirements.md",
      "definition_line": 34
    }
  ],
  "github": {
    "issues": {
      "available": true,
      "items": []
    },
    "pull_requests": {
      "available": true,
      "items": [
        {
          "number": 282,
          "title": "docs(specs): define current-plan snapshot producer",
          "html_url": "https://github.com/Knuckles-Team/agent-utilities/pull/282",
          "created_at": "2026-10-11T23:58:32Z",
          "updated_at": "2026-10-12T00:07:58Z"
        },
        {
          "number": 281,
          "title": "docs(specs): align context and disclosure consumer boundaries",
          "html_url": "https://github.com/Knuckles-Team/agent-utilities/pull/281",
          "created_at": "2026-10-11T23:54:31Z",
          "updated_at": "2026-10-12T00:07:56Z"
        }
      ]
    }
  },
  "spec_edges": [
    [
      "AU-BOUNDARY",
      "references",
      "AU-CONTEXT"
    ],
    [
      "AU-BOUNDARY",
      "references",
      "AU-CONTROL"
    ],
    [
      "AU-BOUNDARY",
      "references",
      "AU-DEV"
    ],
    [
      "AU-BOUNDARY",
      "references",
      "AU-HARNESS"
    ],
    [
      "AU-BOUNDARY",
      "references",
      "AU-INTEGRATION"
    ],
    [
      "AU-BOUNDARY",
      "references",
      "AU-QUAL"
    ],
    [
      "AU-BOUNDARY",
      "references",
      "AU-RETIRE"
    ],
    [
      "AU-BOUNDARY",
      "references",
      "AU-SEC"
    ],
    [
      "AU-BOUNDARY",
      "references",
      "AU-SEMANTIC"
    ],
    [
      "AU-CONTEXT",
      "references",
      "AU-SEC"
    ],
    [
      "AU-CONTROL",
      "references",
      "AU-HARNESS"
    ],
    [
      "AU-HARNESS",
      "references",
      "AU-CONTROL"
    ],
    [
      "AU-RETIRE",
      "references",
      "AU-BOUNDARY"
    ]
  ]
}
