{
  "version": 1,
  "repository": "Knuckles-Team/graph-os",
  "revision": "331044ed7daec51a3633e0a7ea712293b2063bf3",
  "captured_at": "2026-10-13T14:36:16.947951+00:00",
  "records": [
    {
      "id": "GRAPHOS-A2A",
      "kind": "spec",
      "parent": null,
      "source": "specs/a2a/status.json",
      "title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/a2a/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/admission.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/admission.py"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/admission.py:50",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/admission.py#L50"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/admission.py:61",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/admission.py#L61"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/application.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/application.py"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/application.py:140",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/application.py#L140"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/authority.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/authority.py"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/authority.py:256",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/authority.py#L256"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/composition.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/composition.py"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/models.py:104",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/models.py#L104"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/models.py:167",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/models.py#L167"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/routing.py:71",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/routing.py#L71"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/service.py:40",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/service.py#L40"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/access/service.py:54",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/access/service.py#L54"
        },
        {
          "declared_in": "specs/a2a/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/invoke/pipeline.py:641",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/invoke/pipeline.py#L641"
        },
        {
          "declared_in": "specs/a2a/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "`GRAPHOS-A2A`",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/a2a/spec.md"
        },
        {
          "declared_in": "specs/a2a/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/models.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/models.py"
        },
        {
          "declared_in": "specs/a2a/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/a2a/requirements.md"
        },
        {
          "declared_in": "specs/a2a/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "test-spec.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/a2a/test-spec.md"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/a2a/spec.md",
          "evidence": "external declaration; not verified",
          "kind": "references",
          "label": "`AU-CONTROL-001`",
          "repository": "Knuckles-Team/agent-utilities",
          "url": "https://github.com/Knuckles-Team/agent-utilities/blob/main/specs/agent-control-plane/spec.md"
        },
        {
          "declared_in": "specs/a2a/spec.md",
          "evidence": "external declaration; not verified",
          "kind": "references",
          "label": "`EG-DECISION-ENGINE-001`",
          "repository": "Knuckles-Team/epistemic-graph",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/decision-engine/spec.md"
        }
      ],
      "plan_diagrams": [
        "flowchart LR\n  H[human A2A client] --> V[GraphOS verified A2A adapter]\n  V --> T[A2AService and operation invoke]\n  T --> O[agent orchestrator public port]\n  T --> E[\"engine WorkItem, grant and plan leases\"]\n  T --> F[fleet via hosted operation invoke]\n  E --> A[durable audit reservation and outcome]\n",
        "flowchart LR\n  C[A2A caller] --> AC[Agent Card: from_wired_authorities]\n  C --> S[message/stream]\n  C --> G[\"tasks/get (history)\"]\n  S --> AU[\"AU WorkItem event stream (AU-CONTROL-001)\"]\n  G --> EG[\"EG durable transition ledger (EG-DURABLE-KERNEL)\"]\n  AU --> PN[push-notification trigger]\n  PN --> OB[\"EG durable outbox (EG-DURABLE-KERNEL-R001)\"]\n",
        "flowchart LR\n  C[A2A caller: agent graph ref + contextBudgetTokens] --> D[admit_tool_subset admission door]\n  D -->|needs| EG[\"EG AgentAssemble (EG-DECISION-ENGINE-R036)\"]\n  D -->|needs| AU[\"AU signed AgentTurnEnvelope allowed-tool-subset (AU-CONTROL-R035)\"]\n  D -->|refused| R[\"typed ToolSubsetAdmissionDecision (admitted=False; reason; provenance)\"]\n  D -->|admitted, once both land| A[\"ToolSubsetAdmissionDecision (admitted tools + provenance)\"]\n  A --> X[OrchestratorA2ARouter / WorkItemA2AAuthority dispatch]\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-A2A-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "A2A facade over the engine and agent services",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "a8ed61b538e7"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**A2A facade over the engine and agent services.** graph-os implements A2A as a facade over the public graph-engine and agent-utilities services exposed through MCP and REST, starting with unary agent-card discovery and task send/get/list/cancel, then adding durable task streaming and resubscribe without a second task store. Split into `GRAPHOS-A2A-R001.1` (the resubscribe method-table slice) with the event-cursor-backed streaming fixture remaining open under the parent. | Proven by contract tests covering the unary task operations and a durable stream/resubscribe fixture.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-A2A-R001.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Fail-closed `tasks/resubscribe` stub on the A2A method table",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "a8ed61b538e7",
        "d5bff77ba836"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Fail-closed `tasks/resubscribe` stub on the A2A method table.** graph-os registers `tasks/resubscribe` in the A2A JSON-RPC method table with typed, validated params, and refuses it with a distinct error until durable, restart-safe event-cursor-backed streaming exists \u2014 never silently succeeding, never reported as an unrecognized method. | Proven by a test asserting `tasks/resubscribe` validates params and is refused with a dedicated JSON-RPC error code distinct from \"method not found\".",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-A2A-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Inbound task routing with caller-filtered tool exposure",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "9a79acee8b6c"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Inbound task routing with caller-filtered tool exposure.** graph-os routes inbound A2A tasks through the existing agent orchestration port into engine-backed work items. Caller-filtered assembly selects the agent and its exposed tool subset. The caller sees only authorized tools. `GRAPHOS-A2A-R002.1` covers fail-closed refusal when assembly selects a tool subset. `GRAPHOS-A2A-R002.2` covers caller-filtered enforcement through the AU signed dispatch carrier. That child remains open under the parent. | Proven by integration tests asserting routed tasks map to durable work-item identities and exposed tool subsets match the caller's authorization.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-A2A-R002.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Fail-closed refusal when assembly selects a tool subset",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "dfe297e0466d"
      ],
      "verified_by": [
        "tests/a2a/test_authority.py:129"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Fail-closed refusal when assembly selects a tool subset.** graph-os refuses `dispatch()` with a distinct error before durable admission when a routing decision selects a tool subset. The signed AU dispatch carrier cannot enforce an allowlist at execution time. | Proven by a test asserting dispatch raises `A2AAssemblyUnavailable` whenever `decision.selected_tools` is non-empty.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-A2A-R002.2",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Caller-filtered tool-subset enforcement at dispatch",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Caller-filtered tool-subset enforcement at dispatch.** The signed AU agent-dispatch carrier accepts and enforces an allowed-tool subset end to end. The caller's exposed tools match its authorization at execution time. Split into `GRAPHOS-A2A-R002.2.1` (the owner-named AU dependency) because graph-os has no public door to add this itself. | Proven by integration tests asserting an enforced tool subset at execution, not just an advisory list.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-A2A-R002.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Owner-blocked: AU carried, enforced tool-subset field",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Owner-blocked: AU carried, enforced tool-subset field.** `agent_utilities.orchestration.agent_dispatch.AgentTurnEnvelope`/`enqueue_agent_turn` has no field or mechanism to carry and enforce a caller-filtered tool allowlist at execution time. graph-os's `WorkItemA2AAuthority._enqueue`/`dispatch` (`graph_os/a2a/authority.py`) already refuse every request carrying `decision.selected_tools` (`GRAPHOS-A2A-R002.1`) rather than pass through an unenforced allowlist. agent-utilities owns adding that carried, enforced field. Until an agent-utilities spec exists and lands it, `GRAPHOS-A2A-R002.2` cannot be implemented in this repository. | No graph-os-side test is possible against the current AU carrier contract. Verified by the fail-closed tests bound to `GRAPHOS-A2A-R002.1` continuing to refuse rather than silently drop the filter. Tracked as the explicit cross-repo dependency recorded in `tasks.md`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-A2A-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "No duplicate skill or prompt harvesting in the multiplexer",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2cbed24252ec",
        "deb2b45bf83d"
      ],
      "verified_by": [
        "tests/fleet/test_no_duplicate_skill_prompt_harvest.py:58"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**No duplicate skill or prompt harvesting in the multiplexer.** graph-os removes the multiplexer's separate skill and prompt harvesting path so there is exactly one owner for tool, skill, and prompt discovery, with no duplicate ingestion path remaining in the running package. | Proven by a runtime absence check confirming no duplicate harvest path is present or reachable in the deployed package.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 11
    },
    {
      "id": "GRAPHOS-A2A-R004",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Served MCP bridge runs FastMCP 4, matching its declared version",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d5bff77ba836",
        "d60b46fc6984"
      ],
      "verified_by": [
        "tests/deployment/test_release_canary.py:31",
        "tests/deployment/test_release_canary.py:64",
        "tests/deployment/test_release_canary.py:83",
        "tests/deployment/test_release_canary.py:95"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Served MCP bridge runs FastMCP 4, matching its declared version.** graph-os's deployed MCP bridge runs on FastMCP 4 end to end, including native WebMCP and a single composition loop, so the dependency version it declares matches the version actually serving requests. | Proven by semantic tests run against the exact declared FastMCP and engine dependency versions, and a live-deployment probe confirming the served version.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 12
    },
    {
      "id": "GRAPHOS-A2A-R005",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Durable, fail-closed A2A approval exchange for tool calls",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "9a79acee8b6c"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Durable, fail-closed A2A approval exchange for tool calls.** graph-os defines a human approval exchange for pending tool-call effects in the A2A contract. The task enters an input-required state. The effect requires a signed approval message bound to that specific pending call. Approval stays disabled until the full signed exchange is implemented and proven end to end. Until then, every approval attempt is rejected. Split into `GRAPHOS-A2A-R005.1` (the fail-closed `graphos.plan/confirm` stub) with `GRAPHOS-A2A-R005.2` (the full signed chain) remaining open under the parent. | Negative tests prove approval is refused while unimplemented. A later full-chain test covers request, signed approval and execution.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 13
    },
    {
      "id": "GRAPHOS-A2A-R005.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Fail-closed `graphos.plan/confirm` stub on the A2A method table",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a226c8fdf397"
      ],
      "verified_by": [
        "tests/a2a/test_application.py:274"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Fail-closed `graphos.plan/confirm` stub on the A2A method table.** graph-os registers `graphos.plan/confirm` in the A2A JSON-RPC method table with typed, validated params, and refuses every confirmation attempt with a distinct error until the full signed human approval exchange exists. | Proven by a test asserting `graphos.plan/confirm` validates params and is refused with a dedicated JSON-RPC error code distinct from \"method not found\".",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 14
    },
    {
      "id": "GRAPHOS-A2A-R005.2",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Full signed human approval chain and input-required task emission",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cdde0200a54a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Full signed human approval chain and input-required task emission.** A pending effect moves its durable task to `input-required` with a typed, server-attested pending-call envelope, and an atomic compare-and-set consumes a revocable human grant exactly once before the effect runs. Split into `GRAPHOS-A2A-R005.2.1` (the durable, revocable human-grant store with atomic compare-and-set consumption) with the rest of the chain (input-required task emission wired to a live pending call, signature verification, and the full request-to-execution test) remaining open under this row. | Proven by a full chain test from request through signed approval to execution, and negative tests for replay, changed params, different human, and expired/revoked grant.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 15
    },
    {
      "id": "GRAPHOS-A2A-R005.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Durable, revocable human-grant store with atomic compare-and-set consumption",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cdde0200a54a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Durable, revocable human-grant store with atomic compare-and-set consumption.** No grant store exists anywhere in graph-os today (confirmed by source search: no `GrantStore`/compare-and-set human-approval primitive is defined). `GRAPHOS-A2A-R005.2` cannot move a task to `input-required` and consume a grant exactly once until this store \u2014 issuance, lookup, and a single atomic consume-once operation keyed by pending-call id \u2014 is specified and built as its own component. | Proven by unit tests asserting a grant is consumed at most once under concurrent compare-and-set attempts, and that consuming an expired or revoked grant fails closed.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 16
    },
    {
      "id": "GRAPHOS-A2A-R005.3",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Model.** `ToolActionAdmissionRequest` and `ToolActionApproval` are new frozen models in `graph_os/a2a/tool_action_admission.py`. Extend `A2APlanConfirmParams` (`graph_os/a2a/models.py:104`) as a closed discriminated union: `confirmation_kind=tool_action` carries this request; `confirmation_kind=held_item` carries HeldItemAdmissionRequest. Reject missing, unknown or mixed variants. The request carries `pending_call_id`, `params_digest`, `trust_mark_ref` and `action_class`. `action_class` is one of `egress`, `privileged_call` or `delegation`. The approval carries `verdict` (`admit` or `deny`), `approval_ref` and `decision_ref`. The engine produces the trust mark; graph-os only carries its reference. | Proven by `tests/a2a/test_tool_action_admission.py::test_models_are_closed_and_frozen`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 17
    },
    {
      "id": "GRAPHOS-A2A-R005.4",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Behavior.** `ToolActionAdmitter.admit` makes one engine round trip and returns the engine's verdict unchanged. The named default `deny_without_verdict` applies only when the engine returns none. graph-os holds no policy table and no threshold. The engine decides whether an action follows untrusted content. | Proven by `tests/a2a/test_tool_action_admission.py::test_admit_returns_engine_verdict_unchanged` and `::test_default_applies_only_without_verdict`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 18
    },
    {
      "id": "GRAPHOS-A2A-R005.5",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Wiring.** Replace the synchronous `_plan_confirm_stub` with one async confirm dispatcher over the closed confirmation_kind union; the tool_action branch awaits shared invoke with Surface.A2A, verified caller, signed authority and audit before `ToolActionAdmitter.admit`. The current stub is (`graph_os/a2a/application.py:140`), registered at `graph_os/a2a/application.py:154` and reached from `_invoke_method` (`graph_os/a2a/application.py:157`) on `POST /a2a`. The harness check at `agent_utilities/security/tool_guard.py:383` calls it through this method and applies the returned approval. No production caller reaches an admission function today. | Proven by `tests/a2a/test_tool_action_admission.py::test_confirm_dispatch_reaches_admitter`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 19
    },
    {
      "id": "GRAPHOS-A2A-R005.6",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Refusal.** The admitter refuses with a typed `ToolActionRefusal` reason: `ENGINE_UNAVAILABLE`, `TRUST_MARK_MISSING`, `ACTION_CLASS_UNKNOWN`, `GRANT_STORE_UNAVAILABLE` or `ABSTAINED`. A refusal never reads as approval. The harness must treat every refusal as deny. Approval stays refused until the full GRAPHOS-A2A-R005.2 signed chain and GRAPHOS-A2A-R006.2 verified-caller bridge (including R006.2.1) pass: live input-required pending call, signature verification, exact params/human binding, one-time grant consumption, expiry and revocation checks. The grant store alone is insufficient. | Proven by `tests/a2a/test_tool_action_admission.py::test_each_refusal_reason_denies`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 20
    },
    {
      "id": "GRAPHOS-A2A-R005.7",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Evidence.** Every approval and refusal records `approval_ref`, `decision_ref`, `pending_call_id`, `action_class` and `params_digest` in the audit reservation of `GRAPHOS-A2A-R007`. No credential or parameter value appears in the record. | Proven by `tests/a2a/test_tool_action_admission.py::test_audit_entry_names_decision_without_values`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 21
    },
    {
      "id": "GRAPHOS-A2A-R005.8",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Hot-path proof.** The entry point is the wire method `graphos.plan/confirm` over `POST /a2a`. A scripted engine returns admit, deny and abstain for one pending call per action class. The test observes the verdict in the response and one linked audit entry per call. It proves a refusal never lets the action proceed. | Proven by `tests/a2a/test_tool_action_admission_e2e.py::test_confirm_returns_engine_verdict_and_audit`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 22
    },
    {
      "id": "GRAPHOS-A2A-R006",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Operation invoke and plan-confirm methods for A2A",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "9a79acee8b6c"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Operation invoke and plan-confirm methods for A2A.** graph-os implements graphos.op/invoke and graphos.plan/confirm as A2A methods registered in its method table, so invoking an operation and confirming its input-required approval use the same scope, policy, and error semantics as other hosted operations. Split into `GRAPHOS-A2A-R006.1` (both methods registered, fail-closed) with `GRAPHOS-A2A-R006.2` (the bridge to the shared hosted-operation registry) remaining open under the parent. | Proven by contract tests asserting invoke and confirm share identical authorization and error codes with the MCP and REST paths for the same operation.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 23
    },
    {
      "id": "GRAPHOS-A2A-R006.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Register `graphos.op/invoke` and `graphos.plan/confirm`, fail-closed",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "cdde0200a54a"
      ],
      "verified_by": [
        "tests/a2a/test_application.py:236",
        "tests/a2a/test_application.py:275"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Register `graphos.op/invoke` and `graphos.plan/confirm`, fail-closed.** graph-os registers both methods in the A2A JSON-RPC method table with typed, validated params, and refuses both with a distinct error until the shared hosted-operation registry's `invoke` path (`Surface.A2A`) is bridged in. | Proven by tests asserting both methods validate params and are refused with a dedicated JSON-RPC error code distinct from \"method not found\".",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 24
    },
    {
      "id": "GRAPHOS-A2A-R006.2",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Bridge `graphos.op/invoke` to the shared hosted-operation registry",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cdde0200a54a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Bridge `graphos.op/invoke` to the shared hosted-operation registry.** `graphos.op/invoke` passes the verified A2A caller to `graph_os.api.invoke.pipeline.invoke` with `Surface.A2A`, reusing the exact scope, policy, effect, reservation, audit, and error envelope already proven for MCP and HTTP. Split into `GRAPHOS-A2A-R006.2.1` (the A2A-side verified-caller gap owned by agent-utilities) with the actual bridge wiring remaining open under this row. | Proven by contract tests asserting invoke shares identical authorization and error codes with the MCP and REST paths for the same operation.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 25
    },
    {
      "id": "GRAPHOS-A2A-R006.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "A2A authenticator must yield a `VerifiedCaller`-compatible session (owner: agent-utilities)",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cdde0200a54a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**A2A authenticator must yield a `VerifiedCaller`-compatible session (owner: agent-utilities).** `graph_os.api.invoke.pipeline.invoke` requires a `VerifiedCaller` whose `.session` exposes `.actor`, `.tenant`, and `.engine_verified_context()` (see `graph_os.api.invoke.bootstrap.VerifiedSession`/`verify_current_from_session`). Today's `AmbientA2AAuthenticator` only calls `agent_utilities.api.session.resolve_session(required_scope=scope)` for its side effect and discards the result, so no A2A path can construct a `VerifiedCaller`. agent-utilities must confirm or extend `resolve_session`'s return shape to satisfy this protocol before the bridge in `GRAPHOS-A2A-R006.2` can be wired. | Proven by a contract test asserting `agent_utilities.api.session.resolve_session` returns an object satisfying `graph_os.api.invoke.bootstrap.VerifiedSession`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 26
    },
    {
      "id": "GRAPHOS-A2A-R006.3",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Model.** `HeldItemAdmissionRequest` and `HeldItemVerdict` are new frozen models in `graph_os/a2a/held_item_admission.py`. The request carries `item_kind` (`run_output_proposal` or `stored_run_program`), `item_ref`, `content_digest` and `engine_decision_ref`. The verdict carries `outcome` (`admitted`, `rejected` or `abstained`), `verdict_ref` and, for a program, `verification_ref`. The engine owns the held item and its stored form. [arXiv:2606.17929] | Proven by `tests/a2a/test_held_item_admission.py::test_models_are_closed_and_frozen`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 27
    },
    {
      "id": "GRAPHOS-A2A-R006.4",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Behavior.** `HeldItemAdmitter.admit` asks the engine for the verdict on a held item and returns it unchanged. For a stored program, it checks that the verification record names a verifier other than the compiler. It checks pass and retirement evidence against the engine-supplied policy and thresholds. Missing policy evidence or thresholds must refuse; GraphOS has no local default count. graph-os holds no policy of its own. [arXiv:2606.17929] | Proven by `tests/a2a/test_held_item_admission.py::test_program_needs_distinct_verifier_and_required_passes`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 28
    },
    {
      "id": "GRAPHOS-A2A-R006.5",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Wiring.** The held_item branch of the same async confirmation_kind dispatcher awaits shared invoke with Surface.A2A, signed authority and audit before `HeldItemAdmitter.admit`; it replaces the current synchronous `_plan_confirm_stub` (`graph_os/a2a/application.py:140`), reached from `_invoke_method` (`graph_os/a2a/application.py:157`). Wire a dedicated public engine held-item admission port through shared `graph_os.api.invoke.pipeline.invoke` with the verified caller and `Surface.A2A`. Preserve the full signed approval prerequisites, scope/policy checks, pending-call/params/human binding, grant/plan fences, audit reservation and consume-once behavior; graph-os keeps no local record. This port and adapter are new wiring. Do not call `approve_elevation` (`graph_os/access/service.py:54`): it validates ElevationApproval and hardcodes OPERATOR_CONSOLE, which is a different authority surface. The harness moves its proposal approval from `agent_utilities/knowledge_graph/enrichment/writeback/approval.py:47`. No production caller reaches an admission function today. | Proven by `tests/a2a/test_held_item_admission.py::test_confirm_dispatch_reaches_held_item_admitter`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 29
    },
    {
      "id": "GRAPHOS-A2A-R006.6",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Refusal.** The admitter refuses with a typed reason: `ENGINE_UNAVAILABLE`, `ITEM_UNKNOWN`, `DIGEST_MISMATCH`, `VERIFIER_NOT_INDEPENDENT`, `PASSES_INSUFFICIENT`, `RETIRED`, `POLICY_EVIDENCE_MISSING` or `ABSTAINED`. A refusal leaves the item held. The harness must not apply a refused output or run a refused program. | Proven by `tests/a2a/test_held_item_admission.py::test_each_refusal_leaves_item_held`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 30
    },
    {
      "id": "GRAPHOS-A2A-R006.7",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Evidence.** Every verdict records `verdict_ref`, `item_kind`, `item_ref`, `content_digest` and `verification_ref` in the audit reservation of `GRAPHOS-A2A-R007`. A rejected item records its refusal reason. | Proven by `tests/a2a/test_held_item_admission.py::test_audit_entry_names_verdict_and_item`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 31
    },
    {
      "id": "GRAPHOS-A2A-R006.8",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Hot-path proof.** The entry point is the wire method `graphos.plan/confirm` over `POST /a2a`. A scripted engine holds one run output and one stored program. The test observes an admitted verdict applied once through shared invoke with Surface.A2A, a rejected verdict leaving the item held, and the linked audit entry. It proves operator elevation is never called and replay, changed params, wrong human, expired/revoked grants and unavailable producer ports cannot apply an item. | Proven by `tests/a2a/test_held_item_admission_e2e.py::test_confirm_admits_or_rejects_held_item`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 32
    },
    {
      "id": "GRAPHOS-A2A-R007",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Pre-effect audit reservation for every governed write",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "9a79acee8b6c",
        "c2a6ab839fd3"
      ],
      "verified_by": [
        "tests/api/test_invoke_contract.py:435",
        "tests/api/test_invoke_governance.py:443"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Pre-effect audit reservation for every governed write.** Before any governed write or administrative effect, graph-os reserves a tenant-scoped, idempotent audit entry in a pending state, binds it to the verified calling service's claims, and links the entry to the effect's outcome once known. A request with no audit class or an unavailable durable audit writer is rejected before the effect runs. | Proven by negative tests asserting a missing audit class or unavailable writer blocks the effect, and a reconciliation test linking a pending reservation to its final outcome.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 33
    },
    {
      "id": "GRAPHOS-A2A-R008",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "First-party A2A facade, not a vendored wrapper",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d5bff77ba836"
      ],
      "verified_by": [
        "tests/a2a/test_first_party_facade.py:53",
        "tests/a2a/test_first_party_facade.py:66",
        "tests/a2a/test_first_party_facade.py:84"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**First-party A2A facade, not a vendored wrapper.** graph-os implements the A2A protocol facade itself as first-party code over the public graph-engine and agent orchestration ports, rather than wrapping or depending on an external vendored A2A implementation. | Proven by a source-level dependency check confirming the A2A facade is implemented in this repository against the public ports.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 34
    },
    {
      "id": "GRAPHOS-A2A-R009",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Advertise only what is wired",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "35257e780f7c"
      ],
      "verified_by": [
        "tests/a2a/test_models.py:38",
        "tests/a2a/test_models.py:47",
        "tests/a2a/test_models.py:56",
        "tests/a2a/test_models.py:67",
        "tests/a2a/test_models.py:88"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Advertise only what is wired.** graph-os's Agent Card sets `capabilities.streaming`, `capabilities.pushNotifications`, and `capabilities.stateTransitionHistory` true only when a real durable authority object implementing the matching protocol (`A2AStreamingAuthority`, `A2APushNotificationAuthority`, `A2ATransitionHistoryAuthority`) is wired into the running composition; no flag or partial authority can force a field true. Split into `GRAPHOS-A2A-R009.1` (the typed capability-advertisement model, landed in this PR). | Proven by unit tests over `A2AAgentCapabilities.from_wired_authorities` asserting default-false, per-authority true, and a `TypeError` refusal on a non-conforming object.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 35
    },
    {
      "id": "GRAPHOS-A2A-R009.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Typed Agent Card capability-advertisement model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "35257e780f7c"
      ],
      "verified_by": [
        "tests/a2a/test_models.py:39",
        "tests/a2a/test_models.py:48",
        "tests/a2a/test_models.py:57",
        "tests/a2a/test_models.py:68",
        "tests/a2a/test_models.py:89"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Typed Agent Card capability-advertisement model.** graph-os defines `A2AAgentCapabilities.from_wired_authorities` plus `A2AStreamingAuthority`/`A2APushNotificationAuthority`/`A2ATransitionHistoryAuthority` runtime-checkable protocols in `graph_os/a2a/models.py`, so a capability field is derived from whether a conforming authority object was supplied, never from a bare boolean. | Proven by `tests/a2a/test_models.py` covering default-false, selective true, all-true, and refusal on a non-conforming authority.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 36
    },
    {
      "id": "GRAPHOS-A2A-R010",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "WorkItem stream projection, not a shadow log",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**WorkItem stream projection, not a shadow log.** graph-os's `message/stream` and push delivery read agent-utilities' WorkItem event stream (`AU-CONTROL-001`) through its public port for status, step and terminal-outcome updates, storing no independent event-log copy; a projection gap surfaces as typed `UNAVAILABLE`. | Proven by integration tests against a scripted AU WorkItem event fixture asserting projected events match the fixture and a missing/stale event yields `UNAVAILABLE`, never a backfilled value.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 37
    },
    {
      "id": "GRAPHOS-A2A-R011",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Transition history is read-through to epistemic-graph",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Transition history is read-through to epistemic-graph.** graph-os's `tasks/get` history path reads a task's full state-transition ledger through to epistemic-graph's durable kernel (`EG-DURABLE-KERNEL`) with no local reconstruction. | Proven by a contract test against a scripted EG durable-kernel fixture asserting the returned history exactly matches the fixture ledger.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 38
    },
    {
      "id": "GRAPHOS-A2A-R012",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Typed refusal when the durable history authority is absent",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Typed refusal when the durable history authority is absent.** When no `A2ATransitionHistoryAuthority` is wired or the wired authority is unreachable, graph-os returns a distinct JSON-RPC error `A2ATransitionHistoryUnavailable` with a privacy-safe message, never an empty or partially reconstructed history. | Proven by a negative test asserting the distinct error code and message shape, and that no history data is returned.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 39
    },
    {
      "id": "GRAPHOS-A2A-R012.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Landed: the protocol exists, the error does not",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "35257e780f7c"
      ],
      "verified_by": [
        "tests/a2a/test_models.py:97"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Landed: the protocol exists, the error does not.** `graph_os/a2a/models.py` defines the `A2ATransitionHistoryAuthority` runtime-checkable protocol (`GRAPHOS-A2A-R009.1`); no `A2ATransitionHistoryUnavailable` error type exists and `tasks/get` has no history-refusal wiring. | Proven today by `tests/a2a/test_models.py`; confirmed absent by `git grep -n A2ATransitionHistoryUnavailable graph_os/ tests/`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 40
    },
    {
      "id": "GRAPHOS-A2A-R012.2",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Add the `A2ATransitionHistoryUnavailable` error type",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "35257e780f7c"
      ],
      "verified_by": [
        "tests/a2a/test_authority.py:154"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Add the `A2ATransitionHistoryUnavailable` error type.** Add `A2ATransitionHistoryUnavailable(RuntimeError)` to `graph_os/a2a/authority.py`, mirroring the existing `A2AStreamingUnavailable` sibling-error docstring pattern (`-3201x` block). | A new test in `tests/a2a/` asserts the class exists, subclasses `RuntimeError`, and is exported from `graph_os/a2a/authority.py.__all__`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 41
    },
    {
      "id": "GRAPHOS-A2A-R012.3",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Blocked: wire `tasks/get`'s typed refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Blocked: wire `tasks/get`'s typed refusal.** Wire `tasks/get` to raise `A2ATransitionHistoryUnavailable` when no `A2ATransitionHistoryAuthority` is wired or the wired authority raises on call, per test-spec row `A2A-HT06`. Blocked on `GRAPHOS-A2A` landing (`GRAPHOS-A2A-R014`), since the real history read-through this wires against does not exist until then. | `A2A-HT06` in `test-spec.md` passes once unblocked. Tracked here as the explicit cross-dependency rather than left implicit.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 42
    },
    {
      "id": "GRAPHOS-A2A-R013",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Push notifications are best-effort over a durable outbox",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Push notifications are best-effort over a durable outbox.** graph-os retries push delivery from epistemic-graph's durable outbox (`EG-DURABLE-KERNEL-R001`), never an in-process queue; a repeatedly failing target is dead-lettered and reported. | Proven by a restart test asserting pending pushes survive process restart via the outbox, and a repeated-failure test asserting dead-letter reporting.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 43
    },
    {
      "id": "GRAPHOS-A2A-R014",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "No capability advertised before GRAPHOS-A2A lands",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**No capability advertised before GRAPHOS-A2A lands.** Until `GRAPHOS-A2A`'s context-budget subset is on the default branch, graph-os's composition layer refuses to wire a real streaming/push/history authority, keeping all three capability fields fixed false. | Proven by a composition-layer test asserting authority wiring is refused (or absent) while the `GRAPHOS-A2A` dependency flag is unset.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 44
    },
    {
      "id": "GRAPHOS-A2A-R014.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Card advertises no harness capability before it works",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Card advertises no harness capability before it works.** The Agent Card (`A2AAgentCapabilities`, `graph_os/a2a/models.py:167`) must not carry any harness-admission field or extension until `GRAPHOS-A2A-R017.6` passes on the default branch. | Proven by `tests/a2a/test_agent_card.py::test_card_has_no_harness_field_before_admission_e2e`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 45
    },
    {
      "id": "GRAPHOS-A2A-R015",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Caller-visible card matches served behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Caller-visible card matches served behavior.** A contract test asserts the Agent Card's advertised capability subset exactly matches which of streaming/push/history the integration fixture actually exercises at the tested revision. | Proven by a contract test comparing advertised capabilities against the fixture's exercised capability set at the exact tested revision.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 46
    },
    {
      "id": "GRAPHOS-A2A-R016",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Typed admission request/decision model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "35257e780f7c"
      ],
      "verified_by": [
        "tests/a2a/test_admission.py:15"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Typed admission request/decision model.** GraphOS defines a typed `ToolSubsetAdmissionRequest` (selected agent graph reference, caller context budget) and `ToolSubsetAdmissionDecision` (admitted flag, admitted tool subset, typed refusal reason, provenance) at the A2A admission door. Split into `GRAPHOS-A2A-R016.1` (the model plus a refusal test proving today's exact fail-closed result), with live EG/AU wiring remaining open under the parent. | Proven by a unit test constructing both models and exercising the admission function's current fail-closed return.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 47
    },
    {
      "id": "GRAPHOS-A2A-R016.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Fail-closed admission function proven against today's unavailable upstreams",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "35257e780f7c"
      ],
      "verified_by": [
        "tests/a2a/test_admission.py:16"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Fail-closed admission function proven against today's unavailable upstreams.** GraphOS's `admit_tool_subset` function accepts a typed `ToolSubsetAdmissionRequest` and returns a typed `ToolSubsetAdmissionDecision` refusing every request with `admitted=False`, no admitted tools, reason `EG_ASSEMBLE_UNAVAILABLE`, and a provenance reference naming the unavailable EG operation \u2014 never silently succeeding, never an unrecognized/untyped error. | Proven by a test asserting the exact refusal fields for a representative request while EG `AgentAssemble` and AU's envelope field remain unavailable.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 48
    },
    {
      "id": "GRAPHOS-A2A-R016.2",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Admission request carries model profile and task class",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Admission request carries model profile and task class.** `ToolSubsetAdmissionRequest` in `graph_os/a2a/admission.py` gains `model_profile_ref` and `task_class`, both non-empty strings. GraphOS takes both from the routed capability, never from the caller. | Proven by `tests/a2a/test_admission.py::test_request_requires_model_profile_and_task_class`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 49
    },
    {
      "id": "GRAPHOS-A2A-R016.3",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Admission decision carries the committed harness answer",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Admission decision carries the committed harness answer.** `ToolSubsetAdmissionDecision` gains `harness_config`, a typed mirror of the engine `HarnessConfigAnswer`, and `context_budget_tokens`. An admitted decision must carry both. A refused decision must carry neither. | Proven by `tests/a2a/test_admission.py::test_admitted_decision_carries_harness_config_and_budget`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 50
    },
    {
      "id": "GRAPHOS-A2A-R016.4",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Refusal enum gains the harness reasons",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Refusal enum gains the harness reasons.** `ToolSubsetAdmissionRefusalReason` gains `HARNESS_CONFIG_UNAVAILABLE`, `HARNESS_CONFIG_ABSTAINED`, `ENVELOPE_LACKS_HARNESS_CONFIG`, and `CONTEXT_BUDGET_MISSING`. GraphOS holds no policy table and no default threshold. | Proven by `tests/a2a/test_admission.py::test_refusal_reasons_are_closed_set`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 51
    },
    {
      "id": "GRAPHOS-A2A-R016.5",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Routing decision carries model profile and task class",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Routing decision carries model profile and task class.** `A2ARouteDecision` in `graph_os/a2a/routing.py` gains `model_profile_ref` and `task_class`, read from the `resolve_capability` result at `graph_os/a2a/routing.py:61`. A result lacking either field must raise `A2AAssemblyUnavailable`. | Proven by `tests/a2a/test_routing.py::test_route_decision_carries_model_profile_and_task_class`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 52
    },
    {
      "id": "GRAPHOS-A2A-R017",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Context-budget-bound subset sourced from EG assembly",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Context-budget-bound subset sourced from EG assembly.** The admission door derives an admitted tool subset only from a committed epistemic-graph `AgentAssemble` answer (`EG-DECISION-ENGINE-R036`) covering the selected agent graph within the caller's context budget; while that operation returns unavailable, admission refuses closed with reason `EG_ASSEMBLE_UNAVAILABLE`. | Proven by integration tests against a scripted EG assembly client covering an available committed answer and an unavailable/abstained answer.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 53
    },
    {
      "id": "GRAPHOS-A2A-R017.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Engine decision port for HarnessConfig",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Engine decision port for HarnessConfig.** `graph_os/a2a/admission.py` defines the `HarnessConfigDecider` protocol with one async method. The method takes tenant, model profile reference, task class, budget tokens, and priority. It returns the engine `HarnessConfigAnswer` (EG-DECISION-ENGINE row for the `HarnessConfig` question). | Proven by `tests/a2a/test_admission.py::test_decider_port_returns_typed_answer`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 54
    },
    {
      "id": "GRAPHOS-A2A-R017.2",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Admission is async and calls the decider once",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Admission is async and calls the decider once.** `admit_tool_subset` becomes `async` and takes the decider as an argument. It makes exactly one engine round trip and reads the allowed tool subset from the answer's `action_space`. It makes no separate `AgentAssemble` call. | Proven by `tests/a2a/test_admission.py::test_admission_makes_one_engine_call`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 55
    },
    {
      "id": "GRAPHOS-A2A-R017.3",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Priority comes from the principal class",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Priority comes from the principal class.** The admission request carries `priority`, set from the authenticated principal class through the engine contract's priority enum. The caller must not supply it. | Proven by `tests/a2a/test_admission.py::test_priority_is_set_from_principal_class`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 56
    },
    {
      "id": "GRAPHOS-A2A-R017.4",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Missing budget refuses",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Missing budget refuses.** When `context_budget_tokens` is null or below 1, admission refuses with `CONTEXT_BUDGET_MISSING` before it calls the engine. | Proven by `tests/a2a/test_admission.py::test_missing_budget_refuses_before_engine_call`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 57
    },
    {
      "id": "GRAPHOS-A2A-R017.5",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Wire admission into the send path",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Wire admission into the send path.** `A2AService.send_message` (`graph_os/a2a/service.py:40`) calls `admit_tool_subset` after `router.route`. The call replaces the inline raises at `graph_os/a2a/routing.py:74`, `graph_os/a2a/authority.py:268`, and `graph_os/a2a/authority.py:299`. | Proven by `tests/a2a/test_service_admission.py::test_send_message_refuses_without_admission`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 58
    },
    {
      "id": "GRAPHOS-A2A-R017.6",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "End-to-end admitted task",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**End-to-end admitted task.** A scripted decider and a signing envelope fake drive `POST /a2a` `message/send` (`graph_os/a2a/application.py:166`). The test asserts one enqueued envelope whose `harness_config` equals the scripted answer. | Proven by `tests/a2a/test_admission_e2e.py::test_message_send_enqueues_envelope_with_harness_config`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 59
    },
    {
      "id": "GRAPHOS-A2A-R018",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Cryptographic enforcement via the signed AU envelope",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Cryptographic enforcement via the signed AU envelope.** An admitted tool subset is carried only inside the signed AU `AgentTurnEnvelope`'s allowed-tool-subset field (`AU-CONTROL-R035`); while that field does not exist in the signed envelope, admission refuses closed with reason `ENVELOPE_LACKS_ALLOWED_TOOL_SUBSET` even given an EG assembly answer. | Proven by a test asserting a request refuses with this reason when the EG answer exists but the envelope carries no allowed-tool-subset field, and admits only once the signed field is present and its signature verified.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 60
    },
    {
      "id": "GRAPHOS-A2A-R018.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Envelope carries harness_config",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Envelope carries harness_config.** `WorkItemA2AAuthority._enqueue` (`graph_os/a2a/authority.py:256`) passes the admitted `harness_config` into `AgentTurnEnvelope` next to the allowed tool subset. It depends on the AU-CONTROL row for the envelope `harness_config` field. | Proven by `tests/a2a/test_authority_envelope.py::test_enqueue_passes_harness_config`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 61
    },
    {
      "id": "GRAPHOS-A2A-R018.2",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Envelope without the field refuses",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Envelope without the field refuses.** When `AgentTurnEnvelope.model_fields` lacks `harness_config`, admission refuses with `ENVELOPE_LACKS_HARNESS_CONFIG`, even given a committed engine answer. | Proven by `tests/a2a/test_admission.py::test_envelope_lacking_harness_config_refuses`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 62
    },
    {
      "id": "GRAPHOS-A2A-R019",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Typed refusal reason and provenance on every decision",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "35257e780f7c"
      ],
      "verified_by": [
        "tests/a2a/test_admission.py:34"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Typed refusal reason and provenance on every decision.** Every `ToolSubsetAdmissionDecision`, admitted or refused, carries a stable machine-readable field sufficient to audit exactly which upstream answer authorized or blocked it. | Proven by a schema test asserting every decision instance has a non-empty `provenance` and, when refused, a `refusal_reason` drawn from the typed enumeration.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 63
    },
    {
      "id": "GRAPHOS-A2A-R019.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Provenance names the harness decision",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Provenance names the harness decision.** An admitted decision's `provenance` names the engine decision record identifier of the `HarnessConfig` answer. A refused decision names the refusing operation. | Proven by `tests/a2a/test_admission.py::test_provenance_names_harness_decision_record`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 64
    },
    {
      "id": "GRAPHOS-A2A-R020",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "No advisory, cached, or partial substitute",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "35257e780f7c"
      ],
      "verified_by": [
        "tests/a2a/test_admission.py:53"
      ],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**No advisory, cached, or partial substitute.** The admission door never returns a tool subset that is advisory-only, drawn from a prior request's cached answer, or a partial/best-effort coverage of the selected agent graph; an incomplete upstream answer is a refusal, not a smaller admission. | Proven by negative tests asserting a partial or stale upstream answer produces a refusal, never a trimmed admission.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 65
    },
    {
      "id": "GRAPHOS-A2A-R020.1",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Abstention refuses and records the named default",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Abstention refuses and records the named default.** When the engine answer is a typed abstention, admission refuses with `HARNESS_CONFIG_ABSTAINED`. The decision records the abstention's named default in `provenance`. It must not apply that default. | Proven by `tests/a2a/test_admission.py::test_abstention_refuses_and_does_not_apply_default`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 66
    },
    {
      "id": "GRAPHOS-A2A-R020.2",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Unavailable, stale, or partial answers refuse",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Unavailable, stale, or partial answers refuse.** An unreachable engine, an expired decision record, or an answer missing a threshold under a summarizing policy refuses with `HARNESS_CONFIG_UNAVAILABLE`. | Proven by `tests/a2a/test_admission.py::test_unavailable_stale_or_partial_harness_answer_refuses`.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 67
    },
    {
      "id": "GRAPHOS-A2A-R021",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Fresh checkout",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Fresh checkout.** Contract and unit tests for the admission model and its refusal behavior run with published packages and no private network, sibling checkout, or live production identity provider. | Proven by running the admission test suite from a clean public clone with no additional configuration.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 68
    },
    {
      "id": "GRAPHOS-A2A-R022",
      "kind": "requirement",
      "parent": "GRAPHOS-A2A",
      "source": "specs/a2a/status.json",
      "title": "Critique-gated output release",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-A2A \u2014 A2A projection, streaming, history and tool-subset admission",
      "definition": "**Critique-gated output release.** Require the owning AU runtime's typed checklist and questions. Bind the EG critique verdict to the exact generated output. Before release, apply the held-item contract in `GRAPHOS-A2A-R006.3` through `GRAPHOS-A2A-R006.8`. Preserve the verified-caller prerequisite in `GRAPHOS-A2A-R006.2.1` and signed-authority prerequisites in `GRAPHOS-A2A-R006.5`. Gate output at `graph_os/a2a/application.py:_send_message`. Keep this separate from `graph_os/a2a/routing.py:OrchestratorA2ARouter.route`; routing selects an agent and cannot satisfy critique acceptance. Keep release unavailable until the AU and EG producer contracts are published. Add no second approval authority. | Future acceptance: `tests/a2a/test_application.py::test_send_message_holds_output_until_bound_critique_passes` and `tests/a2a/test_application.py::test_send_message_rejects_untyped_preflight_and_failed_critique`. Exercise a verified caller through held-item admission. Bind the verdict to the exact output. Missing, mismatched, rejected, or abstained evidence leaves the item held and sends no output. Prove routing alone cannot satisfy critique acceptance. These tests are proposed; no execution is claimed.",
      "definition_source": "specs/a2a/requirements.md",
      "definition_line": 69
    },
    {
      "id": "GRAPHOS-ACCEPTANCE",
      "kind": "spec",
      "parent": null,
      "source": "specs/acceptance-evidence-freeze/status.json",
      "title": "GRAPHOS-ACCEPTANCE \u2014 evidence acceptance freeze",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/acceptance-evidence-freeze/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/acceptance-evidence-freeze/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/check_acceptance_evidence.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/scripts/check_acceptance_evidence.py"
        },
        {
          "declared_in": "specs/acceptance-evidence-freeze/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/test_check_acceptance_evidence.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/tests/test_check_acceptance_evidence.py"
        },
        {
          "declared_in": "specs/acceptance-evidence-freeze/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/acceptance-evidence-freeze/requirements.md"
        },
        {
          "declared_in": "specs/acceptance-evidence-freeze/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/check_public_specs.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/scripts/check_public_specs.py"
        },
        {
          "declared_in": "specs/acceptance-evidence-freeze/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "status.json",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/acceptance-evidence-freeze/status.json"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-ACCEPTANCE-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-ACCEPTANCE",
      "source": "specs/acceptance-evidence-freeze/status.json",
      "title": "Typed acceptance-evidence model and freeze-gap checker",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "a5951682d6da",
        "f62a4e2e39ed"
      ],
      "verified_by": [
        "tests/test_check_acceptance_evidence.py:137",
        "tests/test_check_acceptance_evidence.py:83"
      ],
      "parent_title": "GRAPHOS-ACCEPTANCE \u2014 evidence acceptance freeze",
      "definition": "**Typed acceptance-evidence model and freeze-gap checker.** GraphOS ships a typed model of the three evidence kinds a requirement needs for `ACCEPTED` (`merged_head`, `test`, and operational `consumer`/`release`, all at the same commit) and a checker that, given a spec's `status.json`, lists every `LANDED`/`CLOSED` requirement missing one or more of those kinds at its `merged_head` commit. | A unit test against a fixture `status.json` asserts the checker reports exactly the gapped requirement IDs with their missing evidence kind names, and a refusal test asserts a malformed or missing `status.json` raises rather than reporting a false pass.",
      "definition_source": "specs/acceptance-evidence-freeze/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-ACCEPTANCE-R001.1",
      "kind": "requirement",
      "parent": "GRAPHOS-ACCEPTANCE",
      "source": "specs/acceptance-evidence-freeze/status.json",
      "title": "implement the typed EvidenceRecord/RequirementGap model and gaps_for_status/load_status functions plus the standalone CLI entry point in scripts/check_acceptanc",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "57cb99978975"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-ACCEPTANCE \u2014 evidence acceptance freeze",
      "definition": "**implement the typed EvidenceRecord/RequirementGap model and gaps_for_status/load_status functions plus the standalone CLI entry point in scripts/check_acceptanc.** Child slice of `GRAPHOS-ACCEPTANCE-R001` (see tasks.md). | A unit test against a fixture status.json asserts the checker reports exactly the gapped requirement IDs with their missing evidence kind names, and a refusal test asserts a malformed or missing status.json raises rather than reporting a false pass",
      "definition_source": "specs/acceptance-evidence-freeze/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-ACCEPTANCE-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-ACCEPTANCE",
      "source": "specs/acceptance-evidence-freeze/status.json",
      "title": "Auditor distinct from delivery lane",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a5951682d6da",
        "f62a4e2e39ed"
      ],
      "verified_by": [
        "tests/test_check_acceptance_evidence.py:179",
        "tests/test_check_acceptance_evidence.py:192",
        "tests/test_check_acceptance_evidence.py:205"
      ],
      "parent_title": "GRAPHOS-ACCEPTANCE \u2014 evidence acceptance freeze",
      "definition": "**Auditor distinct from delivery lane.** A requirement's `acceptance_state` moves from `NOT_AUDITED` to `ACCEPTED` only in a change where the reviewing identity differs from the author of the `merged_head` commit it cites, and only after `GRAPHOS-ACCEPTANCE-R001`'s checker reports no gap for that requirement. | A review-trail test over a sample `status.json` edit asserts the recorded auditor identity differs from the cited commit's author, and that the checker was run (or its report attached) before the state flip.",
      "definition_source": "specs/acceptance-evidence-freeze/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-ACCEPTANCE-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-ACCEPTANCE",
      "source": "specs/acceptance-evidence-freeze/status.json",
      "title": "Evidence is append-only",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a5951682d6da",
        "f62a4e2e39ed"
      ],
      "verified_by": [
        "tests/test_check_acceptance_evidence.py:216",
        "tests/test_check_acceptance_evidence.py:224"
      ],
      "parent_title": "GRAPHOS-ACCEPTANCE \u2014 evidence acceptance freeze",
      "definition": "**Evidence is append-only.** Once an evidence entry is recorded for a requirement, its `kind`, `commit`, `result`, and `url` fields are never rewritten in place; a correction is a new appended entry, and the checker only honors entries matching the requirement's current `merged_head` commit. | A regression test diffs two revisions of the same `status.json` and fails if any existing evidence entry's fields changed rather than a new entry being appended.",
      "definition_source": "specs/acceptance-evidence-freeze/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-ACCEPTANCE-R004",
      "kind": "requirement",
      "parent": "GRAPHOS-ACCEPTANCE",
      "source": "specs/acceptance-evidence-freeze/status.json",
      "title": "Operational evidence tracks the current commit, not a stale one",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a5951682d6da",
        "f62a4e2e39ed"
      ],
      "verified_by": [
        "tests/test_check_acceptance_evidence.py:99"
      ],
      "parent_title": "GRAPHOS-ACCEPTANCE \u2014 evidence acceptance freeze",
      "definition": "**Operational evidence tracks the current commit, not a stale one.** A `consumer` or `release` receipt satisfies the `ACCEPTED` gate only when recorded against the requirement's current `merged_head` commit; a receipt recorded against a superseded commit is treated as missing. | A fixture test moves a requirement's `merged_head` forward without a fresh operational receipt and asserts the checker reports the operational-evidence kind as missing again.",
      "definition_source": "specs/acceptance-evidence-freeze/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-ACCEPTANCE-R005",
      "kind": "requirement",
      "parent": "GRAPHOS-ACCEPTANCE",
      "source": "specs/acceptance-evidence-freeze/status.json",
      "title": "Checker is the only path to an `ACCEPTED` report",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a5951682d6da",
        "f62a4e2e39ed"
      ],
      "verified_by": [
        "tests/test_check_acceptance_evidence.py:232"
      ],
      "parent_title": "GRAPHOS-ACCEPTANCE \u2014 evidence acceptance freeze",
      "definition": "**Checker is the only path to an `ACCEPTED` report.** The acceptance-evidence checker is runnable standalone (as a script or an importable module) against any spec directory under `specs/`, producing a deterministic, machine-parseable gap report with no network or live-cluster dependency. | A CLI invocation test runs the checker against each tracked spec's `status.json` offline and asserts exit code and report shape are deterministic across two consecutive runs.",
      "definition_source": "specs/acceptance-evidence-freeze/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-CAPACITY",
      "kind": "spec",
      "parent": null,
      "source": "specs/adaptive-capacity/status.json",
      "title": "GRAPHOS-CAPACITY \u2014 Adaptive capacity control",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/adaptive-capacity/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/adaptive-capacity/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/adaptive-capacity/requirements.md"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/adaptive-capacity/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "hosted operations",
          "repository": "Knuckles-Team/graph-os",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/hosted-api-operations/spec.md"
        }
      ],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-CAPACITY-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-CAPACITY",
      "source": "specs/adaptive-capacity/status.json",
      "title": "AIMD error-budget throttling that only narrows automatically (rollup)",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d2f29725918d"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-CAPACITY \u2014 Adaptive capacity control",
      "definition": "**AIMD error-budget throttling that only narrows automatically (rollup).** graph-os observes a bounded error budget per tenant, child, and operation class and applies additive-increase/multiplicative-decrease throttling against the graph engine's declared capacity cell limit. An automatic control action may only narrow the allowed concurrency, never raise it above that ceiling, and every decision is recorded with its input window, old and new limits, and reason. Delivered through its child requirements, producer first. | Proven by a deterministic fixture test demonstrating decrease on budget breach, bounded recovery, and an idempotent decision receipt for a replayed window.",
      "definition_source": "specs/adaptive-capacity/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-CAPACITY-R001.1",
      "kind": "requirement",
      "parent": "GRAPHOS-CAPACITY",
      "source": "specs/adaptive-capacity/status.json",
      "title": "Pure partitioned AIMD decision rule",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "69d6f6eef5ea",
        "c46a1ded6a8f",
        "d2f29725918d"
      ],
      "verified_by": [
        "tests/fleet/test_error_budget.py:28"
      ],
      "parent_title": "GRAPHOS-CAPACITY \u2014 Adaptive capacity control",
      "definition": "**Pure partitioned AIMD decision rule.** `graph_os/fleet/error_budget.py` defines typed `Partition`, `OutcomeSample`, `BudgetWindow`, `AimdConfig`, `ThrottleMode` and `ThrottleDecision`, and a pure `decide()` function that computes the next concurrency limit from a closed window and the controller's prior state: eligible service failures (not caller errors or policy denials) drive the error fraction, breach multiplicatively decreases bounded by a floor, a healthy window additively increases bounded by the engine/policy ceiling, and replaying the same window is idempotent. No clock, I/O or fleet dispatch wiring. | `tests/fleet/test_error_budget.py` covers bounded recovery, multiplicative decrease, the floor and engine-headroom ceiling, caller-error/policy-denial neutrality, insufficient-sample handling, idempotent replay, and tenant/child partition isolation.",
      "definition_source": "specs/adaptive-capacity/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-CAPACITY-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-CAPACITY",
      "source": "specs/adaptive-capacity/status.json",
      "title": "Capacity status and mode operations",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "69d6f6eef5ea",
        "c46a1ded6a8f"
      ],
      "verified_by": [
        "tests/api/test_capacity_ops.py:26"
      ],
      "parent_title": "GRAPHOS-CAPACITY \u2014 Adaptive capacity control",
      "definition": "**Capacity status and mode operations.** graph-os exposes capacity operations in graph_os/api/ops/capacity.py and a read/config facade in graph_os/fleet/throttle_service.py that report controller status, update cell limits, report throttle state, and select observe or enforce mode per child, using the same hosted-operation registry, identity, and error handling as other operations. | Proven by contract tests asserting a mode change requires verified administrator authorization while capacity:read permits status only.",
      "definition_source": "specs/adaptive-capacity/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-ACP",
      "kind": "spec",
      "parent": null,
      "source": "specs/conversational-acp-gateway/status.json",
      "title": "GRAPHOS-ACP \u2014 Conversational ACP gateway session projection and policy",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/conversational-acp-gateway/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/conversational-acp-gateway/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Adapter refusal",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/conversational-acp-gateway/plan.md#adapter-unavailable-refusal"
        },
        {
          "declared_in": "specs/conversational-acp-gateway/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Admission",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/conversational-acp-gateway/plan.md#admission-and-binding"
        },
        {
          "declared_in": "specs/conversational-acp-gateway/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Observability",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/conversational-acp-gateway/plan.md#observability"
        },
        {
          "declared_in": "specs/conversational-acp-gateway/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Policy limits",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/conversational-acp-gateway/plan.md#idle-and-expiry-policy"
        },
        {
          "declared_in": "specs/conversational-acp-gateway/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "docs/architecture.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/docs/architecture.md"
        },
        {
          "declared_in": "specs/conversational-acp-gateway/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/conversational-acp-gateway/requirements.md"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/conversational-acp-gateway/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "Access control",
          "repository": "Knuckles-Team/graph-os",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/identity-access/spec.md"
        },
        {
          "declared_in": "specs/conversational-acp-gateway/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "GRAPHOS-IDENTITY-001",
          "repository": "Knuckles-Team/graph-os",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/identity-access/spec.md"
        },
        {
          "declared_in": "specs/conversational-acp-gateway/spec.md",
          "evidence": "unresolved",
          "kind": "references",
          "label": "AU-CONTROL-001",
          "repository": "Unresolved",
          "url": ""
        }
      ],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-ACP-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-ACP",
      "source": "specs/conversational-acp-gateway/status.json",
      "title": "Conversational ACP gateway session admission and policy",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "9a79acee8b6c",
        "c2a6ab839fd3"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-ACP \u2014 Conversational ACP gateway session projection and policy",
      "definition": "**Conversational ACP gateway session admission and policy.** GraphOS admits an ACP session only for a verified principal from the existing identity path, binds the session immutably to that principal/tenant/scope snapshot, enforces configured idle and absolute expiry limits, and returns one typed `chat_adapter_unavailable` refusal for admission and messages whenever the agent-utilities chat adapter is absent or unreachable, without a local reply or REST fallback. Split into `GRAPHOS-ACP-R001.1` (the graph-os-owned typed session-policy model and admission/refusal check) with the transport wiring to the real ACP endpoint and the identical REST-path projection check remaining open under the parent until `GRAPHOS-ACP-R001.2`'s dependency is satisfied. | Unit and integration tests cover admission refusal for missing/invalid credentials, immutable binding, idle-expired refusal, absolute-expired refusal, the typed adapter-unavailable refusal on both admission and message, identical principal/tenant/scope projection against the REST path, and a status/doctor read that reports adapter and limit state without secrets.",
      "definition_source": "specs/conversational-acp-gateway/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-ACP-R001.1",
      "kind": "requirement",
      "parent": "GRAPHOS-ACP",
      "source": "specs/conversational-acp-gateway/status.json",
      "title": "Typed ACP session-policy model and fail-closed admission check",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "9a79acee8b6c",
        "c2a6ab839fd3"
      ],
      "verified_by": [
        "tests/acp/test_session_policy.py:31",
        "tests/acp/test_session_policy.py:71"
      ],
      "parent_title": "GRAPHOS-ACP \u2014 Conversational ACP gateway session projection and policy",
      "definition": "**Typed ACP session-policy model and fail-closed admission check.** graph-os defines the typed `PrincipalContext`/`AcpSessionPolicy`/`AcpSessionSnapshot` model and an `AcpSessionAdmission` that admits only a verified principal, binds the session immutably, enforces idle/absolute expiry, and refuses with a distinct `chat_adapter_unavailable` reason \u2014 on both admission and message \u2014 whenever the caller-supplied chat-adapter probe reports unavailable, with no transport wired yet. | Proven by unit tests asserting unauthenticated refusal, immutable principal binding, idle- and absolute-expiry refusal, and the dedicated `chat_adapter_unavailable` refusal on both admission and message.",
      "definition_source": "specs/conversational-acp-gateway/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-DATA-MARKET",
      "kind": "spec",
      "parent": null,
      "source": "specs/data-and-market-projections/status.json",
      "title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/data-and-market-projections/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/data-and-market-projections/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/http/routes.py:72",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/http/routes.py#L72"
        },
        {
          "declared_in": "specs/data-and-market-projections/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/invoke/plan.py:24",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/invoke/plan.py#L24"
        },
        {
          "declared_in": "specs/data-and-market-projections/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/mcp/verbs.py:26",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/mcp/verbs.py#L26"
        },
        {
          "declared_in": "specs/data-and-market-projections/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/finance/markets.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/finance/markets.py"
        },
        {
          "declared_in": "specs/data-and-market-projections/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/mcp_server/server.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/mcp_server/server.py"
        },
        {
          "declared_in": "specs/data-and-market-projections/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/data-and-market-projections/requirements.md"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Durable, deduplicated flip alert delivery",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "e61c0e3df8b7"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Durable, deduplicated flip alert delivery.** graph-os subscribes durably to the finance flip event topic and delivers alerts to configured notification channels, deduplicating by tenant, event ID, and subscriber so a restart cannot cause a duplicate user-visible alert. An alert never authorizes an order or changes a portfolio. | Proven by a restart/redelivery test confirming at-least-once transport with idempotent, deduplicated delivery.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Scheduled finance backfill, scan, and explanation jobs",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "57391db3828f"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Scheduled finance backfill, scan, and explanation jobs.** graph-os schedules finance backfill, scan, and flip-explanation jobs through its existing scheduler, recording each schedule's tenant, owner, authorized action, timezone, trigger, idempotency key, and last run, so a daylight-saving transition or replay cannot duplicate an effect. The explanation itself is produced by the agent workflow and must cite its exact calculation inputs. | Proven by a scheduler test crossing a daylight-saving transition and a replay test confirming no duplicate job execution.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Server-side finance and markets reads and paper order submission",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "57391db3828f",
        "b1ee0584dbba"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Server-side finance and markets reads and paper order submission.** graph-os serves tenant-scoped market and finance reads, and paper order submission, through graph_os/api/ops/finance.py and markets.py, with the market read logic ported server-side into graph_os/finance/markets.py. Each read requires the finance:read grant. If tenant or account binding is unverified, return a typed unavailable result before any provider call. Paper order submission requires a tenant-bound account and the finance:paper-trade grant. | Acceptance: two-tenant tests must confirm zero cross-tenant reads. A negative test must confirm unverified account binding returns unavailable before any provider call.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R004",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "One-at-a-time application admission with rollback",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "33622be01de7",
        "fd761d59a171"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**One-at-a-time application admission with rollback.** graph-os admits one named application and its data source into the shared data plane at a time, using a dry-run plan, an idempotency key, explicit approval, health and parity probes, and a rollback fence. An application's existing ingest connector is retired only after the admitted source is healthy, parity checks pass, and the retirement is approved. | Proven by a restart/fault test demonstrating a failed admission rolls back without retiring the prior connector.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R005",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "schema_context query surface for tables and ontology mappings",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "0a1beb2aae13",
        "44ba09589820",
        "8a7010bd6592"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**schema_context query surface for tables and ontology mappings.** graph-os serves authenticated `schema_context` over REST and MCP. Callers can request definitions, joins, ontology class mapping, owning application, or change impact. The response labels unverified and inferred relationships as proposals, not approved facts. When the engine lacks `schema_context` or an approved source catalog snapshot, GraphOS returns typed unavailable. It does not fabricate an answer. | Proven by contract tests covering each intent (definition, joins, ontology, owner, impact) and a negative test for an unsupported source returning a typed unavailable result.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R006",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Recurring DCA plans with deterministic, non-duplicating proposals",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "35385208a619",
        "e61c0e3df8b7"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Recurring DCA plans with deterministic, non-duplicating proposals.** graph-os stores a recurring dollar-cost-averaging plan's owner, tenant, symbol, account binding, decimal amount and currency, timezone, recurrence rule, bounds, pause state, and paper or live mode, and produces one durable proposal per due occurrence with a key derived from the plan revision so replay or clock drift cannot create a duplicate. Paper mode executes only under the paper grant and lease; live mode stays proposal-only until a human approves the exact preview and a connector consumes a write-back lease through the governed path in AU-CONTEXT-R006. A missed or failed contribution is reported, never silently skipped or doubled. | Proven by a replay and clock-drift test asserting exactly one proposal per occurrence, and a fault test confirming a missed contribution is reported rather than silently dropped.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R007",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Confirmed order and position changes",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Confirmed order and position changes.** Require explicit confirmation before an order or position effect. Consume the SDK-GOVERNED-WRITEBACK-R001.1 through R001.6 signature-verification contract for wallet operations. EG owns authorization; GraphOS serves authenticated confirmation and preserves its decision. Keep wallet operations unavailable until the producer and all durable bindings are implemented. GRAPHOS-DATA-MARKET-R003 owns paper submission; GRAPHOS-OPS-R017.2 owns subject ownership. | Served acceptance in tests/integration/test_order_confirmation.py; runtime proof remains required.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 11
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R007.1",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Model.** OrderChange and PositionChange bind exact intent. WalletOperation imports SDK WalletBusinessIntent and WalletExecutionEnvelope. Proof and confirmation metadata remain outside business parameters. The plan defines the exact immutable projection; never embed WalletProofRequest inside hashed intent. Bind authenticated caller tenant and actor, account, network, wallet, operation and exact change-set identity. Read-only models at graph_os/finance/markets.py:34 do not implement this contract. | Served acceptance in tests/integration/test_order_confirmation.py; runtime proof remains required.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 12
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R007.2",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Behavior.** Prepare immutable intent and require explicit confirmation under `confirm_before_commit`. `plan_digest` means `params_digest({\"intent\": WalletBusinessIntent})`. Sign after confirmation; adding proof cannot change that digest. Consume the authenticated SDK proof result unchanged and match every binding before dispatch. A valid signature is insufficient without EG authorization, account entitlement and durable effect reservation. Use the existing effect key for retries; never create another nonce or approval store. | Served acceptance in tests/integration/test_order_confirmation.py; runtime proof remains required.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 13
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R007.3",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Wiring.** Register the new operations through graph_os/api/ops/registry_factory.py with Confirm.PLAN. Reuse `_effect` at graph_os/api/invoke/pipeline.py:218 and `bind_plan` at line 230. The operation handler must invoke the admitted connector SDK proof and governed apply composition before any provider effect. The shared WalletExecutionEnvelope extension must separate proof before plan hashing, validation, audit and reservation. HTTP and MCP lack this extension. No order or wallet operation is reachable today. | Served acceptance in tests/integration/test_order_confirmation.py; runtime proof remains required.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 14
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R007.4",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Refusal.** Return CONFIRMATION_REQUIRED for absent confirmation and PLAN_MISMATCH for intent tampering. Return POLICY_DENIED for invalid proof and UNAVAILABLE for absent verifier, envelope, trust or durable binding authority. Preserve the SDK typed reason in redacted error details. No refused request reaches provider mutation; an uncertain prior effect enters reconciliation instead of blind retry. | Served acceptance in tests/integration/test_order_confirmation.py; runtime proof remains required.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 15
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R007.5",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Evidence.** Record request, tenant, actor, plan and confirmation in the existing audit record. Join EG authorization, proof digest, signer, trust revision and effect receipt. Preserve the SDK verification outcome unchanged. Never log raw signatures, private keys or reusable proof bodies. | Served acceptance in tests/integration/test_order_confirmation.py; runtime proof remains required.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 16
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R007.6",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Hot-path proof.** `tests/integration/test_order_confirmation.py::test_wallet_proof_confirmation_and_replay` enters the served operation at POST /api/v1/ops/{op_id} and its MCP twin. Use the real SDK verifier, synthetic keys, durable graph authority and a controlled provider. Serve prepare, confirm, sign and execute; proof insertion preserves the intent digest and yields one effect. Missing confirmation, altered account/network/payload, revoked key, expiry and unavailable producer yield none. Concurrent retries and restart read the same effect receipt without another mutation. | Served acceptance in tests/integration/test_order_confirmation.py; runtime proof remains required.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 17
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R003.1",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Market list/search/get",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Market list/search/get.** Define read-only `markets.list`, `markets.search`, and `markets.get` on `finance:read`. List/search accept `limit` (default 50, 1\u2013100), optional opaque cursor, and only `event_id`, `status`, `starts_at_from`, `starts_at_to`, `ends_at_from`, and `ends_at_to`; search also requires the bounded `query` defined in plan.md. Get accepts only `market_id`. Search matches case-sensitive NFC substrings in `question` or outcome `name`. Sort by `starts_at` ascending with nulls last, then `market_id` ascending. | Served tests cover exact filters, query bounds, stable ordering, get-by-ID, and zero effect calls.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 20
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R003.2",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Event list/search/get",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Event list/search/get.** Define read-only `events.list`, `events.search`, and `events.get` on `finance:read`. List/search accept `limit` (default 50, 1\u2013100), optional opaque cursor, and only `status`, `starts_at_from`, `starts_at_to`, `ends_at_from`, and `ends_at_to`; search also requires the bounded `query` defined in plan.md. Get accepts only `event_id`. Search matches case-sensitive NFC substrings in `title` or `description`. Sort by `starts_at` ascending with nulls last, then `event_id` ascending. | Served tests cover exact filters, query bounds, stable ordering, get-by-ID, and zero effect calls.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 21
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R003.3",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Order list/search/get",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Order list/search/get.** Define read-only `orders.list`, `orders.search`, and `orders.get` on `finance:read`, bound to the caller's resolved tenant/account. List/search accept `limit` (default 50, 1\u2013100), optional opaque cursor, and only `market_id`, `status`, `side` (`buy` or `sell`), `created_at_from`, and `created_at_to`; search also requires the bounded `query` defined in plan.md. Get accepts only `order_id`. Search matches case-sensitive NFC substrings in `order_id`, `market_id`, or `outcome`. Sort by `created_at` descending with nulls last, then `order_id` ascending. | Served tests cover all three bindings, account scoping, deterministic ordering, and zero mutation calls.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 22
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R003.4",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Stable JSON projections",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Stable JSON projections.** Define closed version-1 `MarketPageV1`/`MarketGetV1`, `EventPageV1`/`EventGetV1`, and `OrderPageV1`/`OrderGetV1` envelopes with typed `MarketItemV1`, `EventItemV1`, and `OrderItemV1` records. `plan.md` defines exact keys, nullability, metadata, decimal, identifier, and cursor rules. Preserve provider `source`, `as_of`, `session`, currency/unit, freshness, and provenance; never calculate or fabricate missing source metadata. Decimal values are strings. Serialize nullable fields as explicit null. Use deterministic keys. Bind cursors to tenant, account, filters, sort, and snapshot. Omit provider-only extras. | Contract tests pin exact keys/types, nullable fields, metadata, decimal/time encodings, filters, pagination, and normalized REST/MCP JSON.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 23
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R003.5",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Authority before provider calls",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Authority before provider calls.** All nine bindings require `finance:read`. Handlers resolve authenticated tenant membership and proof of the account binding before constructing provider requests. They derive tenant and account from authority and reject caller-selected identity. If binding is missing or mismatched, GraphOS returns typed unavailable before dispatch. R010 maps scope denials; inaccessible IDs are nonrevealing. Preserve parent R003 and GRAPHOS-OPS-R017.1. EG must add `finance:read` to its scope catalog before GraphOS registers these operations. | Served two-tenant cases prove denials and malformed authority make zero provider calls and reveal no cross-tenant record.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 24
    },
    {
      "id": "GRAPHOS-DATA-MARKET-R003.6",
      "kind": "requirement",
      "parent": "GRAPHOS-DATA-MARKET",
      "source": "specs/data-and-market-projections/status.json",
      "title": "Producer port, registration, and read/effect separation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DATA-MARKET \u2014 Schema context, source admission, and finance projection",
      "definition": "**Producer port, registration, and read/effect separation.** Define `FinanceReadPortV1` in `graph_os/finance/markets.py` with typed `list_markets`, `search_markets`, `get_market`, `list_events`, `search_events`, `get_event`, `list_orders`, `search_orders`, and `get_order` methods. Existing `MarketProvider.market_read` is only a single-symbol read and does not implement this port. Bind it as `finance_read_port`; register handlers from `graph_os/api/ops/finance.py::operations` through `graph_os/api/ops/registry_factory.py::get_registry`. REST uses `NativeGatewayApplication.mount_rest_routes` \u2192 `create_api_application` \u2192 `POST /api/v1/ops/{op_id}` after contract admission. MCP uses `register_intent_surface` on the streamable HTTP `/mcp` route; JSON-RPC `tools/call` invokes tool `ask` with `op` and `params`. The current process has not activated these API/MCP compositions, and the legacy MCP registrar remains in use, so no serving is claimed. Read handlers require only `finance:read` and cannot reserve leases or invoke submission. Paper submission keeps its separate `finance:paper-trade`, tenant/account, lease, receipt, and GRAPHOS-OPS-R017.2 ownership requirements. | `tests/mcp_server/test_data_market_reads_served.py` must exercise both real routes, shared provider dispatch, denial before calls, and read/effect isolation; existing paper-submit acceptance remains required.",
      "definition_source": "specs/data-and-market-projections/requirements.md",
      "definition_line": 25
    },
    {
      "id": "GRAPHOS-RELEASE",
      "kind": "spec",
      "parent": null,
      "source": "specs/dependency-ordered-release/status.json",
      "title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/dependency-ordered-release/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/dependency-ordered-release/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Existing path",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/dependency-ordered-release/plan.md#existing-system-and-reuse"
        },
        {
          "declared_in": "specs/dependency-ordered-release/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Failure",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/dependency-ordered-release/plan.md#failure-and-rollback"
        },
        {
          "declared_in": "specs/dependency-ordered-release/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Gates",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/dependency-ordered-release/plan.md#quality-and-release-gates"
        },
        {
          "declared_in": "specs/dependency-ordered-release/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Manifest",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/dependency-ordered-release/plan.md#candidate-manifest-and-compatibility"
        },
        {
          "declared_in": "specs/dependency-ordered-release/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Ordering",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/dependency-ordered-release/plan.md#rollout-state-machine"
        },
        {
          "declared_in": "specs/dependency-ordered-release/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/dependency-ordered-release/requirements.md"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/dependency-ordered-release/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "Portable deployment",
          "repository": "Knuckles-Team/graph-os",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/portable-deployment/spec.md"
        },
        {
          "declared_in": "specs/dependency-ordered-release/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "public ingress",
          "repository": "Knuckles-Team/graph-os",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/public-ingress-identity/spec.md"
        }
      ],
      "plan_diagrams": [
        "flowchart LR\n  Candidate --> Verify[Verify manifest and compatibility]\n  Verify --> Plan[Topological dry run]\n  Plan --> Stage[Apply one digest-pinned stage]\n  Stage --> Probe[Readiness and functional probe]\n  Probe -->|pass| Stage\n  Probe -->|fail| Stop[Stop and rollback decision]\n  Stage --> Complete[Complete signed receipt]\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-RELEASE-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "Dependency-ordered, digest-verified release promotion",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "eacc29a1952e"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**Dependency-ordered, digest-verified release promotion.** GraphOS validates digest-pinned candidate images in a dedicated Kubernetes test namespace before promoting them, and performs its dependency-ordered pushes to each repository in sequence, checking that repository's continuous-integration result before advancing to the next. | An integration test against a fixture dependency graph confirms the rollout stops before the next stage when a predecessor's digest or CI result is missing.",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-RELEASE-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "Local Kubernetes validation gates every push",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "03ec8432da14",
        "f3f45f5e2d1b"
      ],
      "verified_by": [
        "tests/deployment/test_local_gates.py:15",
        "tests/deployment/test_local_gates.py:28",
        "tests/deployment/test_local_gates.py:41",
        "tests/deployment/test_local_gates.py:47",
        "tests/deployment/test_local_gates.py:59"
      ],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**Local Kubernetes validation gates every push.** GraphOS runs local Kubernetes validation in a dedicated test namespace as part of release qualification, and the release process refuses to push or deploy until the repository's local gates report green. | A negative integration test confirms a push is blocked while a local gate is failing and proceeds once all local gates report green.",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-RELEASE-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "Exit-criteria matrix maps readiness to tests",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "03ec8432da14",
        "7db4c4a5d87c"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**Exit-criteria matrix maps readiness to tests.** GraphOS maintains an exit-criteria matrix mapping each release-readiness obligation to an executable test, including ingestion receipts, proofs over SPARQL and natural-language queries, one complete multi-agent orchestration graph, connector certification, one write-back receipt, a browser-and-identity-provider login probe, and a typed-abstention response to an agent-capability question. | A test-suite audit confirms every row of the exit-criteria matrix resolves to a passing automated test. Rollup; see `GRAPHOS-RELEASE-R003.1` onward (split 2026-10-09, net-new: no exit-criteria model existed).",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-RELEASE-R003.1",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "Exit-criteria matrix registry and audit mechanism (graph-os side, against the currently pinned epistemic-graph)",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "03ec8432da14",
        "7db4c4a5d87c"
      ],
      "verified_by": [
        "tests/deployment/test_exit_criteria.py:10",
        "tests/deployment/test_exit_criteria.py:27",
        "tests/deployment/test_exit_criteria.py:42"
      ],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**Exit-criteria matrix registry and audit mechanism (graph-os side, against the currently pinned epistemic-graph).** GraphOS defines the exit-criteria matrix as a typed registry of obligation -> test-node-id rows and an audit function a test-suite audit runs against pytest's collected node IDs; an unregistered or uncollected obligation audits as missing, never a silent pass. | A unit test confirms the audit function marks a row satisfied when its test node ID is present among collected test IDs and missing when it is absent.",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-RELEASE-R003.2",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "Full exit-criteria matrix closes green across all seven obligations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**Full exit-criteria matrix closes green across all seven obligations.** Each of the seven obligation rows (ingestion receipts, SPARQL/natural-language query proofs, the multi-agent orchestration graph, connector certification, the write-back receipt, the browser-and-identity-provider login probe, and the typed-abstention response) is registered against a real, currently-passing cross-repo test once the epistemic-graph v2.28 release (the 44-PR integration audit it is gated on) lands, since several obligations exercise epistemic-graph capabilities this repository cannot certify against a release that has not been cut. | A test-suite audit confirms every row of the exit-criteria matrix resolves to a passing automated test.",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-RELEASE-R003.3",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "SPARQL and natural-language query-proof rows",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**SPARQL and natural-language query-proof rows.** Child slice of `GRAPHOS-RELEASE-R003` (see tasks.md). | A test-suite audit confirms every row of the exit-criteria matrix resolves to a passing automated test. Rollup; see GRAPHOS-RELEASE-R003.1 onward (split 2026-10-09, net-new: no exit-criteria model existed)",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-RELEASE-R003.4",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "multi-agent orchestration-graph row",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**multi-agent orchestration-graph row.** Child slice of `GRAPHOS-RELEASE-R003` (see tasks.md). | A test-suite audit confirms every row of the exit-criteria matrix resolves to a passing automated test. Rollup; see GRAPHOS-RELEASE-R003.1 onward (split 2026-10-09, net-new: no exit-criteria model existed)",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 11
    },
    {
      "id": "GRAPHOS-RELEASE-R003.5",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "connector-certification row",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**connector-certification row.** Child slice of `GRAPHOS-RELEASE-R003` (see tasks.md). | A test-suite audit confirms every row of the exit-criteria matrix resolves to a passing automated test. Rollup; see GRAPHOS-RELEASE-R003.1 onward (split 2026-10-09, net-new: no exit-criteria model existed)",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 12
    },
    {
      "id": "GRAPHOS-RELEASE-R003.6",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "write-back receipt row",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**write-back receipt row.** Child slice of `GRAPHOS-RELEASE-R003` (see tasks.md). | A test-suite audit confirms every row of the exit-criteria matrix resolves to a passing automated test. Rollup; see GRAPHOS-RELEASE-R003.1 onward (split 2026-10-09, net-new: no exit-criteria model existed)",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 13
    },
    {
      "id": "GRAPHOS-RELEASE-R003.7",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "browser-and-identity-provider login probe row",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**browser-and-identity-provider login probe row.** Child slice of `GRAPHOS-RELEASE-R003` (see tasks.md). | A test-suite audit confirms every row of the exit-criteria matrix resolves to a passing automated test. Rollup; see GRAPHOS-RELEASE-R003.1 onward (split 2026-10-09, net-new: no exit-criteria model existed)",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 14
    },
    {
      "id": "GRAPHOS-RELEASE-R003.8",
      "kind": "requirement",
      "parent": "GRAPHOS-RELEASE",
      "source": "specs/dependency-ordered-release/status.json",
      "title": "typed-abstention response row",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-RELEASE \u2014 Dependency-ordered, digest-pinned GraphOS rollout",
      "definition": "**typed-abstention response row.** Child slice of `GRAPHOS-RELEASE-R003` (see tasks.md). | A test-suite audit confirms every row of the exit-criteria matrix resolves to a passing automated test. Rollup; see GRAPHOS-RELEASE-R003.1 onward (split 2026-10-09, net-new: no exit-criteria model existed)",
      "definition_source": "specs/dependency-ordered-release/requirements.md",
      "definition_line": 15
    },
    {
      "id": "GRAPHOS-FLEET",
      "kind": "spec",
      "parent": null,
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/fleet-catalog-and-tools/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/fleet-catalog-and-tools/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "GRAPHOS-OPS-R009",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/hosted-api-operations/requirements.md"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/deployment/doctor.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/deployment/doctor.py"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/fleet/catalog_reader.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/fleet/catalog_reader.py"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/fleet/child_resilience.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/fleet/child_resilience.py"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/fleet/gateway_ops.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/fleet/gateway_ops.py"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/fleet/multiplexer.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/fleet/multiplexer.py"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/fleet/session_notifications.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/fleet/session_notifications.py"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/webui_host/mcp_delegation.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/webui_host/mcp_delegation.py"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "plan.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/fleet-catalog-and-tools/plan.md"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/fleet-catalog-and-tools/requirements.md"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "test-spec.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/fleet-catalog-and-tools/test-spec.md"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/fleet/test_fleet_onboarding.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/tests/fleet/test_fleet_onboarding.py"
        },
        {
          "declared_in": "specs/fleet-catalog-and-tools/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/test_fleet_catalog_reader.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/tests/test_fleet_catalog_reader.py"
        }
      ],
      "relations": [],
      "plan_diagrams": [
        "sequenceDiagram\n    participant Caller\n    participant Host as GraphOS invoke\n    participant EG\n    participant SDK\n    participant Agent as AU agent\n    Caller->>Host: authenticated run + idempotency key\n    Host->>EG: resolve skill, workflow, policy and distribution\n    EG-->>Host: bound decisions and versioned identities\n    Host->>Host: certify dependencies, admit all tools, reserve capacity\n    Host->>SDK: approved typed allocation\n    SDK-->>Host: actual instance receipt\n    Host->>Agent: admitted skill identity and model configuration\n    Agent->>EG: durable result through published execution contract\n    Host->>EG: apply existing aggregation to result receipts\n    EG-->>Caller: governed result and provenance\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-FLEET-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Typed pack publisher replaces placeholder ContentPack",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "18038a22a875",
        "223bee6a0edd",
        "8df218e2f742"
      ],
      "verified_by": [
        "tests/test_connector_pack_typed_publisher.py:29",
        "tests/test_connector_pack_typed_publisher.py:51",
        "tests/test_connector_pack_typed_publisher.py:65"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Typed pack publisher replaces placeholder ContentPack.** graph-os publishes fleet content packs using the engine-generated SQL record types instead of the placeholder `ContentPack` structure, so SQL and market-data connector items carry real typed schemas when they are added to the catalog. | Integration test asserts published packs use the generated types and that no code path constructs the placeholder `ContentPack`.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-FLEET-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Tool schema fingerprints recomputed from served schemas (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "0f346a4d0e4a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Tool schema fingerprints recomputed from served schemas (rollup).** Every fleet tool pin's schema fingerprint is computed from the tool's actual served schema rather than an empty placeholder. Catalog entries reflect real input and output shapes fleet-wide. Delivered through its child requirements, producer first. | An automated check re-certifies each pin against its live served schema and fails on any empty-schema fingerprint.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-FLEET-R002.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Per-tool schema fingerprint computed from the served schema",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0f346a4d0e4a",
        "223bee6a0edd"
      ],
      "verified_by": [
        "tests/fleet/test_schema_fingerprint.py:27",
        "tests/fleet/test_schema_fingerprint.py:36",
        "tests/fleet/test_schema_fingerprint.py:42",
        "tests/fleet/test_schema_fingerprint.py:48",
        "tests/fleet/test_schema_fingerprint.py:57"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Per-tool schema fingerprint computed from the served schema.** `graph_os/fleet/catalog_items.py` defines `compute_schema_fingerprint()`, a pure SHA-256 digest of a canonicalized schema that refuses an empty mapping, and `CatalogItem.schema_fingerprint`; `items_from_child_probe`'s tool rows populate it from the probed tool's real `inputSchema` through `_probed_item`, leaving it unset rather than empty for an unprobed schema or a non-tool item. No fleet-wide re-certification check yet (`GRAPHOS-FLEET-R002.2`, not yet specified). | `tests/fleet/test_schema_fingerprint.py` covers a stable digest, sensitivity to the served schema's content, refusal of an empty schema, population for a probed tool, and no fingerprint for an unprobed schema or a non-tool kind.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-FLEET-R002.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Remaining scope of GRAPHOS-FLEET-R002 (slice .2): Tool schema fingerprints recomputed from served schemas (rollup)",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "0f346a4d0e4a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Remaining scope of GRAPHOS-FLEET-R002 (slice .2): Tool schema fingerprints recomputed from served schemas (rollup).** Child slice of `GRAPHOS-FLEET-R002` (see tasks.md). | An automated check re-certifies each pin against its live served schema and fails on any empty-schema fingerprint",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-FLEET-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "D18 write-back exposed only as a typed, previewed operation (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "67b1b9ab916e"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**D18 write-back exposed only as a typed, previewed operation (rollup).** graph-os exposes the D18 write-back capability solely as a typed, idempotent, previewed registry operation rather than an unguarded native child tool, and the writable connector fleet continues to function correctly across a service restart. Delivered through its child requirements, producer first. | A restart/fault test confirms write-back idempotency and typed preview gating survive a service restart.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 11
    },
    {
      "id": "GRAPHOS-FLEET-R003.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Typed write-back preview model and its refusal rule",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "67b1b9ab916e",
        "e80df3dcad62",
        "f2d7ec520ab7"
      ],
      "verified_by": [
        "tests/api/test_write_back_models.py:120",
        "tests/api/test_write_back_models.py:19",
        "tests/api/test_write_back_models.py:31",
        "tests/api/test_write_back_models.py:46",
        "tests/api/test_write_back_models.py:60"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Typed write-back preview model and its refusal rule.** `graph_os/api/ops/write_back.py` defines `WriteBackPreviewRequest`/`WriteBackPreviewResult` and `preview_write_back()`, which never applies a write and refuses a blank idempotency key, so D18 write-back cannot be reached as an unguarded native child tool. No registry binding yet (`GRAPHOS-FLEET-R003.2`, not yet specified). | `tests/api/test_write_back_preview.py` covers a successful preview, the blank-idempotency-key refusal, and that the result never marks the write as applied.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 12
    },
    {
      "id": "GRAPHOS-FLEET-R003.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Write-back registered as a typed, gated registry operation, not a native child tool",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "f2d7ec520ab7"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Write-back registered as a typed, gated registry operation, not a native child tool.** `graph_os/api/ops/write_back.py` registers `fleet.write_back.preview` and `fleet.write_back.commit` as typed `OpSpec` entries. They consume the models of `GRAPHOS-FLEET-R003.1`. They are wired into `graph_os/api/ops/registry_factory.py`'s registry. The pipeline rejects `commit` unless it matches a prior `preview`'s idempotency key. No native child tool exposes write-back directly. | `tests/api/test_write_back_ops.py` covers preview-then-commit and an idempotent replayed commit returning the original receipt. It also covers rejection of a commit with no matching preview or a mismatched key.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 13
    },
    {
      "id": "GRAPHOS-FLEET-R004",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Pack annotations carry capability, digest, modality, cost, latency",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0aba0c33acd0",
        "f2a3173e9a84"
      ],
      "verified_by": [
        "tests/fleet/test_catalog_items_pack_annotations.py:28",
        "tests/fleet/test_catalog_items_pack_annotations.py:45",
        "tests/fleet/test_catalog_items_pack_annotations.py:63",
        "tests/fleet/test_catalog_items_pack_annotations.py:71"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Pack annotations carry capability, digest, modality, cost, latency.** Every fleet pack item's catalog entry carries its capability, schema digest, modality, cost and latency annotations, populated across the whole fleet rather than a subset. | A catalog audit test confirms all required annotation fields are present and non-empty for every pack item fleet-wide.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 14
    },
    {
      "id": "GRAPHOS-FLEET-R005",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "A2A task routing with typed work-item and lease operations (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "3b404ee3ecf8"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**A2A task routing with typed work-item and lease operations (rollup).** graph-os routes inbound A2A tasks through typed `GetWorkItem` and `ListWorkItems` operations. It exposes capability-based agent search. It issues single-use, provenance-tracked control leases for assigned work. The multiplexer exposes only the subset of tools reachable through this task-routing assembly. Delivered through its child requirements, producer first. | Native library tests cover work-item retrieval, listing, capability search, and control-lease issuance and consumption.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 15
    },
    {
      "id": "GRAPHOS-FLEET-R005.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Typed WorkItem view, the GetWorkItem/ListWorkItems producer",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3b404ee3ecf8",
        "f2a3173e9a84"
      ],
      "verified_by": [
        "tests/a2a/test_work_items.py:31",
        "tests/a2a/test_work_items.py:45",
        "tests/a2a/test_work_items.py:59",
        "tests/a2a/test_work_items.py:67",
        "tests/a2a/test_work_items.py:75"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Typed WorkItem view, the GetWorkItem/ListWorkItems producer.** `graph_os/a2a/work_items.py` defines a frozen `WorkItemView` and projects it. The projection reads the same durable work-item record fields `WorkItemA2AAuthority` already writes (`kind`, `tenant`, `created_by`, `metadata`, the `workitem:orchestrator:` id), The view refuses a record missing or blanking a required identity field for a single get. It drops (not fails) a malformed record for a listing. No `GetWorkItem`/`ListWorkItems` operation, capability search, or control lease yet (`GRAPHOS-FLEET-R005.2`+, not yet specified). | `tests/a2a/test_work_items.py` covers a real record projecting correctly, optional-field defaults, per-field missing/blank refusal, non-mapping metadata refusal, and a list that drops one malformed record while preserving order.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 16
    },
    {
      "id": "GRAPHOS-FLEET-R005.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Remaining scope of GRAPHOS-FLEET-R005 (slice .2): A2A task routing with typed work-item and lease operations (rollup)",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "3b404ee3ecf8"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Remaining scope of GRAPHOS-FLEET-R005 (slice .2): A2A task routing with typed work-item and lease operations (rollup).** Child slice of `GRAPHOS-FLEET-R005` (see tasks.md). | Native library tests cover work-item retrieval, listing, capability search, and control-lease issuance and consumption",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 17
    },
    {
      "id": "GRAPHOS-FLEET-R006",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Multiplexer skill and prompt harvest path removed",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "67b1b9ab916e"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Multiplexer skill and prompt harvest path removed.** The multiplexer no longer harvests or statically hydrates skills and prompts at startup. That code path and its boot-time ingestion are removed once the resident-tool catalog serves the same capability. | A package/runtime audit confirms no skill or prompt harvest or hydration code remains in the shipped package.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 18
    },
    {
      "id": "GRAPHOS-FLEET-R007",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Bridge upgraded to FastMCP 4 (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "67b1b9ab916e"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Bridge upgraded to FastMCP 4 (rollup).** graph-os's MCP bridge declares and runs on FastMCP 4, using its native tool, prompt, resource, template and Skills-over-MCP capabilities within a single composed server loop. Delivered through its child requirements, producer first, one child per owning repo/root since the bridge instance is constructed outside graph-os. | See the child requirements' verification.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 19
    },
    {
      "id": "GRAPHOS-FLEET-R008",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "RUM, security-audit and CI/CD feeds join the catalog (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "67b1b9ab916e"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**RUM, security-audit and CI/CD feeds join the catalog (rollup).** graph-os adds real-user-monitoring, security-audit and CI/CD event connectors as catalog items, exposing only approved, sanitized data through the same operation registry and tenant boundary as its other feeds. Delivered through its child requirements, producer first. | Integration test confirms each new feed's data passes sanitization and tenant-boundary checks before it appears in the registry.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 20
    },
    {
      "id": "GRAPHOS-FLEET-R008.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Typed feed-event model per feed kind",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "67b1b9ab916e",
        "f2a3173e9a84"
      ],
      "verified_by": [
        "tests/fleet/test_feeds.py:15",
        "tests/fleet/test_feeds.py:23",
        "tests/fleet/test_feeds.py:31",
        "tests/fleet/test_feeds.py:37",
        "tests/fleet/test_feeds.py:44"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Typed feed-event model per feed kind.** `graph_os/fleet/feeds.py` defines `FeedEvent`/`FeedEventRejected` and `rum_event()`/`security_audit_event()`/`cicd_event()`, each refusing an unsanitized payload or a missing tenant before a feed event can exist. No live connector ingestion yet (`GRAPHOS-FLEET-R008.2`, not yet specified). | `tests/fleet/test_feeds.py` covers construction of each feed kind, the unsanitized-payload refusal, and the missing-tenant refusal.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 21
    },
    {
      "id": "GRAPHOS-FLEET-R008.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Live feed ingestion wired into the catalog",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Live feed ingestion wired into the catalog.** Real RUM, security-audit and CI/CD connector ingestion produces `GRAPHOS-FLEET-R008.1` feed events and passes them through `connector_items()`/`_pack_annotations()` into the operation registry and tenant-boundary check, so each feed's data appears in the catalog only once sanitized and tenant-scoped. | Integration test confirms each new feed's data passes sanitization and tenant-boundary checks before it appears in the registry.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 22
    },
    {
      "id": "GRAPHOS-FLEET-R009",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Run admission evaluates, commits and publishes with capacity control",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "58ee1a06a392",
        "67b1b9ab916e",
        "c77ede8726fa"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Run admission evaluates, commits and publishes with capacity control.** graph-os's run admission in `graph_os/a2a/routing.py`, `graph_os/a2a/composition.py` and `control_plane/runs/admission.py` evaluates a candidate run, commits it with synthesis evidence, and publishes it only after an all-or-nothing capacity acquisition. A denied acquisition allows exactly one re-decision, and a stopped run releases its held capacity. Split across its 3 code roots (exceeds the 2-code-root threshold): `GRAPHOS-FLEET-R009.1` delivers the capacity primitive; `GRAPHOS-FLEET-R009.2` wires evaluate/commit/publish in `graph_os/a2a/routing.py` and `graph_os/a2a/composition.py` through it. | Rollup: both children deliver.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 23
    },
    {
      "id": "GRAPHOS-FLEET-R009.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Capacity acquisition is all-or-nothing with one re-decision",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "58ee1a06a392",
        "c77ede8726fa"
      ],
      "verified_by": [
        "tests/control_plane/admission/test_capacity_acquisition.py:13",
        "tests/control_plane/admission/test_capacity_acquisition.py:23",
        "tests/control_plane/admission/test_capacity_acquisition.py:35",
        "tests/control_plane/admission/test_capacity_acquisition.py:47",
        "tests/control_plane/admission/test_capacity_acquisition.py:60"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Capacity acquisition is all-or-nothing with one re-decision.** `graph_os/control_plane/runs/admission.py` gains a capacity primitive: a candidate run acquires every requested resource unit or none at all; the first denial consumes that run's single re-decision and returns a retry signal instead of failing, a second denial for the same run fails closed, and releasing a run (stop, or a reset after denial) returns every unit it held and restores its re-decision budget. | Unit test drives the primitive through grant, partial-unavailability no-op, denial-then-one-redecision, a second denial failing closed, and release restoring both capacity and the redecision budget.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 24
    },
    {
      "id": "GRAPHOS-FLEET-R009.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Routing and composition publish only through acquired capacity",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "58ee1a06a392",
        "c77ede8726fa"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Routing and composition publish only through acquired capacity.** `graph_os/a2a/routing.py` and `graph_os/a2a/composition.py` evaluate a candidate run, commit it with synthesis evidence, and call the `GRAPHOS-FLEET-R009.1` primitive before publishing; a denial surfaces the single re-decision to the caller and a stopped run releases its hold. | Integration test drives a candidate run end to end through evaluate, commit, capacity grant/re-decision, and publish, plus stop releasing capacity.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 25
    },
    {
      "id": "GRAPHOS-FLEET-R009.3",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Run admission publishes with all-or-nothing capacity control",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "58ee1a06a392"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Run admission publishes with all-or-nothing capacity control.** `control_plane/runs/admission.py` publishes a `GRAPHOS-FLEET-R009.2`-committed run only after an all-or-nothing capacity acquisition, allows a denied acquisition exactly one re-decision, and releases held capacity when the run stops. | Integration test drives admission through grant, a single re-decision on denial, and capacity release on stop.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 26
    },
    {
      "id": "GRAPHOS-FLEET-R003.3",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Write-back idempotency and preview gating survive a service restart",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Write-back idempotency and preview gating survive a service restart.** A restart/fault test exercises `fleet.write_back.preview`/`fleet.write_back.commit` (`GRAPHOS-FLEET-R003.2`) across a simulated service restart and a faulted child call, closing `GRAPHOS-FLEET-R003`'s original acceptance criterion. | `tests/fleet/test_write_back_restart.py` restarts the registry/service state mid-sequence and confirms a replayed commit returns the original receipt rather than double-applying, and a faulted child call leaves no partial write-back state.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 28
    },
    {
      "id": "GRAPHOS-FLEET-R006.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Harvest call-site inventory, the removal baseline",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "031958c74eb8",
        "a94c87aa090e"
      ],
      "verified_by": [
        "tests/fleet/test_harvest_inventory.py:105",
        "tests/fleet/test_harvest_inventory.py:116"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Harvest call-site inventory, the removal baseline.** `tests/fleet/test_harvest_inventory.py` enumerates every harvest-named entry point in `graph_os/fleet/multiplexer.py` (`_harvest_deadline`, `_harvest_error_reason`, `_harvest_resource_bodies` and its call sites in `_probe_protocol_families`/`_probe_skills`/`_probe_prompts`, and `_harvest_probe_results`) and pins today's call-site count as the baseline `GRAPHOS-FLEET-R006.2`-`.5` must reduce. No removal in this child. | `tests/fleet/test_harvest_inventory.py` passes against current `main` and fails if a harvest-named symbol or call site is added or removed without updating the pinned baseline.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 29
    },
    {
      "id": "GRAPHOS-FLEET-R006.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Skill/prompt body-harvest cutover for an already-admitted child",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "031958c74eb8",
        "1db599dcf40c",
        "a94c87aa090e"
      ],
      "verified_by": [
        "tests/fleet/test_fleet_r006_2_local_catalog_cutover.py:125",
        "tests/fleet/test_fleet_r006_2_local_catalog_cutover.py:33",
        "tests/fleet/test_fleet_r006_2_local_catalog_cutover.py:68",
        "tests/fleet/test_fleet_r006_2_local_catalog_cutover.py:91"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Skill/prompt body-harvest cutover for an already-admitted child.** `_probe_skills` and `_probe_prompts` (`graph_os/fleet/multiplexer.py`) stop calling `_harvest_resource_bodies` for a mounted child server already covered by the resident local-skill catalog (`graph_os/fleet/local_skill_catalog.py`'s `build_local_skill_catalog`), keeping the fleet-harvest fallback only for a child server that catalog does not yet admit, consuming `GRAPHOS-FLEET-R006.1`'s baseline. | A multiplexer test confirms an admitted child's skills/prompts resolve through the resident catalog with no `_harvest_resource_bodies` call, while a non-admitted child still falls back to the existing harvest path.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 30
    },
    {
      "id": "GRAPHOS-FLEET-R006.3",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Dead harvest helpers removed (rollup over `GRAPHOS-FLEET-R006.3.1`-`.4`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Dead harvest helpers removed (rollup over `GRAPHOS-FLEET-R006.3.1`-`.4`).** `GRAPHOS-FLEET-R006.2` deliberately kept the live-harvest fallback for a child the resident catalog does not admit, so `_harvest_resource_bodies` and its helpers are not yet dead; they are removed in four ordered steps once no caller is left. | `GRAPHOS-FLEET-R006.3.1`-`.4` are all delivered and `_harvest_resource_bodies`, `_harvest_deadline`, `_harvest_error_reason`, `_SKILL_HARVEST_SPEC` and `_PROMPT_HARVEST_SPEC` no longer exist in `graph_os/fleet/multiplexer.py`.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 31
    },
    {
      "id": "GRAPHOS-FLEET-R006.3.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "`_probe_protocol_families` harvest calls routed through the cutover helper",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ddb10c07995e"
      ],
      "verified_by": [
        "tests/fleet/test_harvest_inventory.py:128",
        "tests/fleet/test_harvest_inventory.py:135"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**`_probe_protocol_families` harvest calls routed through the cutover helper.** The two direct `_harvest_resource_bodies` calls in `_probe_protocol_families` (`graph_os/fleet/multiplexer.py`) are replaced by `_resolve_via_local_catalog_or_harvest`, leaving that helper the single `_harvest_resource_bodies` call site. | `tests/fleet/test_harvest_inventory.py` pins `_probe_protocol_families` at zero direct `_harvest_resource_bodies` call sites and `_resolve_via_local_catalog_or_harvest` at one; an admitted child's skills resolve with no wire read.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 32
    },
    {
      "id": "GRAPHOS-FLEET-R006.3.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Non-admitted fallback and `_harvest_resource_bodies` deleted",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Non-admitted fallback and `_harvest_resource_bodies` deleted.** Once every mounted fleet child is admitted by the resident catalog (`graph_os/fleet/local_skill_catalog.py`; admitting the remaining children is a prerequisite and may need an `agent-utilities` or per-agent package change), the fallback branch of `_resolve_via_local_catalog_or_harvest` and `_harvest_resource_bodies` are deleted. | The inventory test confirms `_harvest_resource_bodies` no longer exists and the skill/prompt discovery tests still pass.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 33
    },
    {
      "id": "GRAPHOS-FLEET-R006.3.3",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Deadline and error-reason helpers deleted",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Deadline and error-reason helpers deleted.** `_harvest_deadline`, `_HARVEST_DEADLINE_SHARE` and `_harvest_error_reason` are deleted from `graph_os/fleet/multiplexer.py` after `GRAPHOS-FLEET-R006.3.2` leaves them without a caller. | The inventory test confirms these symbols no longer exist.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 34
    },
    {
      "id": "GRAPHOS-FLEET-R006.3.4",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Harvest specs deleted",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Harvest specs deleted.** `_SKILL_HARVEST_SPEC`, `_PROMPT_HARVEST_SPEC` and the harvest-only budget constants are deleted, and `_probe_resource_family` keeps only the kind and body-field data it still needs, after `GRAPHOS-FLEET-R006.3.3`. | The inventory test confirms the two spec symbols no longer exist and `_probe_skills`/`_probe_prompts` tests still pass.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 35
    },
    {
      "id": "GRAPHOS-FLEET-R006.4",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Residual `_harvest`-named symbol renamed off the removed path",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Residual `_harvest`-named symbol renamed off the removed path.** `_harvest_probe_results` (`graph_os/fleet/multiplexer.py`) is renamed to `_settled_probe_results` and its docstring/call sites updated, since it folds generic per-server probe-task results rather than skill/prompt body harvest and must not be mistaken for the path removed in `GRAPHOS-FLEET-R006.3`. | A grep-based test confirms no `_harvest`-named symbol remains in `graph_os/fleet/multiplexer.py` except in historical comments/log strings, and `probe_catalog`'s existing tests still pass under the new name.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 36
    },
    {
      "id": "GRAPHOS-FLEET-R006.5",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Closing audit: no harvest or hydration code remains",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Closing audit: no harvest or hydration code remains.** A package/runtime audit confirms no skill or prompt harvest or boot-time hydration code remains in the shipped `graph_os` package, closing `GRAPHOS-FLEET-R006`'s original acceptance criterion. | `tests/fleet/test_no_harvest_remains.py`, built on `GRAPHOS-FLEET-R006.1`'s inventory, asserts the pinned baseline count is now zero for skill/prompt harvest and hydration call sites.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 37
    },
    {
      "id": "GRAPHOS-FLEET-R007.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "agent-connector-sdk's FastMCP instance gains native prompt/resource/template registration (cross-repo, owner: agent-connector-sdk)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**agent-connector-sdk's FastMCP instance gains native prompt/resource/template registration (cross-repo, owner: agent-connector-sdk).** `agent_connector_sdk/mcp/server.py`'s `create_mcp_server()` registers at least one native `.prompt()` and one native `.resource()`/`.resource_template()` on its constructed `FastMCP[Any]` instance alongside its existing `.tool()`/Skills-over-MCP registrations. | A protocol test in agent-connector-sdk confirms `create_mcp_server()`'s served instance answers a native prompt list, a resource read and a resource-template list.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 38
    },
    {
      "id": "GRAPHOS-FLEET-R007.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "agent-utilities' graph-os bridge surface gains native prompt/resource/template registration (cross-repo, owner: agent-utilities)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**agent-utilities' graph-os bridge surface gains native prompt/resource/template registration (cross-repo, owner: agent-utilities).** `agent_utilities/mcp/graphos_surface.py`'s `register_graphos_surface()` and its backing `FastMCP(\"graph-os-backing\")` instance register native prompts, resources and resource templates (not only tools, consuming `GRAPHOS-FLEET-R007.1`'s pattern) onto the single composed server loop handed to graph-os. | A protocol test in agent-utilities confirms `register_graphos_surface()`'s backing instance exposes native prompts/resources/templates alongside `graphos_registrars()`'s tools.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 39
    },
    {
      "id": "GRAPHOS-FLEET-R007.3",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "graph-os's served bridge exercises native prompts, resources and templates end to end",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**graph-os's served bridge exercises native prompts, resources and templates end to end.** graph-os's bootstrap (`graph_os/mcp_server/server.py`) mounts the single composed server loop built from `GRAPHOS-FLEET-R007.1`/`GRAPHOS-FLEET-R007.2` and serves its native tools, prompts, resources, resource templates and Skills-over-MCP together, closing `GRAPHOS-FLEET-R007`'s original acceptance criterion. | `tests/mcp/test_fastmcp4_native.py` exercises FastMCP 4 native tools, prompts, resources, templates and Skills-over-MCP against the served bridge.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 40
    },
    {
      "id": "GRAPHOS-FLEET-R011",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Registry core computes a canonical digest and authorized find",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4b83c69e2b41"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Registry core computes a canonical digest and authorized find.** `graph_os/api/registry/` defines `OpSpec`, its enums, and the `Registry` type with a canonical serialization and a `registry_digest` that identifies the active generation, and `find` evaluates caller authorization at lookup time rather than deferring it. | `tests/api/test_registry.py` covers canonical-form stability, digest computation, and authorized-versus-denied `find` results.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 41
    },
    {
      "id": "GRAPHOS-FLEET-R012",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "EG-direct binding generator with reviewed exclusions",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4b83c69e2b41",
        "68e31b75248a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**EG-direct binding generator with reviewed exclusions.** `graph_os/api/registry/eg_binding.py` generates registry operation bindings directly from the engine's wire-callable methods, and `eg_exclusions.yaml` records any method intentionally left out along with its reason, so every method is covered by a generated operation or a reviewed exclusion. | `tests/api/test_eg_binding.py` asserts full method coverage by generated bindings plus documented exclusions.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 42
    },
    {
      "id": "GRAPHOS-FLEET-R013",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "MCP projection exposes the six verbs with typed schemas",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "6b63aeb7ba03",
        "ea736715b7fb"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**MCP projection exposes the six verbs with typed schemas.** `graph_os/api/mcp/verbs.py`, `discovery.py` and `resources.py` project the registry as the six intent verbs produced by `make_verb`, each with a typed input schema, a `find` operation returning typed schemas, `graphos://` resources, and the active registry digest embedded in server instructions. | `tests/api/test_mcp_verbs.py` validates verb schemas, `find` output, resource URIs, and the embedded digest.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 43
    },
    {
      "id": "GRAPHOS-FLEET-R014",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Resolver ranks catalog items with partitioned feedback",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "43db6b7ac49b"
      ],
      "verified_by": [
        "tests/api/test_resolve.py:112",
        "tests/api/test_resolve.py:159"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Resolver ranks catalog items with partitioned feedback.** `graph_os/api/mcp/resolve.py` ranks catalog items using lexical and semantic matching over generated descriptors, an exponential moving average of tenant- and policy-partitioned outcome feedback, and a bounded result cache. Natural-language queries produce a preview rather than an executed mutation, and `ask` falls back to a natural-language `query.uql` call when no direct match is found. | `tests/api/test_resolve.py` covers ranking, partitioned feedback, cache bounds, and the NL-to-preview and `ask` fallback paths.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 44
    },
    {
      "id": "GRAPHOS-FLEET-R015",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Typed operations cover agents, browser and fleet calls",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "68e31b75248a",
        "e1d37ca10ef7"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Typed operations cover agents, browser and fleet calls.** `graph_os/api/ops/agents.py`, `browser.py` and `fleet.py` implement typed operations for agent/A2A tasks, reasoning calls, browser actions and fleet calls, where `fleet.call`'s effect classification is derived from the target item's own annotations. `graph_os/fleet/gateway_ops.py` wraps resolution and mounting of catalog tools for these operations to call through. | Integration tests exercise each operation family and confirm `fleet.call` effect classification matches the invoked item's annotation.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 45
    },
    {
      "id": "GRAPHOS-FLEET-R016",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Automated gates catch API surface and compatibility drift",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ba0aa6a11b4a"
      ],
      "verified_by": [
        "tests/api/test_gates_cli.py:27",
        "tests/api/test_gates_cli.py:39",
        "tests/api/test_gates_cli.py:61",
        "tests/api/test_gates_cli.py:76"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Automated gates catch API surface and compatibility drift.** `scripts/check_api_surface.py` and `scripts/check_api_compat.py` run as pre-commit hooks that detect drift in the registry's public API surface and backward compatibility, covering the full gate set defined for this specification. | `tests/api/test_gates_*.py` exercises each gate against both a compliant and a drifted fixture registry.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 46
    },
    {
      "id": "GRAPHOS-FLEET-R017",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Authority-parity oracle validates principal, operation and surface",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "ba0aa6a11b4a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Authority-parity oracle validates principal, operation and surface.** `tests/api/authority_matrix.yaml` defines the expected authorization outcome for each principal, operation and serving-surface combination, and `tests/api/test_authority_parity.py` asserts the registry's actual authorization decisions match that matrix exactly. | `tests/api/test_authority_parity.py` runs the full principal-by-operation-by-surface matrix and fails on any mismatch.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 47
    },
    {
      "id": "GRAPHOS-FLEET-R018",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Multiplexer exposes four resident fleet tools over one catalog",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "e1d37ca10ef7"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Multiplexer exposes four resident fleet tools over one catalog.** `api/ops/fleet.py` and `graph_os/fleet/{gateway_ops,catalog_items,session_loads}.py` implement `find_tools` (with `browse=true` replacing a separate catalog listing), `load_tools`, `unload_tools` and `multiplexer_status` over a single catalog filtered per caller, covering fleet tools, prompts, resources, resource templates, agent skills and connector items. Each caller's loaded-tool set defaults to a 64-item cap (hard cap 256) with optional least-recently-used eviction and a one-hour idle expiry, and each loaded tool's body invokes `fleet.call` using the caller's own delegated credential. | Scoped integration tests confirm cap enforcement, LRU eviction, idle expiry, and that invocation always carries the caller's delegated credential.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 48
    },
    {
      "id": "GRAPHOS-FLEET-R019",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Eunomia narrows authority at discover, load and call",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "269c409c5415"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Eunomia narrows authority at discover, load and call.** `graph_os/api/policy/` applies Eunomia as a narrowing-only policy step in the discover, load and call path, after scope and principal-rule checks and before the deputy and confirmation steps reach the engine; scope filtering always applies even when Eunomia is disabled, and an enabled-but-unreachable Eunomia fails the request closed rather than open. A deployment with no policy configured runs Eunomia off by default, a local deployment ships a default policy with it on, and an external deployment runs it on; `deployment/doctor.py` warns when it is off. | Policy integration tests cover all three default modes plus the fail-closed-on-unreachable and never-unfiltered-when-off cases.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 49
    },
    {
      "id": "GRAPHOS-FLEET-R021",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Fleet capability checks require exact scopes, deny unknown tools",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "18038a22a875",
        "2c70abad2b68",
        "336f9faf3f21",
        "444cedaf2b6d",
        "e7a32f572005"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Fleet capability checks require exact scopes, deny unknown tools.** `_require_fleet_capability` requires the exact fleet scope for the requested action and does not accept a broader `admin` or `kg:admin` grant in its place, and it enforces the same check for local stdio connections as for any other transport. `tool_dispatchable` denies any unrecognized native host tool by default instead of allowing it, and the served MCP surface always runs an Eunomia policy filter rather than serving unfiltered. | Tests cover both the previously over-broad path (now denied) and the correctly scoped path (now allowed), plus a served-surface check that Eunomia middleware is active.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 51
    },
    {
      "id": "GRAPHOS-FLEET-R022",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Catalog reconciliation re-ingests via durable replay",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1a8d280ab981"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Catalog reconciliation re-ingests via durable replay.** graph-os reconciles its served MCP catalog against the engine's durable event log, re-ingesting changed tools, prompts, resources and skills by replaying ordered delta receipts keyed by tenant, generation, sequence and item ID so replays are idempotent. | Integration test replays a delta sequence twice and confirms the resulting catalog state is identical.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 52
    },
    {
      "id": "PA-12",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Catalog reload rejects invalid candidates, proves replica convergence",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1a8d280ab981"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Catalog reload rejects invalid candidates, proves replica convergence.** Fleet catalog reload rejects duplicate, malformed, stale, missing, deleted or digest-mismatched candidate assets without publishing a partial generation, and multi-replica convergence is observed by generation and digest so a replica unable to reach the active generation reports degraded rather than serving a mixed catalog. | Negative-case tests cover each invalid-candidate condition, and a multi-replica integration test confirms convergence reporting.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 53
    },
    {
      "id": "GRAPHOS-FLEET-R023",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Connector count pins stay consistent across the fleet",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "667a206c800e"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Connector count pins stay consistent across the fleet.** Every fleet connector count reference \u2014 the compatibility matrix, the bundle-catalog schema, the check scripts, `ontology.lock`, the federated IRI, and `genesis.yaml` \u2014 reflects the same current total connector count, with no site lagging behind an actual fleet change. Delivered through its child requirements, producer first. | A check script scans all count-pin sites and fails if any of them disagrees with the live connector count.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 54
    },
    {
      "id": "GRAPHOS-FLEET-R023.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Pure connector count-pin comparison (producer)",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "667a206c800e"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Pure connector count-pin comparison (producer).** `graph_os/fleet/connector_count_pins.py` defines typed `CountPinSite` and `ConnectorCountMismatch`, and a pure `check_connector_count_pins()` that reports every site whose declared count disagrees with a given live count. `scripts/check_connector_count_pins.py` is the real CLI entry point: it parses `--site name=location=declared_count` arguments, runs the comparison, and exits non-zero on any mismatch. Wiring the fleet's actual count-pin sites (the compatibility matrix, the bundle-catalog schema, `ontology.lock`, the federated IRI) is cross-repo/AU-owned follow-up, not done here. | `tests/test_check_connector_count_pins.py` covers agreement, a flagged mismatch, a deliberate-mismatch fixture run through the real CLI (non-zero exit, mismatch on stderr), and a malformed `--site` argument.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 55
    },
    {
      "id": "GRAPHOS-FLEET-R024",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Fleet reconciliation, scaling and deploy watch are served by GraphOS",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "c2d8c8ce46b8"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Fleet reconciliation, scaling and deploy watch are served by GraphOS.** GraphOS owns the fleet reconciler, autoscaler, scaling authority and deploy-watch behavior that previously sat beside the agent runner in the agent runtime's `orchestration/` package. They run as GraphOS services behind typed operations with the same caller verification, policy filter and audit as other fleet operations, and the agent runtime keeps only the agent runner and planning code and reaches fleet behavior through those operations. | Parity tests reproduce the prior reconcile, scale-up, scale-down and deploy-watch decisions through the GraphOS operations, negative tests refuse an unauthorized caller, and a census shows the agent runtime no longer ships these modules.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 56
    },
    {
      "id": "PA-12.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Catalog reload rejects invalid candidates",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "1a8d280ab981"
      ],
      "verified_by": [
        "tests/test_fleet_catalog_reader.py:211",
        "tests/test_fleet_catalog_reader.py:223",
        "tests/test_fleet_catalog_reader.py:234",
        "tests/test_fleet_catalog_reader.py:251",
        "tests/test_fleet_catalog_reader.py:262"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Catalog reload rejects invalid candidates.** `FleetCatalogReader`/`FleetCatalogIntegrityError` fail closed on duplicate, malformed, stale, missing, deleted or digest-mismatched candidate assets without publishing a partial generation. | Negative-case tests cover cross-tenant, no-longer-current, unresolved provenance, content-revision mismatch and cyclic-cursor conditions.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 57
    },
    {
      "id": "PA-12.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Multi-replica convergence is observed by generation and digest",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1a8d280ab981"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Multi-replica convergence is observed by generation and digest.** A replica unable to reach the active generation+digest reports degraded rather than serving a mixed catalog. No generation/replica concept exists yet in `graph_os/fleet/catalog_reader.py`. | A multi-replica integration test confirms convergence reporting.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 58
    },
    {
      "id": "GRAPHOS-FLEET-R024.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Deploy-watch verdict is a typed GraphOS operation",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c2d8c8ce46b8"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Deploy-watch verdict is a typed GraphOS operation.** GraphOS owns the deploy-watch verdict decision (the success/failed/unobserved reduction over a probe sequence) that previously sat in the agent runtime's `orchestration/deploy_watch.py`, served as a typed operation (`fleet.deploy_watch.evaluate`) behind the same caller verification and policy filter as other fleet operations. | Parity tests reproduce the prior success/failed/unobserved verdict rule through the operation, and a negative test refuses a caller lacking the required scope.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 59
    },
    {
      "id": "GRAPHOS-FLEET-R024.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Remaining fleet reconciler, autoscaler, scaling-authority and deploy-watch scheduling behavior is served by GraphOS",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Remaining fleet reconciler, autoscaler, scaling-authority and deploy-watch scheduling behavior is served by GraphOS.** GraphOS owns the fleet reconciler, autoscaler, scaling authority, and the deploy-watch scheduling/rollback-dispatch behavior (beyond the R024.1 verdict rule) that previously sat beside the agent runner in the agent runtime's `orchestration/` package, each as a typed, wired-in operation with the same caller verification, policy filter and audit as other fleet operations. | Parity tests reproduce the prior reconcile, scale-up, scale-down and deploy-watch-dispatch decisions through the GraphOS operations, and negative tests refuse an unauthorized caller for each.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 60
    },
    {
      "id": "GRAPHOS-FLEET-R024.3",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Agent runtime no longer ships the superseded fleet modules (cross-repo)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Agent runtime no longer ships the superseded fleet modules (cross-repo).** The agent runtime keeps only the agent runner and planning code and reaches fleet reconciliation, autoscaling, scaling authority and deploy watch through the GraphOS operations from `GRAPHOS-FLEET-R024.1`/`GRAPHOS-FLEET-R024.2`, with the superseded `orchestration/` modules removed. | A census shows the agent runtime no longer ships the reconciler/autoscaler/scaling-authority/deploy-watch modules.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 61
    },
    {
      "id": "GRAPHOS-FLEET-R025",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Skills from every installed package, and an always-offered core pack, join the find/load path",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "d16472d4df1d"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Skills from every installed package, and an always-offered core pack, join the find/load path.** graph-os serves skills from its own package, from every other package installed in its own environment that declares the `agent_utilities.skill_providers` entry point (agent-utilities, epistemic-graph, agent-webui, and any further sibling package \u2014 including universal-skills once it declares the same entry point), and from the existing fleet harvest, through the SAME catalog and `find_tools`/`discover_tools`/`list_catalog` path, with a short always-offered core-pack list served without a search query. A locally-served skill takes precedence over a fleet-harvested one of the same name; an unreadable/malformed skill or a core-pack name no installed package provides is reported, never silently dropped. | `tests/fleet/test_local_skill_catalog.py` and `tests/fleet/test_local_skill_discovery.py` cover discovery from an injected provider resolver, a malformed-skill report, local-over-harvested precedence, the always-offered listing, and a missing core-pack-name report.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 62
    },
    {
      "id": "GRAPHOS-FLEET-R029",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "The intent tools are the only MCP surface",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1a8d280ab981",
        "d2b070392ec9",
        "db8d44259c3d"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**The intent tools are the only MCP surface.** graph-os serves the six intent tools and two MCP Apps launchers from the agent-utilities contract. `find` searches, lists and reports fleet status. `act` calls fleet tools, browser control, A2A and RLM operations. `manage` mounts and releases fleet servers. graph-os registers no fleet meta-tool and no per-session visibility middleware. This requirement supersedes the four resident tools in GRAPHOS-FLEET-R018 and GRAPHOS-FLEET-R020. | Served-surface tests list exactly the intent tools. Fleet tests reach find, call, load and status through the intent tools.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 63
    },
    {
      "id": "GRAPHOS-FLEET-R026",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "The catalog admits each server on its own",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "619d25ac8e69",
        "d9015e6d6cda"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**The catalog admits each server on its own.** The catalog reader skips a live registration without a current `mcp_server` component. It logs a warning and records the server name. `multiplexer_status` reports the names as `unadmitted_servers`. Boot never fails for this state. Receipt, revision, pin, content, duplicate and page-bound faults stay fatal. | `tests/test_fleet_catalog_reader.py` proves the reader skips and reports a bare registration. The existing fail-closed cases still raise. A multiplexer test reads `unadmitted_servers` from status.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 64
    },
    {
      "id": "GRAPHOS-FLEET-R027",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "GraphOS onboards every configured fleet server",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "5edd6cc9a3d7",
        "619d25ac8e69",
        "bbc73cd1532d",
        "be2026dd4ebf",
        "d9015e6d6cda"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**GraphOS onboards every configured fleet server.** One idempotent pass reads the enabled streamable-HTTP servers from the MCP config. The pass registers each server and captures its catalog through the connector SDK. It attests the catalog with EG and imports the pack. One server's failure leaves the others unaffected. `graph-os-production-ops onboard-fleet` runs a full pass and exits non-zero on any failure. Boot runs the pass on a background thread. A pass fault never blocks or stops serving. | `tests/fleet/test_fleet_onboarding.py` covers config filtering, a fresh-store pass, a failing server, an admitted server, a registry outage, a missing child credential, the CLI and a failing boot pass.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 65
    },
    {
      "id": "GRAPHOS-FLEET-R028",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "GraphOS renews every registration before its lease lapses",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "619d25ac8e69",
        "d9015e6d6cda"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**GraphOS renews every registration before its lease lapses.** Each pass re-registers each fleet and self-served lease that expires within six hours. Each renewal window uses its own idempotency key. A self-served registration renews at the configured served URL, else at its live URL. The boot thread repeats the pass every 30 minutes. A pass that admits a new server refreshes the multiplexer catalog when no child session runs. | `tests/fleet/test_fleet_onboarding.py` covers lapsing, fresh and absent leases, windowed keys, self-served renewal, the pass schedule and the refresh rule.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 66
    },
    {
      "id": "GRAPHOS-FLEET-R030",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Fleet onboarding registers connector access contracts unapproved",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "7e0cc536c81a",
        "9095a5cefabe",
        "f2284b64b6b3"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Fleet onboarding registers connector access contracts unapproved.** After a pack import, onboarding parses each `ontology://` resource with the SDK access-contract parser. It registers one `SourceConnection` per source and one unapproved `VirtualMapping` per contract. An unapproved mapping serves no reads. A missing SDK parser skips contracts without failure. A repeated pass adds no duplicate mapping. | `tests/fleet/test_fleet_access_contracts.py` covers registration, the unapproved state, idempotency and the missing parser.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 67
    },
    {
      "id": "GRAPHOS-FLEET-R031",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "`find` ranks catalog-admitted tools when a live probe cannot answer",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "d43ff2da921f"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**`find` ranks catalog-admitted tools when a live probe cannot answer.** `discover_tools` reads each admitted server's `tool`-kind components straight off the installed EG catalog snapshot (`MCPMultiplexer._catalog_tool_probe_info`), with no live probe, and ranks them when that server's live probe errored. The live probe stays the freshness refresh; the server still appears in `unavailable` so a real probe failure is never hidden, and a live answer is never shadowed by the snapshot. | `tests/fleet/test_catalog_tool_fallback.py` covers a timed-out server ranking its catalog-sourced tools as stale while still reported `unavailable`, an empty snapshot, and a live answer taking precedence over the snapshot.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 68
    },
    {
      "id": "GRAPHOS-FLEET-R032",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Gateway widget fetches run under a bound service actor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "f4812c0aa389"
      ],
      "verified_by": [
        "tests/gateway/test_aggregator.py:159"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Gateway widget fetches run under a bound service actor.** `graph_os/gateway/aggregator.py` mints the gateway's own verified process actor (the same `acquire_process_identity_token` \u2192 `mint_actor_from_token_sync` \u2192 `mint_graph_session` authority `graph_os/gateway/daemon.py::mint_process_identity` already mints for the host daemon) and binds it with `use_actor`/`use_session` around each widget fetch dispatched to the thread pool, propagating the bound context across the executor boundary instead of losing it to a plain `ThreadPoolExecutor` thread. | Every widget fetch reaches the fleet multiplexer with the gateway's service actor bound (context propagated across the worker-thread boundary), and no fetch fails with a missing process context.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 69
    },
    {
      "id": "GRAPHOS-FLEET-R033",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Fleet-catalog `servers` read owned by graph-os",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Fleet-catalog `servers` read owned by graph-os.** Rollup of `GRAPHOS-FLEET-R033.1` and `.2`; unblocks `AU-BOUNDARY-R001.4.2.2`. | All child rows are verified.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 70
    },
    {
      "id": "GRAPHOS-FLEET-R033.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Define the typed fleet-catalog `servers` reader",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Define the typed fleet-catalog `servers` reader.** Add `FleetCatalogServersReader` in `graph_os/gateway/` returning typed server records scoped by tenant and principal, replacing the catalog read of AU `gateway/registry_api.py` used by `kg_server.py`. Unblocks `AU-BOUNDARY-R001.4.2.2`. | A test lists only servers visible to the calling tenant and principal.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 71
    },
    {
      "id": "GRAPHOS-FLEET-R033.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Add refusal tests for the `servers` reader",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Add refusal tests for the `servers` reader.** Missing principal, cross-tenant and unauthorized reads are refused with typed errors. Unblocks `AU-BOUNDARY-R001.4.2.2`. | Tests cover each refusal and confirm no records leak.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 72
    },
    {
      "id": "GRAPHOS-FLEET-R034",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Skills and SI workflows are admitted before they run (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Skills and SI workflows are admitted before they run (rollup).** The host must audit each skill for unsafe instructions and tools. It must admit a workflow only with one owner, structured inputs, mapped data flows and a tool inventory. | All child rows are verified.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 73
    },
    {
      "id": "GRAPHOS-FLEET-R034.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Model.** Add `SkillAuditReport` (findings, severity, policy limit) and `WorkflowAdmissionRecord` (owner, inputs schema, data flows, tool inventory) in graph_os/fleet/admission_models.py. | tests/fleet/test_admission_models.py checks required fields.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 74
    },
    {
      "id": "GRAPHOS-FLEET-R034.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Behavior.** The default `skill_audit_policy` must scan skill text and declared tools and fail a skill when findings exceed a configured severity count. The default `workflow_admission_policy` must require all four workflow fields. Each default is replaceable by name. | Unit tests in tests/fleet/test_admission_models.py cover pass and fail cases.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 75
    },
    {
      "id": "GRAPHOS-FLEET-R034.3",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Wiring.** Call both policies in `invoke` at graph_os/api/invoke/pipeline.py:810 before `_confirmation_gate`, for any operation that loads a skill or starts a workflow. The production caller is the served route at graph_os/api/http/routes.py:127. This row creates the call site. | tests/fleet/test_admission_wiring.py asserts the policies run before the effect.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 76
    },
    {
      "id": "GRAPHOS-FLEET-R034.4",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Refusal.** The pipeline must return `OpError(\"SKILL_AUDIT_FAILED\")` or `OpError(\"WORKFLOW_NOT_ADMITTED\")`, naming the missing field or the exceeded limit. | Refusal tests in tests/fleet/test_admission_wiring.py.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 77
    },
    {
      "id": "GRAPHOS-FLEET-R034.5",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Evidence.** The outcome trace must record the audit report digest, the policy name and the missing fields. | A trace test in tests/fleet/test_admission_wiring.py.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 78
    },
    {
      "id": "GRAPHOS-FLEET-R034.6",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Hot-path proof.** The served route at graph_os/api/http/routes.py enters `invoke` (entry point: the served invoke operation), passes the wired policies, and the test observes refusal of an unsafe skill and of an ownerless workflow, then admission of a complete one. | tests/fleet/test_admission_hot_path.py passes.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 79
    },
    {
      "id": "GRAPHOS-FLEET-R034.7",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Model.** Bind certification to skill identity/version, dependency digests, model endpoint revision, system prompt digest and producer attestation. Bind workflow admission to tenant, caller, workflow declaration, every tool schema and current grant revision. | Typed fixtures reject missing bindings and dependency cycles.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 85
    },
    {
      "id": "GRAPHOS-FLEET-R034.8",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Behavior.** Certify atomic dependencies through the configured local model before composed workflows. EG selects and scores; GraphOS validates attestations. Admit every bound tool against the trusted workflow declaration and caller grant before any tool executes. | A stale dependency or one denied tool prevents all workflow calls.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 86
    },
    {
      "id": "GRAPHOS-FLEET-R034.9",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Wiring.** Extend invoke at graph_os/api/invoke/pipeline.py:810 before confirmation and dispatch. Reuse graph_os/api/ops/agents.py:97 operations and the served MCP intent projection. This row creates the certification and workflow admission call sites. | Served agents.run reaches the admission gate before AU execution.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 87
    },
    {
      "id": "GRAPHOS-FLEET-R034.10",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Refusal.** Return CERTIFICATION_REQUIRED, CERTIFICATION_STALE, WORKFLOW_NOT_ADMITTED or PRODUCER_UNAVAILABLE. Generated plans cannot enlarge EG policy. Recheck grant, declaration and schema revisions before each dispatch. | Unknown tools, cyclic dependencies and revoked grants produce no new effects.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 88
    },
    {
      "id": "GRAPHOS-FLEET-R034.11",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Evidence.** Record ordered certification receipts, dependency identities, model and prompt revisions, workflow snapshot digest and authoritative decision references. Exclude prompt bodies and credentials. | Independent trace reads prove atomic-before-composed ordering and exact tool binding.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 89
    },
    {
      "id": "GRAPHOS-FLEET-R034.12",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Hot-path proof.** Entry point agents.run through REST and MCP must exercise local-model certification, workflow admission and actual tool execution. Specify tests/fleet/test_certified_workflow_served.py with allowed, denied and stale cases. | Observe the configured model request and zero denied backend calls.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 90
    },
    {
      "id": "GRAPHOS-FLEET-R024.4",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Model.** Define ProvisionRequest, ProvisionResult and FleetCapacityProof as described in plan.md. Preserve image digest, OS, runtime, tenant, instance identity, budget and idempotency binding. | Typed nested request/result round trips preserve every allocation boundary.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 91
    },
    {
      "id": "GRAPHOS-FLEET-R024.5",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Behavior.** Validate the declared platform matrix and acquire bounded capacity before allocation. Reuse EG decisions and aggregation; collect durable results from real instances. Replay returns the same allocation receipt. | Observe at least 200 concurrent instances and independent durable results under the declared budget.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 92
    },
    {
      "id": "GRAPHOS-FLEET-R024.6",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Wiring.** Reuse graph_os/control_plane/runs/admission.py:108 NativeWorkItemAdmissionProtocol and graph_os/control_plane/runs/capacity.py:53 CapacityLedger. Extend graph_os/api/ops/agents.py:97 through invoke. This row creates the served provisioning adapter call site. | The served operation reaches the approved SDK provisioner and returned-result consumer.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 93
    },
    {
      "id": "GRAPHOS-FLEET-R024.7",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Refusal.** Reject unsupported platform/image, denied grant, stale decision, exceeded budget and changed replay bodies before allocation. Unknown allocation outcomes require reconciliation; never repeat an uncertain effect. | No denied allocation occurs; partial failures retain actual resource identities for cleanup.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 94
    },
    {
      "id": "GRAPHOS-FLEET-R024.8",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Evidence.** Record requested, admitted, started, completed and failed instance identities, peak concurrency, budget consumption, timestamps and result receipts. Preserve EG aggregation operation/version and input receipt identities. | Counters reconcile with independent runtime and durable result observations.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 95
    },
    {
      "id": "GRAPHOS-FLEET-R024.9",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Hot-path proof.** Entry point agents.run must exercise real disposable provisioners in tests/fleet/test_provisioned_capacity_served.py. Cover every declared matrix row, 200 concurrent instances, refusal, replay, interruption and aggregate result reads. | Mock allocations and smaller extrapolated runs cannot establish capacity.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 96
    },
    {
      "id": "GRAPHOS-FLEET-R002.3",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Model.** Define VersionedDefinition with kind, producer identity, semantic version, nested schema, schema digest, body digest and compatibility receipt. Tools retain input/output shapes; prompts retain typed role, instruction, context and example sections. | Fixtures parse nested definitions and reject missing versions or unknown required fields.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 97
    },
    {
      "id": "GRAPHOS-FLEET-R002.4",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Behavior.** Gate candidate publication on producer schema validity and compatibility with the admitted version. Same-version content changes refuse. Breaking changes require a new major version and explicit re-admission. | Compatible updates publish atomically; incompatible evolution leaves the prior generation active.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 98
    },
    {
      "id": "GRAPHOS-FLEET-R002.5",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Wiring.** Extend graph_os/fleet/catalog_items.py:208 compute_schema_fingerprint and graph_os/fleet/onboarding.py:236 FleetOnboarding.onboard before import. Preserve EG prompt authority and SDK tool schema ownership. | Real served catalog probes provide both schema versions and verified producer receipts.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 99
    },
    {
      "id": "GRAPHOS-FLEET-R002.6",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Refusal.** Return DEFINITION_VERSION_REQUIRED, SCHEMA_INVALID, SCHEMA_INCOMPATIBLE or PRODUCER_UNAVAILABLE before catalog visibility. Host parsing cannot certify absent producer evolution semantics. | Missing or contradictory producer evidence never permits a generation swap.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 100
    },
    {
      "id": "GRAPHOS-FLEET-R002.7",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Evidence.** Record old/new definition versions, schema/body digests, producer revision, compatibility decision and catalog generation. Preserve tenant and source provenance. | Receipt reads identify exactly which definition each admitted workflow consumed.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 101
    },
    {
      "id": "GRAPHOS-FLEET-R002.8",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Hot-path proof.** Entry point served catalog reload in tests/fleet/test_versioned_definitions_served.py admits a compatible nested update. Breaking updates, forged receipts and stale workflow schemas refuse before execution. | MCP and REST expose the same complete admitted generation.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 102
    },
    {
      "id": "GRAPHOS-FLEET-R027.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Model.** Bind IntegratedProvisionReceipt to discovery generation, EG skill identity/version, distribution decision, admission receipt, provisioned instance and durable result. Reuse typed work-item projections from R005. | All phases retain one tenant, run identity and exact skill digest.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 103
    },
    {
      "id": "GRAPHOS-FLEET-R027.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Behavior.** Discover authorized domain capabilities, consume EG distribution decisions, provision real agents and attach the graph-ingested skill version. The agent must use that exact identity during execution. | Independent graph and agent observations agree before a successful completion claim.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 104
    },
    {
      "id": "GRAPHOS-FLEET-R027.3",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Wiring.** Reuse graph_os/fleet/onboarding.py:236 FleetOnboarding.onboard and graph_os/api/ops/agents.py:97 operations. Connect the admitted work-item route to provisioning and result evidence. This row creates the integrated acceptance call site. | One served request traverses discovery, distribution, provisioning and ingested skill consumption.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 105
    },
    {
      "id": "GRAPHOS-FLEET-R027.4",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Refusal.** Deny missing skills, unavailable producers, incompatible schemas, cross-tenant receipts and unapproved tools. Stop before affected dispatch; retain known partial allocation state without claiming rollback. | Denied discovery returns no protected identity; no unauthorized agent or tool effect occurs.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 106
    },
    {
      "id": "GRAPHOS-FLEET-R027.5",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Evidence.** Correlate catalog generation, graph read receipt, distribution decision, instance identity, model trace and result receipt. Read graph state independently after ingestion and agent execution. | The evidence proves graph identity consumption rather than matching copied skill text.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 107
    },
    {
      "id": "GRAPHOS-FLEET-R027.6",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Hot-path proof.** Entry point agents.run through real MCP and REST in tests/fleet/test_discovery_distribution_provisioning.py must execute the whole sequence. Include denial, unavailable producer, restart and duplicate delivery. | Separate helper tests cannot satisfy integrated acceptance.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 108
    },
    {
      "id": "GRAPHOS-FLEET-R019.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Behavior.** Workflow admission also applies R034.7 through R034.12 through the same narrowing policy boundary. No separate host identity authority is introduced. | The served integrated tests cover this consumer dependency.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 109
    },
    {
      "id": "GRAPHOS-FLEET-R021.1",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Behavior.** Every workflow tool requires the declaration and grant binding in R034.7 through R034.12 before the first call. Revalidate before later calls. | The served integrated tests cover this consumer dependency.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 110
    },
    {
      "id": "GRAPHOS-FLEET-R005.3",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Behavior.** Integrated work-item distribution and provisioning use R027.1 through R027.6. Preserve EG work-item identity, control lease and returned-result authority. | The served integrated tests cover this consumer dependency.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 111
    },
    {
      "id": "GRAPHOS-FLEET-R019.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Original policy contract",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Original policy contract.** Apply narrowing-only policy at discover, load and call after exact scope and principal checks. Policy precedes deputy and confirmation steps. Disabled policy still filters by scope and principal. With no configured policy, default to off. Local deployments ship the default policy enabled; external deployments enable it. deployment/doctor.py warns when policy is off. An enabled but unreachable policy service fails closed at discover, load and call. An explicit policy denial cannot become an allow. | Exercise every phase with allowed and denied callers while policy is enabled and disabled. No denied call reaches the engine. Cover all three deployment modes and assert the doctor warning for off mode. For each phase, compare an allowed decision, denied decision and unavailable service. Refused discovery leaks no item; refused loading or calling produces no effect.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 120
    },
    {
      "id": "GRAPHOS-FLEET-R021.2",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Original fleet authority contract",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Original fleet authority contract.** Require the exact fleet scope for each action through _require_fleet_capability. Neither admin nor kg:admin substitutes for that scope. Local stdio enforces the same rule as network transports. tool_dispatchable denies every unrecognized native host tool. The served MCP surface applies the existing policy filter before visibility and dispatch. | Exercise correctly scoped and over-broad callers for each action on stdio and network transports. Only the exact authorized scope permits the action. Unknown native names refuse. Start the actual MCP surface and prove policy middleware filters discovery and execution for denied callers.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 121
    },
    {
      "id": "GRAPHOS-FLEET-R027.7",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Original fleet onboarding contract",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Original fleet onboarding contract.** One pass selects every enabled streamable-HTTP server from MCP config. It registers each server, captures its catalog through SDK, attests with EG and imports the pack. Repeated onboarding is idempotent and handles admitted servers without duplicate imports. A failing server leaves the others unaffected. Registry outages and missing child credentials produce explicit per-server failure outcomes. graph-os-production-ops onboard-fleet runs one complete pass, reports each server and exits non-zero when any server fails. Boot starts the same onboarding pass on a background thread. A pass failure never blocks or stops serving. | A fresh-store pass covers multiple enabled servers. Disabled servers and other transports are excluded. Each eligible server has registration, capture, attestation and import evidence. Repeat a pass and observe no duplicate imports. Mix failing and healthy servers, then exercise registry outage and missing credentials. Preserve successful server outcomes. Invoke the real CLI for successful and mixed-result passes. Assert complete server reporting and the required exit status. Start the actual serving composition with a failing boot pass. Observe the failure report while MCP requests still complete.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 122
    },
    {
      "id": "GRAPHOS-FLEET-R003.4",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Original writable-fleet acceptance residual",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Original writable-fleet acceptance residual.** Model: The original R003 contract covers every admitted writable connector, not just repository files. Behavior: Preserve typed registry exposure, preview gating, deterministic replay and correct fleet behavior across service restart. Wiring: Retain R003.1 through R003.3 and their original acceptance; extend the served fleet fixture. Refusal: No unguarded native tool, missing preview or mismatched effect key may produce a write. Evidence: Restart and fault each admitted writable profile. Observe original receipts without duplicate effects and no partial protocol state. Missing previews and mismatched keys must prevent writes. | Proposed test: `tests/fleet/test_repository_source_effect_served.py::test_original_fleet_restart`. Restart and fault each admitted writable profile. Observe original receipts without duplicate effects and no partial protocol state. Missing previews and mismatched keys must prevent writes.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 130
    },
    {
      "id": "GRAPHOS-FLEET-R003.5",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Complete repository request binding",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Complete repository request binding.** Model: RepositoryWriteBackParams carries the full SDK RepositorySourceEffectRequest and a trusted connector-binding digest. Behavior: Keep every SDK field, including exact bytes, immutable base, actor, approval and effect key, inside the confirmed projection. Wiring: Extend the existing write-back operation schemas with the closed repository profile defined in plan.md. Refusal: Unknown fields, changed bindings and request.intent differing from durable.desired_patch[\"repository_effect\"] refuse. Evidence: Round-trip seeded byte fixtures through HTTP and MCP. Compare canonical projections and refuse each independently altered field. | Proposed test: `tests/fleet/test_repository_source_effect_served.py::test_request_binding`. Round-trip seeded byte fixtures through HTTP and MCP. Compare canonical projections and refuse each independently altered field.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 131
    },
    {
      "id": "GRAPHOS-FLEET-R003.6",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Trusted composition through shared invoke",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Trusted composition through shared invoke.** Model: An admitted binding identifies the connector, source instance, repository, operation schema and existing execution authority. Behavior: Resolve it from trusted configuration and route both operations through the existing invoke checks. Wiring: Extend write_back.py and registry_factory.py; compose the admitted SDK operation through the existing fleet gateway and executor. Refusal: Missing producer, changed configuration or unavailable replay authority returns a typed refusal before provider mutation. Evidence: A served request reaches the real admitted connector once. Unbound configuration and direct native bypass attempts reach it zero times. | Proposed test: `tests/fleet/test_repository_source_effect_served.py::test_trusted_composition`. A served request reaches the real admitted connector once. Unbound configuration and direct native bypass attempts reach it zero times.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 132
    },
    {
      "id": "GRAPHOS-FLEET-R003.7",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Preview and approval bind the commit operation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Preview and approval bind the commit operation.** Model: The existing plan binds the commit operation, full parameters, caller, tenant, policy and registry revision. Behavior: Require the SDK dry-run and recorded approval for the same canonical change set before commit. Wiring: Reuse bind_plan and the existing confirmation, audit and reservation path under GRAPHOS-OPS-R009. Refusal: A preview-operation lease, expired plan, changed payload or unbound approval cannot authorize commit. Evidence: One exact approved preview commits. Each binding change, invalid lease and missing required step-up produces zero provider mutations. | Proposed test: `tests/fleet/test_repository_source_effect_served.py::test_commit_binding`. One exact approved preview commits. Each binding change, invalid lease and missing required step-up produces zero provider mutations.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 133
    },
    {
      "id": "GRAPHOS-FLEET-R003.8",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Served effect and independent readback evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Served effect and independent readback evidence.** Model: The result carries the actual SDK RepositorySourceEffectReceipt, request digest and receipt digest. Behavior: Return success only for a bound durable attempt with an actual immutable revision and matching independent readback. Wiring: Project SDK R004.8 through R004.10 and R004.12 results through the served operation response. Refusal: An echoed effect key, applied flag, fabricated revision or unbound receipt cannot establish success. Evidence: Serve preview, approval and commit against a disposable provider. Independently read its revision and durable graph attempt. An echoed flag or unbound receipt must refuse success. | Proposed test: `tests/fleet/test_repository_source_effect_served.py::test_actual_effect_readback`. Serve preview, approval and commit against a disposable provider. Independently read its revision and durable graph attempt. An echoed flag or unbound receipt must refuse success.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 134
    },
    {
      "id": "GRAPHOS-FLEET-R003.9",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Zero-effect refusal parity",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Zero-effect refusal parity.** Model: The negative matrix binds each changed request or denied authority to the observed provider call count. Behavior: Apply existing principal, scope, policy, subject-read, plan, approval and audit rules identically across HTTP and MCP. Wiring: Use the shared invoke error envelope and SDK refusal semantics; retain original engine and fleet error provenance. Refusal: Reject missing approval, stale base, path escape, changed bytes and denied scope before mutation. Post-effect uncertainty never means rollback. Evidence: Observe zero denied mutations on both surfaces. Inject readback failure after an effect and observe uncertainty without another write. | Proposed test: `tests/fleet/test_repository_source_effect_served.py::test_refusal_parity`. Observe zero denied mutations on both surfaces. Inject readback failure after an effect and observe uncertainty without another write.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 135
    },
    {
      "id": "GRAPHOS-FLEET-R003.10",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Durable replay across host and connector restart",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Durable replay across host and connector restart.** Model: The host plan and reservation bind the original SDK effect key, request and durable receipt. Behavior: Recover the same proven result after restart; reconcile uncertain effects without blind reapply. Wiring: Use the existing qualified effect coordinator with SDK R004.2 and R004.11 through shared invoke. Refusal: A consumed plan alone cannot prove completion; conflicting replay, lost receipts and unavailable causal lookup cannot trigger another mutation. Evidence: Race identical calls and crash at each effect boundary. Restart both processes and prove one effect or a truthful unresolved result. | Proposed test: `tests/fleet/test_repository_source_effect_served.py::test_restart_replay`. Race identical calls and crash at each effect boundary. Restart both processes and prove one effect or a truthful unresolved result.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 136
    },
    {
      "id": "GRAPHOS-FLEET-R035",
      "kind": "requirement",
      "parent": "GRAPHOS-FLEET",
      "source": "specs/fleet-catalog-and-tools/status.json",
      "title": "Authenticated schema preflight for OpenAPI operation aliases",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "1cf004ee454e",
        "1e55e62acb2a",
        "35fbba91b24b",
        "61c7f230ec1e",
        "763701d591a8"
      ],
      "verified_by": [
        "tests/fleet/test_multiplexer_boundary.py:275",
        "tests/fleet/test_multiplexer_boundary.py:283",
        "tests/fleet/test_multiplexer_boundary.py:296",
        "tests/fleet/test_multiplexer_dynamic_gateway.py:1842",
        "tests/fleet/test_multiplexer_dynamic_gateway.py:1859"
      ],
      "parent_title": "GRAPHOS-FLEET \u2014 Fleet catalog, intent tools, and policy safe reload",
      "definition": "**Authenticated schema preflight for OpenAPI operation aliases.** Before invoking a schema-bound alias, GraphOS reads its SDK manifest and complete ordered fragments over the same authority-admitted MCP session. It reconstructs the canonical document with the public SDK. It checks both schema hashes and exact equality with the admitted input/output schemas. It binds the manifest alias and operation to the requested action. Revalidate caller delegation, child generation, catalog revision and tool mapping before each resource read and final call. Missing, stale, invalid, incomplete, oversized or mismatched disclosure refuses before invocation. Schema-bound aliases are not automatically retried after uncertain outcomes; existing MCP confirmation and effect handling remain authoritative. | `tests/fleet/test_multiplexer_schema_disclosure.py` covers complete reconstruction, stale/incomplete/mismatched refusal, missing output-schema refusal, authority/session/catalog binding, OAuth session reuse and no write replay. These fixture tests do not establish live-provider or deployment evidence.",
      "definition_source": "specs/fleet-catalog-and-tools/requirements.md",
      "definition_line": 137
    },
    {
      "id": "GRAPHOS-HOST",
      "kind": "spec",
      "parent": null,
      "source": "specs/host-composition-boundary/status.json",
      "title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/host-composition-boundary/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/host-composition-boundary/plan.md",
          "evidence": "external declaration; not verified",
          "label": "TUI-RUNTIME-R002.2 through R002.6",
          "repository": "Knuckles-Team/agent-terminal-ui",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/agent-terminal-ui/blob/5ac5e3fec4d590f167d2c6bd694683dbd8950c26/specs/terminal-runtime/plan.md#tui-runtime-r002-consumer-boundary"
        },
        {
          "declared_in": "specs/host-composition-boundary/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/host-composition-boundary/requirements.md"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/host-composition-boundary/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "A2A spec",
          "repository": "Knuckles-Team/graph-os",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/a2a/spec.md"
        }
      ],
      "plan_diagrams": [
        "flowchart LR\n  C[Client] --> B[Transport identity and admission]\n  B --> P[Shared action policy]\n  P --> S[Typed application operation]\n  S --> E[Graph engine client]\n  S --> A[Agent runtime public API]\n  S --> K[Connector SDK runner]\n  S --> R[One result and receipt mapper]\n  R --> C\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-HOST-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Cross-repository composition boundary assignment",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "9760bef27075"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Cross-repository composition boundary assignment.** GraphOS composes its runtime gateway on top of boundary contracts in which the graph engine owns ontology, SHACL and durable graph records, the connector SDK owns connector transport, and the agent runtime exposes only its public agent control-plane API; the web UI consumes this composed boundary rather than any internal package. | An import-boundary census confirms each dependency is reached only through its published public API, enforced as a continuous-integration check.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-HOST-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Graph engine client exposes the session/discovery surface",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Graph engine client exposes the session/discovery surface.** The graph engine's client library exposes session, engine, source-sync, shard-topology, fleet-catalog and discovery-authority methods that GraphOS's gateway and fleet modules call directly, so migrating that code out of the agent runtime does not require reimplementing this surface. | A contract test against the installed graph engine client confirms each required method is present and callable before the dependent modules are migrated.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-HOST-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Web UI rename cutover across GraphOS",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4ca77fbff9e3",
        "6dda5ac3548c"
      ],
      "verified_by": [
        "tests/architecture/test_webui_rename_references.py:13"
      ],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Web UI rename cutover across GraphOS.** GraphOS's import sites, optional web UI package extra, package source reference, release workflow checkout step, preflight checks, and browser-control tests and docs all reference the renamed web UI package. | A focused test run and the offline lock check confirm every reference resolves against the renamed package.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-HOST-R004",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Single gateway implementation under graph_os/gateway",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "45283d0137b9",
        "f37f67d33d37"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Single gateway implementation under graph_os/gateway.** GraphOS retains one gateway implementation under `graph_os/gateway/`, incorporating any behavior unique to the agent runtime's duplicate gateway package once that duplicate is removed, reconciling the `schemas/graph_core` and `ontology_api` modules against their counterparts, and dropping the `graph-os-daemon` console script and the `gateway-widgets` package extra. | A package-layout test confirms no duplicate gateway implementation remains and the retired script and extra are absent.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-HOST-R005",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "graph_os.mcp_server.runtime serves retired MCP actions",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "4ca77fbff9e3"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**graph_os.mcp_server.runtime serves retired MCP actions.** GraphOS's `graph_os/mcp_server/runtime.py` serves every MCP action the agent runtime's legacy MCP host previously provided, verified against an approved action-to-operation mapping, once that legacy host is retired. | A parity test maps each served MCP operation to the approved registry. It confirms no action is dropped without a recorded mapping.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-HOST-R005.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Landed: the typed approved-mapping model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "c7eda638d959"
      ],
      "verified_by": [
        "tests/mcp_server/test_legacy_action_mapping.py:17",
        "tests/mcp_server/test_legacy_action_mapping.py:28",
        "tests/mcp_server/test_legacy_action_mapping.py:35"
      ],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Landed: the typed approved-mapping model.** `graph_os/mcp_server/legacy_action_mapping.py` defines `APPROVED_ACTION_MAPPING`, `build_approved_action_mapping` and `validate_served_actions` (construction-time duplicate refusal, lookup-time unmapped-action refusal). `runtime.py` defines `served_legacy_actions_within_approved_mapping` over this table, but nothing calls it against the actual served MCP operation list yet. | Proven today by `tests/mcp_server/test_legacy_action_mapping.py`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-HOST-R005.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Parity test proves no served action is dropped",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "c7eda638d959"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Parity test proves no served action is dropped.** Rollup: the approved table covers six of the legacy host's actions; a parity test over the legacy host's full action surface fails today, so the table is extended per action family (`.2.1`-`.2.7`) and the parity test lands last (`.2.8`). Child slice of `GRAPHOS-HOST-R005`. | Satisfied when all `GRAPHOS-HOST-R005.2.n` children are verified.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 11
    },
    {
      "id": "GRAPHOS-HOST-R005.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Approved mapping for the analyze action family",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Approved mapping for the analyze action family.** Add an approved `ActionOperationMapping` entry for every legacy MCP action of `graph_analyze` and its REST twins (code_context, explain, process_writeback, blast_radius, call_graph and the rest), each naming the GraphOS registry operation that serves it, or record that none exists as a gap to build. Child slice of `GRAPHOS-HOST-R005.2`. | A test asserts every legacy action of the family appears in `APPROVED_ACTION_MAPPING` and that each mapped operation resolves in the GraphOS registry.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 12
    },
    {
      "id": "GRAPHOS-HOST-R005.2.1.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add graph-os operation for code navigation actions",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add graph-os operation for code navigation actions.** Gap: no registry operation serves legacy `code_context`, `explain`, `call_graph`, `routes`; add the operation(s) under `graph_os/api/ops/` and never invent an id before it exists. Child slice of `GRAPHOS-HOST-R005.2.1`. | Satisfied when the operation exists in the registry and a test bound to this ID proves it resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 13
    },
    {
      "id": "GRAPHOS-HOST-R005.2.1.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add graph-os operation for impact actions",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add graph-os operation for impact actions.** Gap: no registry operation serves legacy `blast_radius`, `change_coupling`; add it under `graph_os/api/ops/`. Child slice of `GRAPHOS-HOST-R005.2.1`. | Satisfied when the operation exists in the registry and a test bound to this ID proves it resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 14
    },
    {
      "id": "GRAPHOS-HOST-R005.2.1.3",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add graph-os operation for `similar_code` and the remaining `graph_analyze` actions",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add graph-os operation for `similar_code` and the remaining `graph_analyze` actions.** Gap: no registry operation serves `similar_code` or any other `graph_analyze` REST-twin action not listed in sibling children; enumerate them from the legacy tool, then add the operation(s). Child slice of `GRAPHOS-HOST-R005.2.1`. | Satisfied when the operation exists in the registry and a test bound to this ID proves it resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 15
    },
    {
      "id": "GRAPHOS-HOST-R005.2.1.4",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add graph-os operation for `process_writeback`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add graph-os operation for `process_writeback`.** Gap: no registry operation serves legacy `process_writeback` (the current table maps it to a non-registry id); add the operation and remap. Child slice of `GRAPHOS-HOST-R005.2.1`. | Satisfied when the operation exists in the registry and a test bound to this ID proves it resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 16
    },
    {
      "id": "GRAPHOS-HOST-R005.2.1.5",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Approve the analyze mappings",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Approve the analyze mappings.** Replace the analyze entries in `APPROVED_ACTION_MAPPING` with the real operation ids from the children above, then the whole family is covered. Child slice of `GRAPHOS-HOST-R005.2.1`. | A test bound to this ID asserts the listed actions appear in `APPROVED_ACTION_MAPPING` and that each mapped operation id is in `{op.id for op in operations()}` from `graph_os/api/ops/*.py`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 17
    },
    {
      "id": "GRAPHOS-HOST-R005.2.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Approved mapping for the configure action family",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Approved mapping for the configure action family.** Add an approved `ActionOperationMapping` entry for every legacy MCP action of `graph_configure`, `graph_config` and secret/hook/vault-sync actions, each naming the GraphOS registry operation that serves it, or record that none exists as a gap to build. Child slice of `GRAPHOS-HOST-R005.2`. | A test asserts every legacy action of the family appears in `APPROVED_ACTION_MAPPING` and that each mapped operation resolves in the GraphOS registry.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 18
    },
    {
      "id": "GRAPHOS-HOST-R005.2.3",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Approved mapping for the ingest action family",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Approved mapping for the ingest action family.** Add an approved `ActionOperationMapping` entry for every legacy MCP action of `graph_ingest`, `graph_jobs` and knowledge-pack/corpus/materialize actions, each naming the GraphOS registry operation that serves it, or record that none exists as a gap to build. Child slice of `GRAPHOS-HOST-R005.2`. | A test asserts every legacy action of the family appears in `APPROVED_ACTION_MAPPING` and that each mapped operation resolves in the GraphOS registry.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 19
    },
    {
      "id": "GRAPHOS-HOST-R005.2.3.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Map `sync` to `ingest.sources.sync`",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "567a2b417ed7"
      ],
      "verified_by": [
        "tests/mcp_server/test_legacy_action_mapping_ingest_sync.py:11"
      ],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Map `sync` to `ingest.sources.sync`.** The only legacy ingest action with an existing registry operation: add `ActionOperationMapping(\"sync\", \"ingest.sources.sync\")` with a bound resolution test. Child slice of `GRAPHOS-HOST-R005.2.3`. | Satisfied when the mapping is in the table and a bound test proves the id resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 20
    },
    {
      "id": "GRAPHOS-HOST-R005.2.3.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add graph-os operation for ingest submission actions",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add graph-os operation for ingest submission actions.** Gap: no registry operation serves legacy `ingest`, `ingest_url`, `ingest_knowledge_pack`, `fact_extract`, `distill`; add the operation(s) and remap the existing non-registry `ingest_knowledge_pack` entry. Child slice of `GRAPHOS-HOST-R005.2.3`. | Satisfied when the operation exists in the registry and a test bound to this ID proves it resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 21
    },
    {
      "id": "GRAPHOS-HOST-R005.2.3.3",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add graph-os operation for `backfill_platform_history` and `corpus`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add graph-os operation for `backfill_platform_history` and `corpus`.** Gap: no registry operation serves these legacy actions. Child slice of `GRAPHOS-HOST-R005.2.3`. | Satisfied when the operation exists in the registry and a test bound to this ID proves it resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 22
    },
    {
      "id": "GRAPHOS-HOST-R005.2.3.4",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add graph-os operation for job lifecycle actions",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add graph-os operation for job lifecycle actions.** Gap: no registry operation serves legacy `jobs`, `job_status`, `cancel`, `clear`, `prioritize`. Child slice of `GRAPHOS-HOST-R005.2.3`. | Satisfied when the operation exists in the registry and a test bound to this ID proves it resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 23
    },
    {
      "id": "GRAPHOS-HOST-R005.2.3.5",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add graph-os operation for `rebuild_indexes` and `observe`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add graph-os operation for `rebuild_indexes` and `observe`.** Gap: no registry operation serves these legacy actions. Child slice of `GRAPHOS-HOST-R005.2.3`. | Satisfied when the operation exists in the registry and a test bound to this ID proves it resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 24
    },
    {
      "id": "GRAPHOS-HOST-R005.2.3.6",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add graph-os operation for `materialize` and `materialize_source`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add graph-os operation for `materialize` and `materialize_source`.** Gap: no registry operation serves these legacy actions. Child slice of `GRAPHOS-HOST-R005.2.3`. | Satisfied when the operation exists in the registry and a test bound to this ID proves it resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 25
    },
    {
      "id": "GRAPHOS-HOST-R005.2.3.7",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add graph-os operation for `reflect` and `agent_toolkit`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add graph-os operation for `reflect` and `agent_toolkit`.** Gap: no registry operation serves these legacy actions. Child slice of `GRAPHOS-HOST-R005.2.3`. | Satisfied when the operation exists in the registry and a test bound to this ID proves it resolves.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 26
    },
    {
      "id": "GRAPHOS-HOST-R005.2.3.8",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Approve the ingest mappings",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Approve the ingest mappings.** Extend `APPROVED_ACTION_MAPPING` with every ingest action using the real ids from the children above, then the whole family is covered. Child slice of `GRAPHOS-HOST-R005.2.3`. | A test bound to this ID asserts the listed actions appear in `APPROVED_ACTION_MAPPING` and that each mapped operation id is in `{op.id for op in operations()}` from `graph_os/api/ops/*.py`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 27
    },
    {
      "id": "GRAPHOS-HOST-R005.2.4",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Approved mapping for the query-memory action family",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Approved mapping for the query-memory action family.** Add an approved `ActionOperationMapping` entry for every legacy MCP action of `graph_query`, `graph_memory` and `graph_write` memory/recall/SDD actions, each naming the GraphOS registry operation that serves it, or record that none exists as a gap to build. Child slice of `GRAPHOS-HOST-R005.2`. | A test asserts every legacy action of the family appears in `APPROVED_ACTION_MAPPING` and that each mapped operation resolves in the GraphOS registry.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 28
    },
    {
      "id": "GRAPHOS-HOST-R005.2.5",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Approved mapping for the orchestrate action family",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Approved mapping for the orchestrate action family.** Add an approved `ActionOperationMapping` entry for every legacy MCP action of `graph_orchestrate`, `graph_loops`, `graph_agents`, `graph_goals` and `graph_evolution` actions, each naming the GraphOS registry operation that serves it, or record that none exists as a gap to build. Child slice of `GRAPHOS-HOST-R005.2`. | A test asserts every legacy action of the family appears in `APPROVED_ACTION_MAPPING` and that each mapped operation resolves in the GraphOS registry.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 29
    },
    {
      "id": "GRAPHOS-HOST-R005.2.6",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Approved mapping for the mine-learn action family",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Approved mapping for the mine-learn action family.** Add an approved `ActionOperationMapping` entry for every legacy MCP action of `graph_mine`, `graph_mine_deep`, `graph_learn` and `graph_evaluate` actions, each naming the GraphOS registry operation that serves it, or record that none exists as a gap to build. Child slice of `GRAPHOS-HOST-R005.2`. | A test asserts every legacy action of the family appears in `APPROVED_ACTION_MAPPING` and that each mapped operation resolves in the GraphOS registry.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 30
    },
    {
      "id": "GRAPHOS-HOST-R005.2.7",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Approved mapping for the governance-ops action family",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Approved mapping for the governance-ops action family.** Add an approved `ActionOperationMapping` entry for every legacy MCP action of the remaining legacy tool families (`graph_audit`, `graph_governance`, `graph_compliance`, `graph_bus`, `graph_message`, `graph_ontology`, `graph_incident` and others), each naming the GraphOS registry operation that serves it, or record that none exists as a gap to build. Child slice of `GRAPHOS-HOST-R005.2`. | A test asserts every legacy action of the family appears in `APPROVED_ACTION_MAPPING` and that each mapped operation resolves in the GraphOS registry.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 31
    },
    {
      "id": "GRAPHOS-HOST-R005.2.8",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Parity test over the full legacy action surface",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Parity test over the full legacy action surface.** Add the parity test enumerating every action the legacy agent-runtime MCP host registers and asserting each is in `APPROVED_ACTION_MAPPING` with a resolvable operation; depends on `.2.1`-`.2.7`. Child slice of `GRAPHOS-HOST-R005.2`. | The parity test fails when any legacy action is removed from the mapping or its operation stops resolving.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 32
    },
    {
      "id": "GRAPHOS-HOST-R006",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "graph_os.fleet is the sole multiplexer and host owner",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "97b844e615b7"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**graph_os.fleet is the sole multiplexer and host owner.** GraphOS's `graph_os/fleet/` package is the sole multiplexer implementation and additionally hosts the OAuth broker, task-extension, principal, harness-server, middleware, skill-coverage and environment-drift-check modules that only GraphOS imports. | A package-layout test confirms the duplicate multiplexer no longer exists outside `graph_os/fleet/` and each moved module resolves only through GraphOS imports.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 33
    },
    {
      "id": "GRAPHOS-HOST-R007",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Agent runtime imported only through its public API",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "c467b28d2385"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Agent runtime imported only through its public API.** GraphOS imports the agent runtime exclusively through `agent_utilities.api`, with every other import site rewired to a GraphOS-owned module or the connector SDK's public interface, and `graph_os/tests/test_package_layout.py` enforces this as an `agent_utilities.api`-only fence. | The package-layout test fails on any import of an agent-runtime module outside `agent_utilities.api` and passes once the rewiring is complete.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 34
    },
    {
      "id": "GRAPHOS-HOST-R007.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Landed: none of the fence exists yet",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Landed: none of the fence exists yet.** `graph_os/tests/test_package_layout.py` does not exist; `graph_os/mcp_server/runtime.py` and other modules still import `agent_utilities.core.config`, `agent_utilities.security.*`, `agent_utilities.messaging.*`, `agent_utilities.usage.*` and `agent_utilities.observability.*` directly rather than through `agent_utilities.api`. | No test exists today; confirmed by `git grep -n \"^from agent_utilities\\.\" graph_os/`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 35
    },
    {
      "id": "GRAPHOS-HOST-R007.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add the import-fence test (rollup of `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.69`)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add the import-fence test (rollup of `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.69`).** Add `graph_os/tests/test_package_layout.py`, asserting via an import census over `graph_os/` that no module imports `agent_utilities` except through `agent_utilities.api` (an initial allowlist of today's known violations is acceptable so the test lands green, shrinking as each site is rewired). | `graph_os/tests/test_package_layout.py` exists, runs under `uv run pytest`, and fails if a new non-`agent_utilities.api` import is added outside the allowlist.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 36
    },
    {
      "id": "GRAPHOS-HOST-R007.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/a2a/authority.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/a2a/authority.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/a2a/authority.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 37
    },
    {
      "id": "GRAPHOS-HOST-R007.2.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/a2a/routing.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/a2a/routing.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/a2a/routing.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 38
    },
    {
      "id": "GRAPHOS-HOST-R007.2.3",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/access/service.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/access/service.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/access/service.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 39
    },
    {
      "id": "GRAPHOS-HOST-R007.2.4",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/agent_host/__init__.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/agent_host/__init__.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/agent_host/__init__.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 40
    },
    {
      "id": "GRAPHOS-HOST-R007.2.5",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/api/http/auth.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/api/http/auth.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/api/http/auth.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 41
    },
    {
      "id": "GRAPHOS-HOST-R007.2.6",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/api/mcp/serving.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/api/mcp/serving.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/api/mcp/serving.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 42
    },
    {
      "id": "GRAPHOS-HOST-R007.2.7",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/api/ops/access.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/api/ops/access.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/api/ops/access.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 43
    },
    {
      "id": "GRAPHOS-HOST-R007.2.8",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/api/policy/pdp_remote.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/api/policy/pdp_remote.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/api/policy/pdp_remote.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 44
    },
    {
      "id": "GRAPHOS-HOST-R007.2.9",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/browser_control/browser_control_binding.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/browser_control/browser_control_binding.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/browser_control/browser_control_binding.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 45
    },
    {
      "id": "GRAPHOS-HOST-R007.2.10",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/browser_control/browser_control_dispatch.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/browser_control/browser_control_dispatch.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/browser_control/browser_control_dispatch.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 46
    },
    {
      "id": "GRAPHOS-HOST-R007.2.11",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/browser_control/browser_control_durability.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/browser_control/browser_control_durability.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/browser_control/browser_control_durability.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 47
    },
    {
      "id": "GRAPHOS-HOST-R007.2.12",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/browser_control/browser_control_outcome.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/browser_control/browser_control_outcome.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/browser_control/browser_control_outcome.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 48
    },
    {
      "id": "GRAPHOS-HOST-R007.2.13",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/browser_control/browser_control_policy.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/browser_control/browser_control_policy.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/browser_control/browser_control_policy.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 49
    },
    {
      "id": "GRAPHOS-HOST-R007.2.14",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/browser_control/browser_control_provenance.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/browser_control/browser_control_provenance.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/browser_control/browser_control_provenance.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 50
    },
    {
      "id": "GRAPHOS-HOST-R007.2.15",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/browser_control/browser_control_service.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/browser_control/browser_control_service.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/browser_control/browser_control_service.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 51
    },
    {
      "id": "GRAPHOS-HOST-R007.2.16",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/browser_control/browser_control_state.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/browser_control/browser_control_state.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/browser_control/browser_control_state.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 52
    },
    {
      "id": "GRAPHOS-HOST-R007.2.17",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/browser_control/trace_bundle.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/browser_control/trace_bundle.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/browser_control/trace_bundle.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 53
    },
    {
      "id": "GRAPHOS-HOST-R007.2.18",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/cli.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/cli.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/cli.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 54
    },
    {
      "id": "GRAPHOS-HOST-R007.2.19",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/config_generator.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/config_generator.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/config_generator.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 55
    },
    {
      "id": "GRAPHOS-HOST-R007.2.20",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/doctor_certification.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/doctor_certification.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/doctor_certification.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 56
    },
    {
      "id": "GRAPHOS-HOST-R007.2.21",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/doctor_coverage.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/doctor_coverage.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/doctor_coverage.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 57
    },
    {
      "id": "GRAPHOS-HOST-R007.2.22",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/doctor_lakehouse.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/doctor_lakehouse.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/doctor_lakehouse.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 58
    },
    {
      "id": "GRAPHOS-HOST-R007.2.23",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/doctor_observability.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/doctor_observability.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/doctor_observability.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 59
    },
    {
      "id": "GRAPHOS-HOST-R007.2.24",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/doctor.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/doctor.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/doctor.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 60
    },
    {
      "id": "GRAPHOS-HOST-R007.2.25",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/genesis_environments.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/genesis_environments.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/genesis_environments.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 61
    },
    {
      "id": "GRAPHOS-HOST-R007.2.26",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/preflight.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/preflight.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/preflight.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 62
    },
    {
      "id": "GRAPHOS-HOST-R007.2.27",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/production_ops.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/production_ops.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/production_ops.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 63
    },
    {
      "id": "GRAPHOS-HOST-R007.2.28",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/release_canary.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/release_canary.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/release_canary.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 64
    },
    {
      "id": "GRAPHOS-HOST-R007.2.29",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/release_candidate.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/release_candidate.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/release_candidate.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 65
    },
    {
      "id": "GRAPHOS-HOST-R007.2.30",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/deployment/self_deploy.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/deployment/self_deploy.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/deployment/self_deploy.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 66
    },
    {
      "id": "GRAPHOS-HOST-R007.2.31",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/fleet/access_contracts.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/fleet/access_contracts.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/fleet/access_contracts.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 67
    },
    {
      "id": "GRAPHOS-HOST-R007.2.32",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/fleet/child_resilience.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/fleet/child_resilience.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/fleet/child_resilience.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 68
    },
    {
      "id": "GRAPHOS-HOST-R007.2.33",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/fleet/gateway_ops.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/fleet/gateway_ops.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/fleet/gateway_ops.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 69
    },
    {
      "id": "GRAPHOS-HOST-R007.2.34",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/fleet/local_skill_catalog.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/fleet/local_skill_catalog.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/fleet/local_skill_catalog.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 70
    },
    {
      "id": "GRAPHOS-HOST-R007.2.35",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/fleet/multiplexer.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/fleet/multiplexer.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/fleet/multiplexer.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 71
    },
    {
      "id": "GRAPHOS-HOST-R007.2.36",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/fleet/onboarding.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/fleet/onboarding.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/fleet/onboarding.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 72
    },
    {
      "id": "GRAPHOS-HOST-R007.2.37",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/aggregator.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/aggregator.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/aggregator.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 73
    },
    {
      "id": "GRAPHOS-HOST-R007.2.38",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/config.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/config.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/config.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 74
    },
    {
      "id": "GRAPHOS-HOST-R007.2.39",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/daemon.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/daemon.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/daemon.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 75
    },
    {
      "id": "GRAPHOS-HOST-R007.2.40",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/dashboard_api.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/dashboard_api.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/dashboard_api.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 76
    },
    {
      "id": "GRAPHOS-HOST-R007.2.41",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/fleet_events.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/fleet_events.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/fleet_events.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 77
    },
    {
      "id": "GRAPHOS-HOST-R007.2.42",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/fleet.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/fleet.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/fleet.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 78
    },
    {
      "id": "GRAPHOS-HOST-R007.2.43",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/graph_api.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/graph_api.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/graph_api.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 79
    },
    {
      "id": "GRAPHOS-HOST-R007.2.44",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/rate_limit.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/rate_limit.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/rate_limit.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 80
    },
    {
      "id": "GRAPHOS-HOST-R007.2.45",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/remote_oauth_api.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/remote_oauth_api.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/remote_oauth_api.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 81
    },
    {
      "id": "GRAPHOS-HOST-R007.2.46",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/schemas/graph_core.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/schemas/graph_core.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/schemas/graph_core.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 82
    },
    {
      "id": "GRAPHOS-HOST-R007.2.47",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/usage_api.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/usage_api.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/usage_api.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 83
    },
    {
      "id": "GRAPHOS-HOST-R007.2.48",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/widgets/base.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/widgets/base.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/widgets/base.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 84
    },
    {
      "id": "GRAPHOS-HOST-R007.2.49",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/widgets/ollama.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/widgets/ollama.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/widgets/ollama.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 85
    },
    {
      "id": "GRAPHOS-HOST-R007.2.50",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/gateway/widgets/vector_db.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/gateway/widgets/vector_db.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/gateway/widgets/vector_db.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 86
    },
    {
      "id": "GRAPHOS-HOST-R007.2.51",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/mcp_server/bootstrap.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/mcp_server/bootstrap.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/mcp_server/bootstrap.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 87
    },
    {
      "id": "GRAPHOS-HOST-R007.2.52",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/mcp_server/composition.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/mcp_server/composition.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/mcp_server/composition.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 88
    },
    {
      "id": "GRAPHOS-HOST-R007.2.53",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/mcp_server/decide_wiring.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/mcp_server/decide_wiring.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/mcp_server/decide_wiring.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 89
    },
    {
      "id": "GRAPHOS-HOST-R007.2.54",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/mcp_server/runtime.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/mcp_server/runtime.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/mcp_server/runtime.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 90
    },
    {
      "id": "GRAPHOS-HOST-R007.2.55",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/mcp_server/server.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/mcp_server/server.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/mcp_server/server.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 91
    },
    {
      "id": "GRAPHOS-HOST-R007.2.56",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/messaging/alert_intake.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/messaging/alert_intake.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/messaging/alert_intake.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 92
    },
    {
      "id": "GRAPHOS-HOST-R007.2.57",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/messaging/backends/mattermost.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/messaging/backends/mattermost.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/messaging/backends/mattermost.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 93
    },
    {
      "id": "GRAPHOS-HOST-R007.2.58",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/messaging/backends/telegram.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/messaging/backends/telegram.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/messaging/backends/telegram.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 94
    },
    {
      "id": "GRAPHOS-HOST-R007.2.59",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/messaging/governed_send.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/messaging/governed_send.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/messaging/governed_send.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 95
    },
    {
      "id": "GRAPHOS-HOST-R007.2.60",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/messaging/lease.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/messaging/lease.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/messaging/lease.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 96
    },
    {
      "id": "GRAPHOS-HOST-R007.2.61",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/messaging/polling.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/messaging/polling.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/messaging/polling.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 97
    },
    {
      "id": "GRAPHOS-HOST-R007.2.62",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/messaging/reach.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/messaging/reach.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/messaging/reach.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 98
    },
    {
      "id": "GRAPHOS-HOST-R007.2.63",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/messaging/registry.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/messaging/registry.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/messaging/registry.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 99
    },
    {
      "id": "GRAPHOS-HOST-R007.2.64",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/messaging/router.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/messaging/router.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/messaging/router.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 100
    },
    {
      "id": "GRAPHOS-HOST-R007.2.65",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/messaging/service.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/messaging/service.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/messaging/service.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 101
    },
    {
      "id": "GRAPHOS-HOST-R007.2.66",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/observability/gateway_health.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/observability/gateway_health.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/observability/gateway_health.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 102
    },
    {
      "id": "GRAPHOS-HOST-R007.2.67",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/semantic_content.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/semantic_content.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/semantic_content.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 103
    },
    {
      "id": "GRAPHOS-HOST-R007.2.68",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Rewire `graph_os/webui_host/webui_co_service.py` off agent-runtime internals",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Rewire `graph_os/webui_host/webui_co_service.py` off agent-runtime internals.** Child slice of `GRAPHOS-HOST-R007.2`. Every `agent_utilities` import in `graph_os/webui_host/webui_co_service.py` other than `agent_utilities.api` is rewired to a GraphOS-owned module, the connector SDK public interface, or `agent_utilities.api`; no allowlist entry. | A focused test for the module passes and a grep of the module shows no `agent_utilities` import outside `agent_utilities.api`.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 104
    },
    {
      "id": "GRAPHOS-HOST-R007.2.69",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add the `agent_utilities.api`-only import-fence test",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add the `agent_utilities.api`-only import-fence test.** Final child of `GRAPHOS-HOST-R007.2`, blocked until `GRAPHOS-HOST-R007.2.1` to `GRAPHOS-HOST-R007.2.68` land. `tests/test_package_layout.py` walks every `graph_os/**/*.py` AST and fails on any `agent_utilities` import other than `agent_utilities.api`, with no allowlist or baseline. | The fence test passes against the rewired tree and fails when a non-api `agent_utilities` import is injected into a fixture module.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 105
    },
    {
      "id": "GRAPHOS-HOST-R008",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "GraphOS hosts its own boundary modules",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "776ceb15e7ba",
        "a04f32a44865",
        "a727c1536f27",
        "b0cd6a8f01de",
        "d3ef338ca1e3"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**GraphOS hosts its own boundary modules.** GraphOS hosts its own security request-identity, error-surface, browser-auth and security-policy-middleware modules with their conformance tests; its own gateway and runtime health and metrics observability; its own profile-guard, install, release-channel, live-mount-guard, paths, workspace and config-admin core modules; its own hook-installer, agent-manager-dashboard, release-catalog and gateway-client modules; and its own connection-registry and engine-discovery modules under `graph_os.fleet`. | A package-layout census confirms these modules are imported only from their GraphOS location and the agent runtime no longer declares equivalents.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 106
    },
    {
      "id": "GRAPHOS-HOST-R009",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "GraphOS hosts the agent HTTP server and A2A endpoints",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "e5efd4f0ca33"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**GraphOS hosts the agent HTTP server and A2A endpoints.** GraphOS hosts the agent HTTP server under `graph_os/a2a/` and `graph_os/webui_host/`, including the A2A, A2A-config and A2A-graph-skill protocol modules migrated from the agent runtime; the duplicate broker and its separate task store are not ported, since durable task state has a single owner. The editor-facing Agent Client Protocol is provided by the agent runtime's harness integration, so GraphOS carries no ACP adapter of its own and mounts that implementation where a deployment exposes it. | Route and task-lifecycle tests cover the hosted A2A endpoints, and a source check confirms GraphOS contains no separate ACP adapter implementation.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 107
    },
    {
      "id": "GRAPHOS-HOST-R010",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "GraphOS owns hosting/deployment configuration settings",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "396d8307596f",
        "afc93c497524"
      ],
      "verified_by": [
        "tests/deployment/test_host_config.py:32",
        "tests/deployment/test_host_config.py:43"
      ],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**GraphOS owns hosting/deployment configuration settings.** GraphOS owns the hosting and deployment configuration settings split out of the agent runtime's monolithic configuration module, while connector base settings move to the connector SDK's own configuration module and agent/model settings remain with the agent runtime. | A configuration-schema test confirms GraphOS resolves its hosting and deployment settings from its own module. It must not import the agent runtime's configuration internals.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 108
    },
    {
      "id": "GRAPHOS-HOST-R011",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "GraphOS serves the messaging channel and routing layer",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "63a66f60915a",
        "afefd425c905",
        "bc2b6941077e",
        "c467b28d2385"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**GraphOS serves the messaging channel and routing layer.** GraphOS serves the messaging channel adapters, listener, service, daemon, polling, reaper and host routing for the agent bus, while the graph engine remains the sole authority for durable message append, reads, cursors, dead letters and depth. Superseded-by: the supervision-lifecycle detail (states, transitions, health-gated start, restart backoff bounds, stop/drain, typed degraded state for a missing adapter) is specified in [`GRAPHOS-MESSAGING-001`](../messaging-channel-supervision/spec.md) (`GRAPHOS-MESSAGING-R001`\u2013`R005`); this row's broader ownership claim is kept. | A served test exercises a messaging action through GraphOS and confirms the graph engine records the durable result exactly once.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 109
    },
    {
      "id": "GRAPHOS-HOST-R012",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Component registry carries GraphOS and SDK boundary entries",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "9760bef27075",
        "d75db1ea42e8",
        "e278fafd4073"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Component registry carries GraphOS and SDK boundary entries.** GraphOS publishes boundary seed entries for itself and the connector SDK in the architecture component registry. Each names its owning modules and public import surface. | A registry-completeness check confirms GraphOS and the connector SDK each have a registry entry with no coverage gap.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 110
    },
    {
      "id": "GRAPHOS-HOST-R013",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Front ends import only public GraphOS/agent-runtime surfaces",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4ca77fbff9e3"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Front ends import only public GraphOS/agent-runtime surfaces.** GraphOS's web UI package imports the agent runtime only through `agent_utilities.api`, directly from GraphOS, or from the graph engine's client library, with no import of an agent-runtime-internal module. | A package-layout test on the web UI package fails on any import outside these allowed surfaces.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 111
    },
    {
      "id": "GRAPHOS-HOST-R014",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Agent runtime split into connector SDK, GraphOS and engine",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "0062797e3c37",
        "91c0d96adb17",
        "f8d31551067c"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Agent runtime split into connector SDK, GraphOS and engine.** The former agent runtime is split into separately published repositories: the connector SDK, GraphOS, and the graph engine, each publishing its own installable package so GraphOS depends on the others only through their public APIs. | GraphOS's dependency manifest pins each split repository's published package rather than a path into the former combined source tree.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 112
    },
    {
      "id": "GRAPHOS-HOST-R015",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Layered agent capability model with a harness abstraction",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1f575184e8da"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Layered agent capability model with a harness abstraction.** GraphOS defines a layered agent-capability model, from its lowest to its highest defined layer, implemented over the graph engine, together with a harness abstraction that lets a given layer run under different execution environments. | A conformance test suite exercises each defined layer through the harness abstraction and confirms its expected behavior boundary.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 113
    },
    {
      "id": "GRAPHOS-HOST-R016",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "main branch includes the published dependency composition",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "20f773df9ddd"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**main branch includes the published dependency composition.** GraphOS's default branch history includes the published composition of the graph engine, connector SDK and agent runtime dependencies, so later changes build on that composition rather than reverting behind it. | A git ancestry check in continuous integration confirms the published composition commit remains reachable from the default branch.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 114
    },
    {
      "id": "GRAPHOS-HOST-R017",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Browser inventory lists native GraphOS tools",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "3b2c6ac9d864",
        "a4928a7047e1"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Browser inventory lists native GraphOS tools.** The WebUI inventory helper lists the native `graph-os` server from its registered tool surface. It never probes `graph-os` as a catalog child. | `tests/webui_host/test_native_mcp_delegation.py` lists the registered native tools and fails when a child probe runs.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 115
    },
    {
      "id": "GRAPHOS-HOST-R018",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Browser catalog reads run under the process authority",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "3b2c6ac9d864",
        "a4928a7047e1"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Browser catalog reads run under the process authority.** The enhanced catalog binds the GraphOS process session for each engine read. Its receipts name that process context. A failed read logs its cause before the masked 503. | `tests/gateway/test_enhanced_catalog_api.py` proves the read runs inside the process scope and logs the denial cause.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 116
    },
    {
      "id": "GRAPHOS-HOST-R019",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "GraphOS serves the service dashboard surface the web UI composes",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "975596a67ed0",
        "a504e36c3c7c"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**GraphOS serves the service dashboard surface the web UI composes.** GraphOS mounts `/api/dashboard/*` and the `/ws/dashboard` stream through its gateway route registrar. The routes run behind the same identity and web UI authorization middleware as other `/api` routes. The stream sends a snapshot, then periodic updates, and honors a `subscribe` message. | A route-mount test confirms `/api/dashboard/full`, `/health`, `/daemon/status`, `/daemon/shards` and `/ws/dashboard`. A stream test confirms snapshot, update and subscription scoping.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 117
    },
    {
      "id": "GRAPHOS-HOST-R020",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Serving start installs the decide consumers",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "91c0d96adb17",
        "c4e7f7197b78",
        "d7eb02776c45",
        "e96c8e3a5360"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Serving start installs the decide consumers.** GraphOS installs the library-bound assembler, the task planner and the cross-source report at serving start. The assembler and planner bind the bootstrap session's engine client. The cross-source report binds the fleet virtual catalog and an engine SPARQL ontology provider. A missing input logs a reason and skips that consumer. A fault never stops serving. | `tests/mcp_server/test_decide_wiring.py` proves all three installs with fakes. It proves each guarded skip.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 118
    },
    {
      "id": "GRAPHOS-HOST-R021",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Serving start binds the assembler's commit and publish providers and installs the topology asker",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "117301017944",
        "e67f069a9ed4"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Serving start binds the assembler's commit and publish providers and installs the topology asker.** GraphOS mints an `AgentLibraryMutationContext` from the verified bootstrap session's identity and tenant, and binds it as the assembler's `commit_context` and `publish_context` (AU `agent_utilities.decide.consumers.assembly`, mapping to EG's `DecisionCommit` and `AgentGraph.publish`, EG-DECISION-ENGINE-R047/R051). Serving start also installs the topology asker over the published reference templates, the same way it installs the task planner. A missing input logs a reason and skips that consumer. | `tests/mcp_server/test_decide_wiring.py` proves the topology asker installs alongside the planner, and proves a solved assembly commits and publishes through a fake engine client that records each call.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 119
    },
    {
      "id": "GRAPHOS-HOST-R022",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Serving start binds the task planner's capability-search, guardrail and workflow lookups",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "af5f5c292007",
        "e67f069a9ed4"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Serving start binds the task planner's capability-search, guardrail and workflow lookups.** GraphOS binds the planner's `capability_search` to the served EG agent-card search, `guardrail_source` to one side-effect-free AU action-policy verdict per planned task, and `workflows` to the registered graph-workflow store's semantic match over the planned tasks (AU `agent_utilities.decide.consumers.task_planner`, `agent_utilities.layers.clients.AgentClient`, `agent_utilities.orchestration.action_policy`, `agent_utilities.knowledge_graph.workflow_store`). A missing input logs a reason and skips that consumer. | `tests/mcp_server/test_decide_wiring.py` proves the three lookups are bound at serving start, and proves a planned task gets non-empty assembled agent skills and tools with a fake capability source populating its reuse metadata.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 120
    },
    {
      "id": "GRAPHOS-HOST-R023",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "GraphOS serves its eight-tool MCP intent surface from its own operation registry",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "c39349d16c53"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**GraphOS serves its eight-tool MCP intent surface from its own operation registry.** `graph_os/api/mcp` serves `ask`, `find`, `why`, `write`, `act`, `manage` and the two MCP Apps launchers (`graph_task_progress_app`, `graph_trace_waterfall_app`) itself: ranking and its deterministic tie-break, fleet discovery merged into `find`, a fleet child call through `act`, and a natural-language `ask` fallback when no registry operation matches, all live in GraphOS rather than in the agent runtime. The agent runtime serves no MCP tools; it supplies only the library registrar GraphOS calls for the two app-launcher tools. | A tool-list parity test registers the surface on a real `FastMCP` instance and confirms the same eight names the agent runtime previously served. A second test dispatches one operation through the real invocation pipeline (policy/Eunomia included), and a third proves the natural-language `ask` fallback is reached only when no operation matches.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 121
    },
    {
      "id": "GRAPHOS-HOST-R024",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "`graph_os.mcp_server.server` registers GraphOS's own intent surface, not the agent runtime's",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c39349d16c53"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**`graph_os.mcp_server.server` registers GraphOS's own intent surface, not the agent runtime's.** Serving start calls `graph_os.api.mcp.serving.register_intent_surface` instead of the agent runtime's `agent_utilities.mcp.graphos_surface.register_graphos_surface`/backing-server path. | `python3 scripts/check_wiring.py unreachable` lists fewer unreached `graph_os.api.{mcp,invoke,ops,policy}` modules after this change than before it; the exact before/after counts are recorded as PR evidence.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 122
    },
    {
      "id": "GRAPHOS-HOST-R025",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "The agent runtime's MCP serving stack is removed",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c39349d16c53"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**The agent runtime's MCP serving stack is removed.** Once `GRAPHOS-HOST-R024` lands, the agent runtime deletes `agent_utilities/mcp/tools/intent_tools.py`, `agent_utilities/mcp/graphos_surface.py`, and the `kg_server` MCP serving entry point that only GraphOS called; the library functions those modules called (the harness, the control plane and the KG clients) are retained and stay reachable from GraphOS's own registry operations. | A grep-based import census over GraphOS confirms no remaining import of the deleted modules, and the agent runtime's test suite passes with them absent.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 123
    },
    {
      "id": "GRAPHOS-HOST-R026",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Durable A2A task persistence in the graph-os agent host",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "8d1bc46ecbdb"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Durable A2A task persistence in the graph-os agent host.** Rollup of `GRAPHOS-HOST-R026.1` to `.5`; unblocks `AU-BOUNDARY-R015.2`. | All child rows are verified.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 124
    },
    {
      "id": "GRAPHOS-HOST-R026.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Define the typed A2A task-store port",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Define the typed A2A task-store port.** Add `A2ATaskStore` Protocol (get, put, list, cancel by tenant and principal) in `graph_os/a2a/task_store.py`. Unblocks `AU-BOUNDARY-R015.2` (replaces AU `protocols/a2a_epistemic.py`). | A type-check test confirms a fake store satisfies the Protocol.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 125
    },
    {
      "id": "GRAPHOS-HOST-R026.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Implement the engine-backed A2A task store",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Implement the engine-backed A2A task store.** Add `EngineA2ATaskStore` implementing `A2ATaskStore` over the public engine client, with no second task store. Unblocks `AU-BOUNDARY-R015.2`. | A focused test persists and reloads a task through a stubbed engine client.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 126
    },
    {
      "id": "GRAPHOS-HOST-R026.3",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Wire the hosted A2A app to the task store, fail-closed when absent",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Wire the hosted A2A app to the task store, fail-closed when absent.** The hosted A2A app in `graph_os/a2a/` takes the `A2ATaskStore` at composition and refuses task methods with a typed error when none is bound. Unblocks `AU-BOUNDARY-R015.2`. | A test confirms task submit is refused with no store and succeeds with one.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 127
    },
    {
      "id": "GRAPHOS-HOST-R026.4",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add the doctor check for A2A task persistence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add the doctor check for A2A task persistence.** Add a graph-os doctor check `a2a_persistence` reporting whether the task store is bound and durable, replacing AU's check of the same name. Unblocks `AU-BOUNDARY-R015.2`. | A doctor test reports failure with no store and pass with the engine-backed store.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 128
    },
    {
      "id": "GRAPHOS-HOST-R026.5",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Point the `g34-a2a` certification gate at graph-os tests",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Point the `g34-a2a` certification gate at graph-os tests.** The `g34-a2a` gate runs graph-os `tests/a2a/` task-persistence tests instead of AU's. Unblocks `AU-BOUNDARY-R015.2`. | The gate definition names graph-os test paths and passes on main.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 129
    },
    {
      "id": "GRAPHOS-HOST-R027",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Loopback OIDC authority for skill certification",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Loopback OIDC authority for skill certification.** Rollup of `GRAPHOS-HOST-R027.1` to `.3`; unblocks `AU-BOUNDARY-R002.3.1`. | All child rows are verified.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 130
    },
    {
      "id": "GRAPHOS-HOST-R027.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add the loopback OIDC authority owner module for skill certification",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add the loopback OIDC authority owner module for skill certification.** Add `graph_os/certification/oidc.py` serving loopback-only OIDC discovery, JWKS and token endpoint, replacing AU `deployment/certification_oidc.py`. Unblocks `AU-BOUNDARY-R002.3.1`. | A test confirms discovery and JWKS respond on loopback and the module refuses a non-loopback bind.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 131
    },
    {
      "id": "GRAPHOS-HOST-R027.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add the loopback OIDC authority test fixture",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add the loopback OIDC authority test fixture.** Add a pytest fixture in `tests/certification/conftest.py` that starts and stops the authority and mints a signed token. Unblocks `AU-BOUNDARY-R002.3.1`. | A test uses the fixture to mint a token that verifies against the served JWKS.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 132
    },
    {
      "id": "GRAPHOS-HOST-R027.3",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Add the loopback OIDC authority script",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Add the loopback OIDC authority script.** Add `scripts/certification_oidc.py` launching the owner module for skill certification runs. Unblocks `AU-BOUNDARY-R002.3.1`. | The script starts, serves discovery, and exits cleanly on signal in a test.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 133
    },
    {
      "id": "GRAPHOS-HOST-R028",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Bump the pinned agent-utilities source for the new `agent_utilities.api.*` export modules",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Bump the pinned agent-utilities source for the new `agent_utilities.api.*` export modules.** Advance the agent-utilities ref in `.github/workflows/release.yml` and the uv sources and lock so `persistence_privacy`, `orchestration`, `work_durability`, `agent_dispatch`, `trace_ontology`, `action_policy` and `elevation` import. Unblocks `GRAPHOS-HOST-R007.2.1`, `GRAPHOS-HOST-R007.2.2` and `GRAPHOS-HOST-R007.2.3`. | A test imports each of the seven `agent_utilities.api` modules and the lock and release pins name one ref.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 134
    },
    {
      "id": "GRAPHOS-HOST-R029",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Tenant-bound native desktop actions",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Tenant-bound native desktop actions.** Require a verified caller's tenant-bound sandbox grant. Background click, type, and verification cannot capture or change cursor/focus. Attach through `graph_os/api/invoke/pipeline.py:invoke` and `graph_os/api/invoke/executor.py:BoundOperationRuntime.dispatch` (line 273). `OperationRuntime.dispatch` is only a protocol. The SDK native-desktop port/provider contract is missing. Keep this capability unavailable until that owner contract is published. | Future acceptance: `tests/api/test_agent_browser_ops.py::test_native_desktop_actions_require_verified_grant_without_focus_capture`. Compose the runtime and invoke through the real pipeline and `BoundOperationRuntime.dispatch`. Verify valid grants reach the provider with request-bound verification. Missing, revoked, or cross-tenant grants must refuse before provider calls. Confirm cursor and focus remain unchanged. The proposed test has not run.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 135
    },
    {
      "id": "GRAPHOS-HOST-R030",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Run-bound visual state",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Run-bound visual state.** Preserve source/frame/revision provenance for each typed observation within a run. Bind reusable perception state to identity, tenant scope, lifetime, invalidation, and retention rules. Later spatial steps consume prior state. Stale or cross-tenant state refuses before dispatch. Attach at `graph_os/api/invoke/pipeline.py:invoke` and real `graph_os/api/invoke/executor.py:BoundOperationRuntime.dispatch` (line 273); `OperationRuntime.dispatch` is only a protocol. The SDK observation producer and EG state/context contracts remain unassigned. Do not add a local state store. | Future acceptance: `tests/api/test_agent_browser_ops.py::test_visual_state_is_run_source_and_tenant_bound`. Compose the runtime and traverse the real pipeline and `BoundOperationRuntime.dispatch`. Verify sequential reuse within one run and source/frame/revision provenance. Verify invalidation after expiry or source change. Cross-tenant or stale state must refuse before dispatch. The proposed test has not run.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 136
    },
    {
      "id": "GRAPHOS-HOST-R031",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Coding-agent discovery and sandbox handoff",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Coding-agent discovery and sandbox handoff.** Discover coding agents on `PATH`. Apply the EG-selected skill transformation through the AU harness. Render generated artifacts only in the WebUI sandboxed frame. GraphOS owns the host/admission boundary at `graph_os/mcp_server/server.py:mcp_server`. EG, AU, and WebUI producer/consumer contracts remain unbound. Keep the complete flow unavailable until those owner ports are published. | Future acceptance: `tests/mcp_server/test_composition.py::test_coding_agent_flow_uses_owner_ports_and_sandbox`. Verify discovery identifies the selected executable. Verify the AU harness receives the EG-selected transformation. Verify WebUI renders only generated artifacts in its sandbox. Missing owner contracts or unavailable executables must refuse without dispatch or rendering. The proposed test has not run.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 137
    },
    {
      "id": "GRAPHOS-HOST-R010.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Preserve configuration ownership",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Preserve configuration ownership.** Model: Hosting and deployment settings retain their current owner. Behavior: Preserve every original R010 boundary, including connector and model configuration ownership. Wiring: Reuse `graph_os/core/config_admin.py:51`; import only public owner contracts. Refusal: No runtime configuration internals may become a host dependency. Evidence: Retain the original configuration-schema acceptance alongside the new startup cases. | The original R010 schema test remains required. A forbidden private import fails the boundary check.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 138
    },
    {
      "id": "GRAPHOS-HOST-R010.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Declare every consumed environment name",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Declare every consumed environment name.** Model: `HostEnvironmentManifest` contains version, component, source revision and uniquely named declarations. Behavior: Each declaration records type, required condition, default, sensitivity and consuming call sites. Include indirect library reads. Wiring: Extend the existing configuration loader; compose public SDK and agent-runtime declarations without copying their settings. Refusal: Undeclared reads, conflicting declarations and unavailable enabled-component manifests prevent startup. Evidence: Record the manifest digest and missing declaration names without values. | A census matches all consumed names to declarations. Inject a dynamic undeclared read and require a named startup refusal.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 139
    },
    {
      "id": "GRAPHOS-HOST-R010.3",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Validate before any service starts",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Validate before any service starts.** Model: `HostStartupConfiguration` binds the manifest digest, selected components and resolved typed settings. Behavior: Resolve existing configuration precedence once, then validate every enabled component before opening listeners or starting children. Wiring: Attach validation before `runtime._build_server` in `graph_os/mcp_server/server.py:164`. Refusal: Missing required or malformed values refuse with component, variable name and reason; never include the value. Evidence: Record the configuration digest and zero listener, child-process and deployment effects on refusal. | The real launcher accepts valid configuration. Missing values, malformed ports and unknown profiles produce named refusals before any start.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 140
    },
    {
      "id": "GRAPHOS-HOST-R010.4",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Keep conditional configuration precise",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Keep conditional configuration precise.** Model: Declarations distinguish required, optional and conditionally required values. Behavior: Validate enabled dependencies and explicit defaults. An unrelated disabled component does not require credentials. Wiring: Use the selected component plan and the existing configuration resolver; no ambient environment grants authority. Refusal: An unresolved condition or invalid default refuses rather than silently choosing another profile. Evidence: Record each selected condition and default identifier without secret material. | Enable and disable a controlled component. Its missing credential refuses only when required; an invalid default always refuses.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 141
    },
    {
      "id": "GRAPHOS-HOST-R010.5",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Bind environment guidance to declarations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Bind environment guidance to declarations.** Model: A declaration digest binds the server configuration example and both transport examples. Behavior: Generate example names from the same manifest; document defaults and required conditions with secret placeholders. Wiring: Use GRAPHOS-DEPLOY-R010 guidance checks for the skill, README and documentation. Refusal: A consumed name missing from configuration or examples fails conformance. Evidence: Record manifest and example digests, never live configuration. | Parse both documented transport configurations and compare their names with the manifest. Inject an omitted name and require failure.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 142
    },
    {
      "id": "GRAPHOS-HOST-R010.6",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Prove startup validation through the launcher",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Prove startup validation through the launcher.** Model: An isolated process fixture records sockets, child starts and safe diagnostics. Behavior: Exercise real startup with valid settings and every refusal class before accepting traffic. Wiring: Proposed `tests/host/test_launch_configuration_served.py` invokes the installed GraphOS launcher with controlled dependencies. Refusal: A helper-only test cannot establish startup ordering or complete consumed-name coverage. Evidence: Bind source revision, manifest digest, process exit, observation counts and redacted diagnostics. | Repeat valid and invalid runs after restart. A refused start starts zero children and opens zero listeners; valid startup serves a probe.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 143
    },
    {
      "id": "GRAPHOS-HOST-R008.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Preserve every boundary module",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Preserve every boundary module.** Model: The original parent remains the complete contract. Behavior: Preserve all R008 security, gateway, observability, core, installer, dashboard, catalog, registry and discovery ownership obligations. Wiring: Use the original package-layout census across every module named by R008. Refusal: New child evidence cannot replace any original acceptance obligation. Evidence: Retain the original parent receipts and require its complete acceptance. | The original census proves every named module has its GraphOS owner and no agent-runtime equivalent remains.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 144
    },
    {
      "id": "GRAPHOS-HOST-R008.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Detect installed harnesses without effects",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Detect installed harnesses without effects.** Model: `HarnessInstallation` binds adapter ID, supported version, detected executable, configuration root and detection evidence. Behavior: Inspect supported local installation markers before preparing any tool, instruction or hook change. Wiring: Extend `deployment/cli.py:134` and its existing registration path; generic detection adapters are missing. Refusal: Ambiguous roots, unsupported versions and unknown adapters refuse; an absent harness creates no files. Evidence: Return the detected set and reasoned refusals without private file contents. | Run the installer against mixed present, absent and malformed harness fixtures. Absent roots and existing unrelated bytes remain unchanged.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 145
    },
    {
      "id": "GRAPHOS-HOST-R008.3",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Bind exact harness configuration changes",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Bind exact harness configuration changes.** Model: `HarnessConfigurationChange` binds detected installation, before digest, proposed digest, managed keys and authorized destination. Behavior: Prepare tool entries, instruction sections and supported pre-tool hooks for each detected harness. Wiring: Reuse the existing registration command; add versioned format adapters behind the same installer boundary. Refusal: An unsupported hook capability is reported explicitly. It never causes a fabricated hook or another harness format. Evidence: The reviewable change lists each supported artifact and each unsupported capability. | Invoke the installer for a supported fixture and parse all three artifacts. An unsupported hook reports its limitation without a hook file.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 146
    },
    {
      "id": "GRAPHOS-HOST-R008.4",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Apply harness edits without overwriting unrelated content",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Apply harness edits without overwriting unrelated content.** Model: Each managed artifact retains its original digest and configuration ownership marker. Behavior: Validate every destination before mutation; conditionally replace only the reviewed managed sections. Repeated identical installation changes no bytes. Wiring: The GraphOS installer owns local configuration edits; governed remote source changes remain SDK effects. Refusal: Changed bases, symlink escapes, malformed configuration and conflicting keys refuse before replacing that artifact. Evidence: Record actual before and after digests, including partial outcomes after an interrupted multi-file application. | Seed unrelated keys and instructions. Check preservation, idempotence, stale-base refusal and recovery without falsely reporting all artifacts installed.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 147
    },
    {
      "id": "GRAPHOS-HOST-R008.5",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Prove detected-harness installation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Prove detected-harness installation.** Model: An isolated home contains two supported installations and one absent harness. Behavior: Run the actual installer, then use each harness configuration parser and controlled hook invocation. Wiring: Proposed `tests/deployment/test_harness_install_served.py` enters the installed configuration command. Refusal: Helper-only detection and successful file writes do not prove valid tool entries or executable hook configuration. Evidence: Record detected versions, parsed configuration, hook observations and untouched-file digests. | Discover the configured MCP tool through a real client. Prove valid instructions and hook dispatch; absent harnesses receive zero writes.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 148
    },
    {
      "id": "GRAPHOS-HOST-R009.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Preserve hosted protocols and task authority",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Preserve hosted protocols and task authority.** Model: The original parent remains the complete contract. Behavior: Retain HTTP and all original A2A protocol migration, task-lifecycle and externally owned ACP obligations. Add no broker or task store. Wiring: Keep the original route and task-lifecycle tests plus the ACP source census. Refusal: New child evidence cannot replace any original acceptance obligation. Evidence: Retain the original parent receipts and require its complete acceptance. | The complete original R009 acceptance remains required alongside terminal start and log acceptance.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 149
    },
    {
      "id": "GRAPHOS-HOST-R010.7",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Select terminal web or combined start",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Select terminal web or combined start.** Model: `HostLaunchRequest` carries schema version, workspace, interface selection and log-view preference. Behavior: `--terminal` selects terminal mode; `--web` selects web mode; both select both. Keep existing behavior when neither appears. Wiring: Extend `agent_host/__init__.py:192` and the owning start parser; a public terminal-client adapter is a prerequisite. Refusal: Unknown modes, missing requested clients and invalid workspace bindings refuse before host startup. No `--cli` alias is introduced. Evidence: Record selected interfaces, host instance, workspace binding and actual client readiness. Additional binding: Resolve the effective web_logs boolean before the authenticated R009.5 handoff to run_host_terminal and HostLogReader.read under TUI-RUNTIME-R002.2 through R002.4. Bind host, workspace, tenant and principal. Disabled logs and every web-only case make zero TUI reads without disabling the host sink. Missing runtime preference binding cannot claim log readiness. | Start terminal, web and both through the real command. Observe the requested clients only; missing terminal support yields a typed refusal.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 150
    },
    {
      "id": "GRAPHOS-HOST-R009.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Run terminal-mode HTTP in a supervised background thread",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Run terminal-mode HTTP in a supervised background thread.** Model: `HostLaunchReceipt` binds host instance, checked session, HTTP endpoint and selected client interfaces. Behavior: Terminal mode keeps HTTP serving in a background thread while the terminal client owns foreground interaction. Wiring: Reuse `CoServiceSupervisor.start_service` and `run_web_ui`; adapt `create_agent_server` instead of creating another host lifecycle. Refusal: Failed binding, absent authority or duplicate host identity refuses startup; never start another engine or multiplexer. Evidence: Record thread identity, readiness probe and the single shared authority identity. | During foreground terminal interaction, probe real HTTP and observe a distinct serving thread with exactly one engine authority.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 151
    },
    {
      "id": "GRAPHOS-HOST-R009.3",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Project scoped workspace logs",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Project scoped workspace logs.** Model: `HostLogRecord` binds host, workspace, tenant, request, sequence, timestamp, severity and redacted message. Behavior: Write host logs to `agent_data/logs/server.log` below the authorized workspace. Keep terminal rendering and stdio protocol output clean. Wiring: Attach bounded logging before the background service starts. Pass only tenant-exclusive descriptor contents or an authenticated tenant-filtered stream/reference to the terminal adapter. Never expose a shared log descriptor. Refusal: Path escape, another tenant, unsafe file ownership and unreadable required logging destinations refuse without leaking records. Evidence: Record safe log-reference identity, rotation generation and delivery gaps; never credentials or raw request bodies. | Serve a request and read its correlated record from the workspace log. Two tenants sharing one workspace receive only their own records. Forged references and shared descriptors refuse; injected secrets remain absent.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 152
    },
    {
      "id": "GRAPHOS-HOST-R009.4",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Bound log delivery and shutdown",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Bound log delivery and shutdown.** Model: Log references include generation and sequence; start receipts include lifecycle ownership. Behavior: Rotate bounded files, report overwritten ranges, drain on exit and stop only resources owned by this start. Wiring: Extend `CoServiceSupervisor` shutdown and the existing HTTP stop event; keep one MCP owner loop. Refusal: A stalled reader cannot block serving. Missing retained history returns an explicit gap instead of fabricated continuity. Evidence: Record last retained sequence, stopped thread identity and surviving reused-resource identity. | Overflow a bounded fixture, reconnect its reader, and require a gap. Terminal exit stops the owned HTTP thread and preserves reused services.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 153
    },
    {
      "id": "GRAPHOS-HOST-R009.5",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Publish the terminal log-consumer handoff",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Publish the terminal log-consumer handoff.** Model: `HostLaunchReceipt` carries the authorized log reference, endpoint and workspace binding for one terminal client. Behavior: The terminal client must combine agent interaction and host log viewing through its public interface. Wiring: Require an exact agent-terminal-ui owning requirement and adapter before claiming the complete user journey. Refusal: Unavailable client rendering refuses the requested capability; a host log file alone cannot establish unified terminal viewing. Evidence: Bind host records to actual client observations without implementing terminal widgets in GraphOS. Additional binding: Require the authenticated effective HostLaunchReceipt.web_logs boolean, bound to host, workspace, tenant, principal and session with generation and expiry. Wire agent_terminal_ui.app.run_host_terminal and agent_terminal_ui.client.HostLogReader.read under TUI-RUNTIME-R002.2 through R002.5. Missing runtime fields or consumer exports remain prerequisites; invalid or disabled handoffs cause zero reads while preserving agent interaction and the required redacted sink. | A real terminal client shows a correlated HTTP request log during an interaction. Missing client support leaves this journey unfulfilled.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 154
    },
    {
      "id": "GRAPHOS-HOST-R009.6",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Prove start and logs through real processes",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Prove start and logs through real processes.** Model: A disposable workspace and controlled terminal client observe host processes, threads and logs. Behavior: Exercise each selected interface, HTTP request, log rotation, restart and clean termination. Wiring: Proposed `tests/host/test_terminal_host_served.py` invokes the real agent host and its public client adapter. Refusal: Missing client contracts or successful helper calls do not establish the complete served journey. Evidence: Record actual endpoint responses, thread IDs, workspace digests, log sequences and engine start counts. Additional binding: Enter run_host_terminal and HostLogReader.read under TUI-RUNTIME-R002.6. Exercise terminal, web and both with authenticated web_logs true and false. Only terminal/both with true may read. Missing preference, reader or authority and changed scope cause zero reads; agent interaction and the required host sink remain available. Bind producer and consumer revisions in future evidence. | Combined mode serves HTTP while the terminal receives scoped logs. Denied workspace and missing client cases have zero unauthorized starts.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 155
    },
    {
      "id": "GRAPHOS-HOST-R006.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Preserve the sole multiplexer owner",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Preserve the sole multiplexer owner.** Model: The original parent remains the complete contract. Behavior: Retain every original R006 ownership clause, including all additional hosted modules and the absence of duplicate multiplexers. Wiring: Reuse the original package-layout test and the single serving lifecycle. Refusal: New child evidence cannot replace any original acceptance obligation. Evidence: Retain the original parent receipts and require its complete acceptance. | The original full module census passes; transport conformance alone cannot establish module ownership.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 156
    },
    {
      "id": "GRAPHOS-HOST-R006.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Use one standard transport scaffold",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Use one standard transport scaffold.** Model: `HostTransportConfiguration` declares stdio or streamable HTTP with explicit host, port and security settings. Behavior: Serve both modes through the same GraphOS entrypoint and one multiplexer; reject unsupported arguments consistently. Wiring: Reuse `mcp_server/server.py:164` and `runtime._build_server:2208`; retire private factory coupling under existing R007 obligations. Refusal: Invalid transport or missing required network identity refuses before serving. Diagnostic output never corrupts stdio frames. Evidence: Record transport, schema generation, registered tool digest and one multiplexer instance. | A real MCP client initializes both modes and calls one admitted operation. Malformed options and unauthorized HTTP requests refuse.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 157
    },
    {
      "id": "GRAPHOS-HOST-R023.1",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Preserve the entire intent surface",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Preserve the entire intent surface.** Model: The original parent remains the complete contract. Behavior: Keep all eight original tools, ranking tie-breaks, fleet discovery and calls, fallback behavior and public registrar ownership. Wiring: Reuse the original FastMCP parity, invoke-policy and natural-language fallback acceptance. Refusal: New child evidence cannot replace any original acceptance obligation. Evidence: Retain the original parent receipts and require its complete acceptance. | All original R023 cases remain required, including the unmatched-operation fallback and registry ownership boundaries.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 158
    },
    {
      "id": "GRAPHOS-HOST-R023.2",
      "kind": "requirement",
      "parent": "GRAPHOS-HOST",
      "source": "specs/host-composition-boundary/status.json",
      "title": "Prove transport parity on the served surface",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-HOST \u2014 GraphOS host composition and ownership boundary",
      "definition": "**Prove transport parity on the served surface.** Model: The same registry generation binds both transport sessions and their tool schemas. Behavior: Compare normalized tool names and schemas, then dispatch through the existing invocation pipeline. Wiring: Use the real `graph_os.api.mcp` registration from the production server for both clients. Refusal: A missing intent tool, divergent schema or bypassed policy fails conformance. Evidence: Record both served catalogs and positive and negative invocation receipts. | Both transports expose the same eight tools. Each permits one scoped call and refuses an unauthorized call before downstream effects.",
      "definition_source": "specs/host-composition-boundary/requirements.md",
      "definition_line": 159
    },
    {
      "id": "GRAPHOS-OPS",
      "kind": "spec",
      "parent": null,
      "source": "specs/hosted-api-operations/status.json",
      "title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/hosted-api-operations/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/invoke/bootstrap.py:167",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/invoke/bootstrap.py#L167"
        },
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/invoke/pipeline.py:810",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/invoke/pipeline.py#L810"
        },
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/ops/memory.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/ops/memory.py"
        },
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/ops/registry_factory.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/ops/registry_factory.py"
        },
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/ops/retrieval.py:81",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/ops/retrieval.py#L81"
        },
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/policy/domain_scopes.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/policy/domain_scopes.py"
        },
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/registry/scopes.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/registry/scopes.py"
        },
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/gateway/dashboard_api.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/gateway/dashboard_api.py"
        },
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/gateway/registry.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/gateway/registry.py"
        },
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "spec",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/hosted-api-operations/spec.md"
        },
        {
          "declared_in": "specs/hosted-api-operations/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/api/test_registry_factory.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/tests/api/test_registry_factory.py"
        },
        {
          "declared_in": "specs/hosted-api-operations/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/hosted-api-operations/requirements.md"
        },
        {
          "declared_in": "specs/hosted-api-operations/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "test-spec.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/hosted-api-operations/test-spec.md"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/hosted-api-operations/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "A2A task projection",
          "repository": "Knuckles-Team/graph-os",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/a2a/spec.md"
        }
      ],
      "plan_diagrams": [
        "flowchart LR\n  C[MCP / HTTP / A2A / fleet forwarder] --> S[verified surface adapter]\n  S --> I[\"invoke: validate, scopes, policy, subject, effect, audit\"]\n  I --> R[one typed operation registry]\n  I --> E[engine client under caller claims]\n  I --> A[agent service via public port]\n  I --> F[fleet gateway under caller credential]\n  I --> D[durable audit and plan lease]\n  R --> G[\"generated OpenAPI, schemas and clients\"]\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-OPS-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Native MCP/REST facade with A2A unary operations then streaming",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "deb2b45bf83d"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Native MCP/REST facade with A2A unary operations then streaming.** GraphOS provides a native MCP and REST host. It fronts the engine and agent-utilities services. It first exposes unary A2A operations: card, send, get, list, and cancel. It then adds durable streaming to those same handlers. | Integration tests exercise the A2A unary endpoints against a fixture engine, followed by a separate test proving durable streaming delivery.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-OPS-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Scoped A2A task routing and fleet tool exposure",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "20f773df9ddd"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Scoped A2A task routing and fleet tool exposure.** GraphOS routes inbound A2A tasks to the correct operation handler and exposes, through its assembled multiplexer, only the caller-authorized subset of fleet tools, including typed work-item retrieval and listing bound by control leases and read classifications. | Integration tests assert inbound A2A tasks resolve to the correct handler and that multiplexer tool listings are filtered per caller.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-OPS-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Remove multiplexer skill/prompt harvest path",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "deb2b45bf83d"
      ],
      "verified_by": [
        "tests/fleet/test_no_duplicate_skill_prompt_harvest.py:59"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Remove multiplexer skill/prompt harvest path.** GraphOS removes the multiplexer's legacy skill and prompt harvesting and static hydration code path. GraphOS sources skills and prompts only through the fleet discovery surface. | A regression test confirms the retired harvest module is absent and unimportable at runtime.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-OPS-R004",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "FastMCP 4 bridge for the MCP server",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a7947166d00a",
        "b5bf4ba58902"
      ],
      "verified_by": [
        "tests/deployment/test_release_canary.py:63",
        "tests/deployment/test_release_canary.py:94"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**FastMCP 4 bridge for the MCP server.** The GraphOS MCP bridge declares and runs on FastMCP 4. It provides native WebMCP support and a single consolidated event loop. Its own probes already exercise this version. | A semantic test suite plus a live probe confirm the deployed bridge reports FastMCP 4.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-OPS-R005",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Stable auth error codes from the engine contract",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "100d015ca012",
        "b5bf4ba58902"
      ],
      "verified_by": [
        "tests/api/test_contract_admission.py:120",
        "tests/api/test_contract_admission.py:70",
        "tests/api/test_errors.py:285"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Stable auth error codes from the engine contract.** GraphOS consumes the engine's packaged error-code contract. This includes the stable AUTH_TENANT_MISMATCH, AUTH_AUDIENCE_MISMATCH, and AUTH_POLICY_VERSION_MISMATCH codes. GraphOS refuses to start if the installed contract is missing or inconsistent with its generated bindings. | A contract test fails closed when the packaged engine error contract is absent or mismatched against the generated bindings.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-OPS-R006",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Consume the engine's packaged wire-callable contract",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "100d015ca012",
        "97061e59c412"
      ],
      "verified_by": [
        "tests/api/test_eg_binding.py:190"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Consume the engine's packaged wire-callable contract.** GraphOS reads the installed engine package's contract files for methods, errors, scopes, and JSON schemas. It binds operations only for engine methods marked wire-callable in that contract. | A package-contract test confirms the generated registry excludes any method not marked wire-callable in the installed engine contract.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-OPS-R007",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Immutable operation registry with digest and authorization",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4b83c69e2b41",
        "97061e59c412"
      ],
      "verified_by": [
        "tests/api/test_api_registry.py:110",
        "tests/api/test_api_registry.py:63"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Immutable operation registry with digest and authorization.** GraphOS defines one immutable OpSpec registry with typed enums for verb, surface, effect, and scope, producing a canonical form and a stable SHA-256 registry digest, and evaluates per-call authorization at find time. | Unit tests in tests/api/test_registry.py cover canonical-form stability, digest reproducibility, and authorized-evaluation outcomes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 11
    },
    {
      "id": "GRAPHOS-OPS-R008",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Generated engine-bound operations with exclusions",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4b83c69e2b41",
        "97061e59c412"
      ],
      "verified_by": [
        "tests/api/test_eg_binding.py:133",
        "tests/api/test_eg_binding.py:88"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Generated engine-bound operations with exclusions.** GraphOS generates one registry operation per wire-callable engine method through its engine-binding generator, skipping only methods listed in its exclusions file with a recorded replacement or internal-only reason. | Unit tests in tests/api/test_eg_binding.py assert full wire-callable method coverage minus the documented exclusions.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 12
    },
    {
      "id": "GRAPHOS-OPS-R009",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Single invoke pipeline for authority, effect, and audit",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "97061e59c412",
        "deb2b45bf83d"
      ],
      "verified_by": [
        "tests/api/test_invoke_contract.py:238",
        "tests/api/test_invoke_governance.py:193",
        "tests/api/test_invoke_governance.py:250",
        "tests/api/test_invoke_governance.py:87"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Single invoke pipeline for authority, effect, and audit.** GraphOS funnels every MCP, HTTP, A2A, and fleet call through one invoke pipeline that enforces surface, principal rule, exact scopes, policy, and subject-read checks in order, executes service-bound operations through a dedicated executor, gates destructive effects behind a single-use plan reference bound to the operation and policy revision, and requires console step-up with fresh authentication before admin or human-approval effects complete. | Integration tests exercise allow, deny, plan-expiry, and step-up paths through the invoke pipeline.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 13
    },
    {
      "id": "GRAPHOS-OPS-R010",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Closed error enum and one response envelope",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4b83c69e2b41"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Closed error enum and one response envelope.** GraphOS defines a closed error-code enum, including UNAUTHENTICATED, UNKNOWN_OP, SCOPE_REQUIRED, and POLICY_DENIED, with a generated engine-error mapping. It converts every surface's response through one shared to_envelope function. | Unit tests check envelope shape and error-code mapping, and a generator diff check compares output against the packaged engine contract.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 14
    },
    {
      "id": "GRAPHOS-OPS-R011",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Six resident MCP verbs with typed discovery",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "6b63aeb7ba03",
        "ea736715b7fb"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Six resident MCP verbs with typed discovery.** GraphOS implements the six resident MCP verbs (find, ask, why, write, act, manage) through a shared verb constructor with typed input schemas, exposes registry entries as graphos:// resources, and includes the registry digest in the server's published instructions. | Unit tests in tests/api/test_mcp_verbs.py cover verb schema validation, resource listing, and digest presence.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 15
    },
    {
      "id": "GRAPHOS-OPS-R012",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Bounded resolver for natural-language operation lookup",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "43db6b7ac49b",
        "deb2b45bf83d"
      ],
      "verified_by": [
        "tests/api/test_resolve.py:101",
        "tests/api/test_resolve.py:40",
        "tests/api/test_resolve.py:52",
        "tests/api/test_resolve.py:62",
        "tests/api/test_resolve.py:71"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Bounded resolver for natural-language operation lookup.** GraphOS resolves natural-language and partial queries to registry operations using combined lexical and semantic ranking over generated descriptors, a tenant- and policy-partitioned outcome moving average, and a bounded result cache, falling any unmatched ask call back to a read-only natural-language query preview rather than a direct mutation. | Unit tests in tests/api/test_resolve.py cover ranking order, cache bounds, and the preview-only fallback behavior.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 16
    },
    {
      "id": "GRAPHOS-OPS-R013",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Generated HTTP API for every registry operation",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "1fb96633563e",
        "a974d10c5d0c",
        "ea736715b7fb"
      ],
      "verified_by": [
        "tests/api/test_http_projection.py:188",
        "tests/api/test_http_projection.py:288",
        "tests/api/test_http_projection.py:326",
        "tests/api/test_http_projection.py:91"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Generated HTTP API for every registry operation.** GraphOS exposes each registry operation at POST /api/v1/ops/{op_id}. It also exposes generated resource routes on a dedicated sub-application. The sub-application has an authentication dependency and CSRF protection for cookie sessions. It also has cursor pagination, idempotency-key handling, and discovery endpoints for the registry and OpenAPI document. | Integration tests in tests/api/test_http_*.py cover routing, authentication, CSRF enforcement, and pagination and idempotency behavior.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 17
    },
    {
      "id": "GRAPHOS-OPS-R014",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Identity self-service and admin operations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Identity self-service and admin operations.** GraphOS exposes identity operations covering self-service, admin management of users, sessions, API keys, service accounts, roles, and groups, identity-provider configuration with dry-run, policy and mode transitions, issuer rotation, audit export and verification, and SCIM client management, requiring identity:admin scope and fresh console step-up for mutations. | Integration tests exercise each identity operation and confirm scope and step-up enforcement on admin mutations.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 18
    },
    {
      "id": "GRAPHOS-OPS-R015",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Access elevation, approval, and lease operations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Access elevation, approval, and lease operations.** GraphOS exposes access operations for elevation requests, approval and denial, lease listing, authorization checks, and policy explanation. One consolidated access service governs these operations. Every surface receives identical outcomes. The service enforces a no-self-approval rule. | Integration tests confirm consistent allow/deny outcomes across surfaces and reject a self-approval attempt.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 19
    },
    {
      "id": "GRAPHOS-OPS-R016",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Capacity status and throttle mode operations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Capacity status and throttle mode operations.** GraphOS exposes capacity status, cell update, and throttle status/mode operations backed by a read/config facade over the capacity controller, restricting throttle mode changes to the bounded observe/enforce enum under admin scope. | Integration tests confirm capacity reads match the underlying capacity cell and that a denied update leaves throttle state unchanged.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 20
    },
    {
      "id": "GRAPHOS-OPS-R017",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Finance and markets operations with tenant isolation",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Finance and markets operations with tenant isolation.** GraphOS exposes finance and markets operations, executing market reads server-side through the service executor under the finance:read scope, and gating position and paper-trading actions behind caller and subject ownership checks so no caller can see another tenant's account data. Delivered as the rollup of `GRAPHOS-OPS-R017.1` through `GRAPHOS-OPS-R017.2`. | Integration tests, including a negative cross-tenant case, confirm market reads and paper/position actions respect per-caller account binding.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 21
    },
    {
      "id": "GRAPHOS-OPS-R017.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Tenant-scoped market reads under finance:read",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "64a0c091b354"
      ],
      "verified_by": [
        "tests/finance/test_markets.py:34",
        "tests/finance/test_markets.py:68"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Tenant-scoped market reads under finance:read.** GraphOS executes market reads server-side through the service executor under the finance:read scope, refusing with zero provider calls on a missing or mismatched tenant/account binding. | Tests confirm a matching binding reaches the provider and a missing or cross-tenant binding refuses before any provider call.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 22
    },
    {
      "id": "GRAPHOS-OPS-R017.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Position and paper-trading actions with subject ownership checks",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "64a0c091b354"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Position and paper-trading actions with subject ownership checks.** GraphOS gates position and paper-trading actions behind caller and subject ownership checks. The engine's subject-ownership contract supplies those checks. No caller can act on another tenant's account. Blocked on the epistemic-graph v2.28 subject-ownership contract (not yet pinnable; current pin is `epistemic-graph>=2.27.0,<3.0.0`). | An integration test confirms paper/position actions respect per-caller subject ownership once the v2.28 contract is pinned. It includes a negative cross-tenant case.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 23
    },
    {
      "id": "GRAPHOS-OPS-R018",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Query, search, ontology, and analytics operations",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Query, search, ontology, and analytics operations.** GraphOS exposes query (uql, sparql, sql, sql_schema), search, indexes, ontology, and analytics.series operations. They execute caller-bound engine queries without a separate local ontology store or SQL string interpolation. Delivered as the rollup of `GRAPHOS-OPS-R018.1` through `GRAPHOS-OPS-R018.2`. | Integration tests confirm each query/search/ontology/analytics operation reaches the engine and honors tenant and budget limits.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 24
    },
    {
      "id": "GRAPHOS-OPS-R018.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Sparql, sql_schema, and ontology operations",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "64a0c091b354"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Sparql, sql_schema, and ontology operations.** GraphOS exposes SPARQL and sql_schema query routes. It also exposes ontology operations. These cover value/property types, interfaces, schema graph/summary, lint, generate, validate, load, export, and catalogue. The routes use the engine. They require neither a separate local ontology store nor SQL string interpolation. | Tests confirm the sparql and sql_schema routes and the ontology operation surface reach the engine.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 25
    },
    {
      "id": "GRAPHOS-OPS-R018.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Uql, sql, search, indexes, and analytics.series operations",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "64a0c091b354"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Uql, sql, search, indexes, and analytics.series operations.** GraphOS exposes uql and sql query operations, search, indexes, and analytics.series operations. They execute caller-bound engine queries and honor tenant and budget limits. | Integration tests confirm each operation reaches the engine and honors tenant and budget limits.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 26
    },
    {
      "id": "GRAPHOS-OPS-R019",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Federation source registration and sharing operations",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Federation source registration and sharing operations.** GraphOS exposes federation.sources operations for register, list, get, share, unshare, and probe. Registration and sharing are governed writes. Probe results redact credentials. Delivered as the rollup of `GRAPHOS-OPS-R019.1` through `GRAPHOS-OPS-R019.2`. | Integration tests confirm only the owner and grantees see a shared source. They confirm revocation blocks a subsequent probe.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 27
    },
    {
      "id": "GRAPHOS-OPS-R019.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Federation source register, list, get, and probe",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "64a0c091b354"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Federation source register, list, get, and probe.** GraphOS exposes federation.sources register, list, get, and probe. Registration is a governed write. Probe results redact credentials. | Integration tests confirm registration is a governed write and that probe results redact credentials.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 28
    },
    {
      "id": "GRAPHOS-OPS-R019.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Federation source share and unshare",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "64a0c091b354"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Federation source share and unshare.** GraphOS exposes federation.sources share and unshare as governed writes. Only the owner and grantees can see a shared source. Revoking access blocks the next probe. | Integration tests confirm only the owner and grantees see a shared source. They confirm revocation blocks a subsequent probe.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 29
    },
    {
      "id": "GRAPHOS-OPS-R020",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Ingest operations through a typed SDK runner facade",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "e990e195ab42"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Ingest operations through a typed SDK runner facade.** GraphOS exposes ingest operations for repository indexing, source sync, pack and job management, drift listing and repair with approval, and embedding admission and re-embedding, calling the ingestion SDK only through a typed runner facade and returning a typed UNAVAILABLE error when that runner is not composed. Delivered as the rollup of `GRAPHOS-OPS-R020.1` through `GRAPHOS-OPS-R020.5`. | Integration tests confirm sync returns a durable job receipt and that an absent runner fails closed with UNAVAILABLE.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 30
    },
    {
      "id": "GRAPHOS-OPS-R020.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Typed ingest runner port and the source-sync entry point",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4b69b27f1d76",
        "5ffd23ca7883",
        "822f55d5835d",
        "a974d10c5d0c",
        "cc90ee37583f"
      ],
      "verified_by": [
        "tests/api/test_ingest_ops.py:116",
        "tests/api/test_ingest_ops.py:97"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Typed ingest runner port and the source-sync entry point.** GraphOS defines one typed port for all ingestion SDK calls. It exposes ingest.sources.sync. If no runner is composed, it fails closed with UNAVAILABLE. | A test proves a durable job receipt on success and a typed UNAVAILABLE refusal when the runner is absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 31
    },
    {
      "id": "GRAPHOS-OPS-R020.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Repository indexing and source inventory operations",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4b69b27f1d76",
        "5ffd23ca7883",
        "822f55d5835d",
        "a974d10c5d0c",
        "cc90ee37583f"
      ],
      "verified_by": [
        "tests/api/test_ingest_ops.py:138",
        "tests/api/test_ingest_ops.py:154",
        "tests/api/test_ingest_ops.py:168",
        "tests/api/test_ingest_ops.py:181",
        "tests/api/test_ingest_ops.py:191"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Repository indexing and source inventory operations.** GraphOS exposes `ingest.repositories.index` and `ingest.sources.{list,status}` through the same typed runner port. | Integration tests confirm each operation reaches the runner and fails closed with `UNAVAILABLE` when the runner is absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 32
    },
    {
      "id": "GRAPHOS-OPS-R020.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Pack and job management operations",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "822f55d5835d"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Pack and job management operations.** GraphOS exposes `ingest.packs.*` and `ingest.jobs.*` through the same typed runner port. | Integration tests confirm pack and job operations reach the runner and report durable job state.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 33
    },
    {
      "id": "GRAPHOS-OPS-R020.3.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Missing ingest.packs.* and ingest.jobs.* ops",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "16c9b2bddda3"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Missing ingest.packs.* and ingest.jobs.* ops.** This row rolls up GRAPHOS-OPS-R020.3.1.1 through GRAPHOS-OPS-R020.3.1.2. No ingest.packs.* or ingest.jobs.* operation exists through the typed runner port. | Integration tests confirm ingest.packs.* and ingest.jobs.* reach the runner and report durable job state. They also confirm UNAVAILABLE when the runner is absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 34
    },
    {
      "id": "GRAPHOS-OPS-R020.3.1.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "`ingest.packs.list` op",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "16c9b2bddda3"
      ],
      "verified_by": [
        "tests/api/test_ingest_ops.py:228",
        "tests/api/test_ingest_ops.py:240",
        "tests/api/test_ingest_ops.py:249"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**`ingest.packs.list` op.** GraphOS exposes `ingest.packs.list` as a read operation through the typed ingest runner port, listing this tenant's ingestion packs. | Tests confirm the operation reaches the runner with the caller's tenant and declares the existing `ingest:read` scope. They also require fail-closed `UNAVAILABLE` when the runner is absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 35
    },
    {
      "id": "GRAPHOS-OPS-R020.3.1.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "`ingest.jobs.status` op",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "634a344fade7"
      ],
      "verified_by": [
        "tests/api/test_ingest_ops.py:256",
        "tests/api/test_ingest_ops.py:266",
        "tests/api/test_ingest_ops.py:275"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**`ingest.jobs.status` op.** GraphOS exposes `ingest.jobs.status` as a read operation through the typed ingest runner port, reporting one durable job's state. Depends on `GRAPHOS-OPS-R020.3.1.1` for the shared pack/job port conventions. | Tests confirm the op reaches the runner, reports durable job state, declares `ingest:read`, and fails closed with `UNAVAILABLE` when the runner is absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 36
    },
    {
      "id": "GRAPHOS-OPS-R020.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Drift listing and repair-with-approval operations",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "822f55d5835d"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Drift listing and repair-with-approval operations.** GraphOS exposes `ingest.drift.{list,get,repair_propose,repair_approve}`, gating repair behind an approval reference. | Integration tests confirm drift repair previews and audits its effect before applying it.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 37
    },
    {
      "id": "GRAPHOS-OPS-R020.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Embedding admission and re-embedding operations",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "822f55d5835d"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Embedding admission and re-embedding operations.** GraphOS exposes `ingest.embedding.{admit,reembed}` through the same typed runner port. | Integration tests confirm embedding operations reach the runner and report durable job state.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 38
    },
    {
      "id": "GRAPHOS-OPS-R021",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Decision, retrieval, and policy operations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Decision, retrieval, and policy operations.** GraphOS exposes decide, retrieval, context, freshness, policy, and swarm read operations while restricting decision-commit actions to the service executor, so no caller can materialize an agent decision using only a human-scoped token. | Integration tests confirm decision commits are service-only and that provenance is attached to each result.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 39
    },
    {
      "id": "GRAPHOS-OPS-R021.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Decide operations (service-executed) \u2014 decide slice",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1ded59edd1a6"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Decide operations (service-executed) \u2014 decide slice.** Implements the decide portion of `GRAPHOS-OPS-R021`: `decide.*` operations that evaluate and commit agent decisions, routing the commit path through the service executor only (never the caller-bound path) and attaching provenance to each result. | A test confirms a human-scoped caller cannot invoke the commit path directly and that every decide result carries provenance.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 40
    },
    {
      "id": "GRAPHOS-OPS-R021.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Retrieval, context, and freshness read operations \u2014 retrieval slice",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "e78a5e5b701e"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Retrieval, context, and freshness read operations \u2014 retrieval slice.** Delivered as the rollup of `GRAPHOS-OPS-R021.2.1` through `GRAPHOS-OPS-R021.2.2`. Implements the retrieval portion of `GRAPHOS-OPS-R021`: `retrieval.*` read operations, including context-budgeted retrieval and freshness checks. These execute caller-bound engine queries without a local cache substitute. | A test confirms a retrieval call reaches the engine under the caller's own authority and respects a context budget.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 41
    },
    {
      "id": "GRAPHOS-OPS-R021.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "`retrieval.search` op",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "e78a5e5b701e"
      ],
      "verified_by": [
        "tests/api/test_retrieval_ops.py:43",
        "tests/api/test_retrieval_ops.py:58"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**`retrieval.search` op.** GraphOS exposes `retrieval.search` as a read operation through a typed retriever port. It returns context-budgeted hits under the caller's own tenant. It fails closed with `UNAVAILABLE` when the port is not composed. | Tests confirm the op reaches the retriever with the caller's tenant and truncates hits to the context budget. They verify the existing `memory:read` scope and a closed failure with `UNAVAILABLE` when the retriever is absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 42
    },
    {
      "id": "GRAPHOS-OPS-R021.2.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "`retrieval.freshness` op",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "f6f2177ab1e0"
      ],
      "verified_by": [
        "tests/api/test_retrieval_ops.py:68",
        "tests/api/test_retrieval_ops.py:81"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**`retrieval.freshness` op.** GraphOS exposes `retrieval.freshness` as a read operation through the same typed retriever port. It reports freshness of the caller's retrieval sources. Depends on `GRAPHOS-OPS-R021.2.1` for the shared retriever port. | Tests confirm the op reaches the retriever with the caller's tenant and is read-only. They verify a closed failure with `UNAVAILABLE` when the retriever is absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 43
    },
    {
      "id": "GRAPHOS-OPS-R021.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Policy and swarm read operations \u2014 policy slice",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cc90ee37583f"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Policy and swarm read operations \u2014 policy slice.** Implements the policy portion of `GRAPHOS-OPS-R021`: `policy.*` and `swarm.*` read operations surfacing the active policy state and swarm topology to an authorized caller. | A test confirms policy and swarm reads are caller-scoped and read-only.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 44
    },
    {
      "id": "GRAPHOS-OPS-R021.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Run read operations \u2014 runs slice",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Run read operations \u2014 runs slice.** Delivered as the rollup of `GRAPHOS-OPS-R021.4.1` through `GRAPHOS-OPS-R021.4.6`. Implements the run-observation portion of `GRAPHOS-OPS-R021`: the `runs.metrics` and `runs.get` read operations. They read the engine under the caller's own authority and hold no local aggregate. | A test confirms both operations reach the engine reader with the caller's tenant. They fail closed with `UNAVAILABLE` when the reader is absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 45
    },
    {
      "id": "GRAPHOS-OPS-R021.4.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "RunTraceReader port",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**RunTraceReader port.** Model: `RunTraceReader` in `graph_os/api/ops/runs.py` (planned). Behavior: The existing service binding must expose typed asynchronous `get` and `metrics` reads. Wiring: The invoke pipeline must pass verified caller authority to both methods. Refusal: An absent reader must return `UNAVAILABLE` before dispatch. | Evidence: planned `tests/api/test_runs_ops.py::test_run_trace_reader_is_runtime_checkable_protocol` plus the served cases in test-spec.md.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 46
    },
    {
      "id": "GRAPHOS-OPS-R021.4.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Engine adapter",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Engine adapter.** Model: Validated trace and decision projections under `EG-ORCH-VOCAB-R009.15` through `.17`. Behavior: The adapter must preserve engine values and caller scope through published engine client reads. Wiring: The composition root must bind the adapter to `run_trace_reader`. Refusal: Missing wire methods must return `UNAVAILABLE`; another tenant must read as absent. | Evidence: planned `tests/api/test_runs_ops.py::test_adapter_calls_engine_wire_method` plus the served cases in test-spec.md.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 47
    },
    {
      "id": "GRAPHOS-OPS-R021.4.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Aggregate models",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Aggregate models.** Model: `RunMetricsParams` and `RunMetricsOutcome` in `graph_os/api/ops/runs.py` (planned). Behavior: Metrics must preserve each engine query grouping and zero-solved abstention. Wiring: The operation must validate the engine outcome before returning it. Refusal: Unknown fields, negative costs, invalid windows and non-finite numbers must refuse. | Evidence: planned `tests/api/test_runs_ops.py::test_run_metrics_models_reject_unknown_fields` plus the served cases in test-spec.md.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 48
    },
    {
      "id": "GRAPHOS-OPS-R021.4.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Aggregate operation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Aggregate operation.** Model: Separate query results defined by `EG-ORCH-VOCAB-R010.1` through `.5`. Behavior: `runs.metrics` must return engine aggregates without local arithmetic. Wiring: `handle_runs_metrics` must use `build_read_op`, verb `ASK`, and existing `telemetry:read`. Refusal: Denied scope must prevent engine dispatch; zero solved tasks must not produce zero cost. | Evidence: planned `tests/api/test_runs_ops.py::test_runs_metrics_passes_engine_values_through` plus the served cases in test-spec.md.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 49
    },
    {
      "id": "GRAPHOS-OPS-R021.4.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Per-run operation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Per-run operation.** Model: `RunSummary` in `graph_os/api/ops/runs.py` (planned), selected by `run_id`. Behavior: `runs.get` must return the field projection and snapshot contract below. Wiring: `handle_runs_get` must use `build_read_op` and existing `kg:read`. Refusal: Unknown runs and other tenants must be indistinguishable; missing fields must remain unavailable. | Evidence: planned `tests/api/test_runs_ops.py::test_runs_get_returns_termination_context_and_applied_config` plus the served cases in test-spec.md.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 50
    },
    {
      "id": "GRAPHOS-OPS-R021.4.6",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Registration and served proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Registration and served proof.** Model: Registry, OpenAPI and client artifacts generated under `GRAPHOS-OPS-R025`. Behavior: REST and MCP must reach the same reader through the registered operation pipeline. Wiring: `graph_os/api/ops/registry_factory.py` must list `runs`; the host must bind its reader. Refusal: Unsupported operations and denied callers must produce typed refusals without engine calls. | Evidence: planned `tests/api/test_runs_ops.py::test_runs_ops_registered_with_existing_scopes` plus the served cases in test-spec.md.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 51
    },
    {
      "id": "GRAPHOS-OPS-R022",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Work and evolution loop operations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Work and evolution loop operations.** GraphOS exposes work-item and offer operations plus evolution loop, schedule, and proposal operations, with its daemon acting only as a status/run/pause facade while durable loop state remains owned by the underlying service. | Integration tests confirm run/pause requires the loops:control scope, reads require loops:read, and a repeated run stays idempotent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 52
    },
    {
      "id": "GRAPHOS-OPS-R022.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Work-item and offer operations \u2014 work slice",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "c4cc3e21b439"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Work-item and offer operations \u2014 work slice.** Implements the work slice of GRAPHOS-OPS-R022. It exposes work.* operations for work-item and offer reads and writes. The same control leases bind them as fleet-facing listings. | A test confirms a work-item write requires the declared scope and that offers are visible only to their bound principal.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 53
    },
    {
      "id": "GRAPHOS-OPS-R022.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Evolution loop, schedule, and proposal operations \u2014 evolution slice",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Evolution loop, schedule, and proposal operations \u2014 evolution slice.** Implements the evolution slice of GRAPHOS-OPS-R022. It exposes evolution.* operations for loop status/run/pause, schedules, and proposals. The daemon is only a facade. The owner service retains durable loop state. | A test confirms run/pause requires the `loops:control` scope, reads require `loops:read`, and a repeated run stays idempotent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 54
    },
    {
      "id": "GRAPHOS-OPS-R022.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "evolution.loops.status operation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**evolution.loops.status operation.** GraphOS exposes evolution.loops.status as a read through a typed evolution runner port. It reports one loop's state. The owner service retains durable loop state. This is a child of GRAPHOS-OPS-R022.2 and rolls up .1 through .5. **Blocked:** The engine scope registry in contract/scopes.json must register loops:read. The registry factory rejects unregistered scopes at graph_os/api/ops/registry_factory.py:72-76. Do not substitute work:read. | Tests confirm the op reaches the runner with the caller's tenant and declares loops:read. They also require fail-closed UNAVAILABLE when the runner is absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 55
    },
    {
      "id": "GRAPHOS-OPS-R022.2.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "`evolution.schedules.list` op",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**`evolution.schedules.list` op.** Read operation listing this tenant's loop schedules through the evolution runner port. Depends on `GRAPHOS-OPS-R022.2.1` for the port. | Tests confirm the op reaches the runner with the caller's tenant and fails closed with `UNAVAILABLE`.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 56
    },
    {
      "id": "GRAPHOS-OPS-R022.2.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "`evolution.proposals.list` op",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**`evolution.proposals.list` op.** Read operation listing this tenant's evolution proposals through the evolution runner port. Depends on `GRAPHOS-OPS-R022.2.1`. | Tests confirm the op reaches the runner with the caller's tenant and fails closed with `UNAVAILABLE`.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 57
    },
    {
      "id": "GRAPHOS-OPS-R022.2.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "`evolution.loops.run` op",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**`evolution.loops.run` op.** Write operation requesting one loop run, idempotency-key required, requiring `loops:control`. Depends on `GRAPHOS-OPS-R022.2.1`; may need the engine scope registry (epistemic-graph). | Tests confirm `loops:control` is required and a repeated run with the same key stays idempotent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 58
    },
    {
      "id": "GRAPHOS-OPS-R022.2.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "`evolution.loops.pause` op",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**`evolution.loops.pause` op.** Write operation pausing one loop, requiring `loops:control`. Depends on `GRAPHOS-OPS-R022.2.4`. | Tests confirm `loops:control` is required and the pause is idempotent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 59
    },
    {
      "id": "GRAPHOS-OPS-R023",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Agent, browser, RLM, and fleet call operations",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "e1d37ca10ef7"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Agent, browser, RLM, and fleet call operations.** GraphOS exposes agent, A2A task, RLM, browser, and fleet operations, including fleet.call, deriving each loaded tool's effect classification from its annotation so every call still passes through the invoke pipeline rather than bypassing it. | Integration tests confirm every loaded fleet tool call reaches the invoke pipeline and no direct child dispatch bypasses it.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 60
    },
    {
      "id": "GRAPHOS-OPS-R024",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Telemetry, security, usage, and admin operations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Telemetry, security, usage, and admin operations.** GraphOS exposes telemetry, security, operational (doctor, config, backup, restore, tenants), usage, memory, and graph operations, sourcing usage data from the engine and requiring destructive backup, restore, and tenant actions to pass console step-up with a durable audit record. | Integration tests confirm backup, restore, and tenant actions cannot complete from a plain confirmation and require step-up plus audit.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 61
    },
    {
      "id": "GRAPHOS-OPS-R024.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Telemetry operations \u2014 telemetry slice",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4b69b27f1d76"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Telemetry operations \u2014 telemetry slice.** Implements the telemetry portion of `GRAPHOS-OPS-R024`: `telemetry.*` operations bound to the engine's tenant-scoped telemetry method. | A test confirms a telemetry read is tenant-scoped and reaches the engine.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 62
    },
    {
      "id": "GRAPHOS-OPS-R024.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Security operations \u2014 security slice",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4b69b27f1d76"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Security operations \u2014 security slice.** Implements the security portion of `GRAPHOS-OPS-R024`: `security.*` operations surfacing the current security posture to an authorized caller. | A test confirms a security read requires its declared scope.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 63
    },
    {
      "id": "GRAPHOS-OPS-R024.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Usage operations \u2014 usage slice",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4b69b27f1d76"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Usage operations \u2014 usage slice.** Implements the usage portion of `GRAPHOS-OPS-R024`: `usage.*` operations sourcing usage data from the engine rather than a local counter. | A test confirms a usage read reaches the engine and reflects tenant-scoped data.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 64
    },
    {
      "id": "GRAPHOS-OPS-R024.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Memory operations \u2014 memory slice",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "5ffd23ca7883",
        "8d1bc46ecbdb"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Memory operations \u2014 memory slice.** Implements the memory portion of `GRAPHOS-OPS-R024`: `memory.*` operations over the agent memory store, bound by the caller's own authority. | A test confirms a memory read/write is scoped to the caller's own tenant.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 65
    },
    {
      "id": "GRAPHOS-OPS-R024.4.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Versioned memory port",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Versioned memory port.** Model: the versioned memory contract in plan.md. Behavior: Reuse generated `EG-DURABLE-KERNEL-R085.1` requests and tagged outcomes through the existing memory service binding. Wiring: Extend `MemoryStore` in `graph_os/api/ops/memory.py`; preserve the existing generic read/write contract. Refusal: Unavailable generated methods must refuse without a local memory fallback. | Evidence: planned `tests/api/test_memory_files_served.py::test_models_and_port_preserve_tagged_outcomes`.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 66
    },
    {
      "id": "GRAPHOS-OPS-R024.4.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Snapshot reads and listing",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Snapshot reads and listing.** Model: the versioned memory contract in plan.md. Behavior: Serve `memory.files.read` and `memory.files.list` through `ReadMemorySnapshot` and `ListMemorySnapshots`. Wiring: Extend `operations()` in `graph_os/api/ops/memory.py:90` using `EG-DURABLE-KERNEL-R085.2` and `.4`. Refusal: Expired or wrong-scope cursors must refuse; responses must reveal no hidden counts or identifiers. | Evidence: planned `tests/api/test_memory_files_served.py::test_read_list_preserve_scope_and_cursor`.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 67
    },
    {
      "id": "GRAPHOS-OPS-R024.4.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Versioned saves and conflicts",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Versioned saves and conflicts.** Model: the versioned memory contract in plan.md. Behavior: Serve `memory.files.save` through `SyncMemorySnapshot` submit or resolve under `EG-DURABLE-KERNEL-R085.3`. Wiring: The existing service executor must forward the generated precondition, bytes, digest and request identity. Refusal: Stale authorized saves must retain both versions; refused saves must contain no accepted-head fields. | Evidence: planned `tests/api/test_memory_files_served.py::test_competing_saves_preserve_both_versions`.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 68
    },
    {
      "id": "GRAPHOS-OPS-R024.4.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Hosted materialization",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Hosted materialization.** Model: the versioned memory contract in plan.md. Behavior: Write hosted projections and acknowledge the exact EG head and observation generation under `EG-DURABLE-KERNEL-R085.6`. Wiring: Bind the host materializer beside `build_operation_runtime` in `graph_os/api/invoke/bootstrap.py:167`. Refusal: Failed file writes must not acknowledge; delayed acknowledgments must not clear newer observations or conflicts. | Evidence: planned `tests/api/test_memory_files_served.py::test_materialization_ack_checks_generation`.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 69
    },
    {
      "id": "GRAPHOS-OPS-R024.4.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Authority and replay",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Authority and replay.** Model: the versioned memory contract in plan.md. Behavior: Use `GRAPHOS-OPS-R009` and `GRAPHOS-OPS-R013` with `EG-DURABLE-KERNEL-R085.5` for every request and replay. Wiring: `invoke` in `graph_os/api/invoke/pipeline.py:810` must authorize before engine or hosted-file access. Refusal: Denied existing, absent and creation requests must be indistinguishable; changed-body replay must have no effects. | Evidence: planned `tests/api/test_memory_files_served.py::test_authority_and_replay_are_non_disclosing`.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 70
    },
    {
      "id": "GRAPHOS-OPS-R024.4.6",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Registration and served proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Registration and served proof.** Model: the versioned memory contract in plan.md. Behavior: Register the three file operations and generate their schemas under `GRAPHOS-OPS-R025`. Wiring: `registry_factory.py` already registers memory; real HTTP and MCP calls must traverse invoke and durable EG dispatch. Refusal: Missing producer contracts must remain unavailable; no test may replace the host, gateway or engine transport. | Evidence: planned `tests/api/test_memory_files_served.py::test_complete_served_memory_file_journey`.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 71
    },
    {
      "id": "GRAPHOS-OPS-R024.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Operational admin operations \u2014 admin slice",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8d1bc46ecbdb"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Operational admin operations \u2014 admin slice.** Implements the operational-admin (doctor, config, backup, restore, tenants) portion of `GRAPHOS-OPS-R024`: `ops.*` operations requiring destructive backup, restore, and tenant actions to pass console step-up with a durable audit record. Graph, query, search, and ontology administration are out of scope for this slice; GraphOS's host-composition cutover lane owns them as `GRAPHOS-HOST-R026.x`. | A test confirms backup, restore, and tenant actions cannot complete from a plain confirmation and require step-up plus audit.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 72
    },
    {
      "id": "GRAPHOS-OPS-R025",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Generated registry, OpenAPI, and client artifacts",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4b83c69e2b41"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Generated registry, OpenAPI, and client artifacts.** GraphOS's generator script reads the packaged engine contract. It regenerates the operation registry, descriptors, OpenAPI document, engine-error module, and Python and TypeScript clients. Output is reproducible under its generated-artifact directories. | A generator diff/drift test confirms regenerated artifacts match the committed output for a pinned engine contract.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 73
    },
    {
      "id": "GRAPHOS-OPS-R026",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "API surface and compatibility drift gates",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4b9d181069e4"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**API surface and compatibility drift gates.** GraphOS enforces its API-surface and backward-compatibility drift gates as pre-commit hooks, each backed by a dedicated test. | Unit tests for each drift gate confirm it fails when a corresponding drift is introduced, and the pre-commit hook runs them on every commit.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 74
    },
    {
      "id": "GRAPHOS-OPS-R026.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "API-surface drift gate \u2014 api-surface slice",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4b9d181069e4"
      ],
      "verified_by": [
        "tests/api/test_surface_drift_gate.py:22",
        "tests/api/test_surface_drift_gate.py:31",
        "tests/api/test_surface_drift_gate.py:41",
        "tests/api/test_surface_drift_gate.py:50",
        "tests/api/test_surface_drift_gate.py:67"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**API-surface drift gate \u2014 api-surface slice.** Implements the api-surface portion of `GRAPHOS-OPS-R026`: a pre-commit hook that fails when the generated registry's public surface (operation IDs, HTTP routes, and MCP verb set) changes without a corresponding reviewed baseline update. | A dedicated unit test confirms the gate fails when an operation is added, removed, or has its public shape changed without updating the checked baseline.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 75
    },
    {
      "id": "GRAPHOS-OPS-R026.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Backward-compatibility drift gate \u2014 backward-compat slice",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4b9d181069e4"
      ],
      "verified_by": [
        "tests/api/test_backward_compat_drift_gate.py:42",
        "tests/api/test_backward_compat_drift_gate.py:51",
        "tests/api/test_backward_compat_drift_gate.py:60",
        "tests/api/test_backward_compat_drift_gate.py:70",
        "tests/api/test_backward_compat_drift_gate.py:79"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Backward-compatibility drift gate \u2014 backward-compat slice.** Implements the backward-compat portion of `GRAPHOS-OPS-R026`: a pre-commit hook that fails when a previously published operation is removed or has a required field narrowed in an incompatible way. | A dedicated unit test confirms the gate fails when a previously published operation's compatible shape is broken.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 76
    },
    {
      "id": "GRAPHOS-OPS-R027",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Authority-parity test across principals and surfaces",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4b9d181069e4"
      ],
      "verified_by": [
        "tests/api/test_authority_parity.py:114",
        "tests/api/test_authority_parity.py:120"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Authority-parity test across principals and surfaces.** GraphOS maintains an authority matrix fixture covering every principal kind, operation, and surface combination, and a parity test asserting the generated registry enforces identical allow/deny outcomes against it. | The authority-parity test suite runs against the authority matrix fixture and passes with no mismatches.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 77
    },
    {
      "id": "GRAPHOS-OPS-R028",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Exported domain scope classes",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4b83c69e2b41",
        "b47b39eac0ae"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Exported domain scope classes.** GraphOS defines and exports its domain scope classes, including finance:read, fleet:read, fleet:control, loops:read, loops:control, ops:read, and ops:admin, for consumption by the engine's scope registry. | Unit tests confirm each exported scope triple matches its declared class and is consumed without duplication.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 78
    },
    {
      "id": "GRAPHOS-OPS-R029",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Single resident-tool server cutover",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5bc24c262ef0"
      ],
      "verified_by": [
        "tests/api/test_resident_tool_surface.py:33",
        "tests/api/test_resident_tool_surface.py:43",
        "tests/api/test_resident_tool_surface.py:56"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Single resident-tool server cutover.** GraphOS's server factory registers only the six resident MCP verbs plus find_tools, load_tools, unload_tools, and multiplexer_status. It mounts the generated /api/v1 sub-application and an explicit protocol-route table. The same change removes retired granular tool registrars, hand-written action-tool routes, and legacy fleet routes. | A boot/integration test checks the running server exposes exactly the resident tool set and mounted routes. It confirms retired modules are absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 79
    },
    {
      "id": "GRAPHOS-OPS-R030",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Accurate MCP server and API documentation",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5bc24c262ef0"
      ],
      "verified_by": [
        "tests/docs/test_mcp_server_doc_accuracy.py:24",
        "tests/docs/test_mcp_server_doc_accuracy.py:38"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Accurate MCP server and API documentation.** GraphOS keeps its MCP server, API, and status documentation accurate to the live six-verb MCP surface. It also documents the generated HTTP API. The docs replace outdated tool-count or endpoint descriptions. | A documentation-accuracy check confirms the documented verb and tool counts match the live registry.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 80
    },
    {
      "id": "GRAPHOS-OPS-R031",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Published tool-to-operation parity inventory",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5bc24c262ef0"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Published tool-to-operation parity inventory.** GraphOS publishes a complete parity inventory mapping every former hosted intent verb and tool to its destination operation or a documented intentional drop, so that a consuming agent project can remove its legacy intent-tool definitions only once that inventory and its generated client are published. | A parity-inventory test confirms full coverage of former tool names against the published mapping.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 81
    },
    {
      "id": "GRAPHOS-OPS-R031.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Fleet meta-tool parity mapping \u2014 resident fleet slice",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "5bc24c262ef0"
      ],
      "verified_by": [
        "tests/api/test_fleet_tool_parity_inventory.py:33",
        "tests/api/test_fleet_tool_parity_inventory.py:42"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Fleet meta-tool parity mapping \u2014 resident fleet slice.** Implements the resident-fleet-tool slice of `GRAPHOS-OPS-R031`: GraphOS publishes, in docs, the parity mapping from each of its four resident fleet meta-tools (`find_tools`, `load_tools`, `unload_tools`, `multiplexer_status`) to its destination operation. | A parity-inventory test confirms the published mapping's keys and values match the live `FLEET_OPERATIONS` registry exactly.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 82
    },
    {
      "id": "GRAPHOS-OPS-R032",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Identity dependency inversion via ports",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Identity dependency inversion via ports.** GraphOS's webui_host, webui_co_service, and mcp_server modules depend only on the Protocol and DTO definitions in graph_os.identity.ports, with the concrete identity runtime constructed once in the serving composition root and injected into each. | A static dependency-graph check confirms each module imports only graph_os.identity.ports and not the concrete identity implementation.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 83
    },
    {
      "id": "GRAPHOS-OPS-R032.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Static identity-ports import boundary",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "b97b75e763ed"
      ],
      "verified_by": [
        "tests/architecture/test_identity_ports_boundary.py:51"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Static identity-ports import boundary.** GraphOS enforces, as a standing regression guard, that its webui_host and mcp_server modules import only graph_os.identity.ports and never the concrete identity runtime (graph_os.identity.engine or any other graph_os.identity submodule). | A static dependency-graph check over every module under graph_os/webui_host and graph_os/mcp_server confirms no import of a graph_os.identity submodule other than graph_os.identity.ports.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 84
    },
    {
      "id": "GRAPHOS-OPS-R032.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Injected composition root for identity ports",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Injected composition root for identity ports.** GraphOS constructs the concrete identity runtime once in the serving composition root. The root injects it into webui_host, webui_co_service, and mcp_server. It uses only graph_os.identity.ports Protocol and DTO types. | An integration test confirms each module receives its identity capability only via an injected graph_os.identity.ports object, never by importing the concrete runtime directly.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 85
    },
    {
      "id": "GRAPHOS-OPS-R032.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Identity runtime constructor in the composition root",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "3dc5a3607868"
      ],
      "verified_by": [
        "tests/identity/test_identity_composition.py:32",
        "tests/identity/test_identity_composition.py:52",
        "tests/identity/test_identity_composition.py:62"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Identity runtime constructor in the composition root.** GraphOS has one composition-root function that constructs the concrete identity runtime once and returns it typed only as graph_os.identity.ports Protocol objects (CredentialAuthority, SessionAuthority). Edits graph_os/identity and the composition root only, not graph_os/api/ops/registry_factory.py. | A unit test confirms the function returns port-typed objects and builds the runtime exactly once per call of the root, and fails closed with IdentityUnavailable when authoritative facts are absent.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 86
    },
    {
      "id": "GRAPHOS-OPS-R032.2.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Inject identity ports into mcp_server",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Inject identity ports into mcp_server.** graph_os.mcp_server receives its identity capability as an injected graph_os.identity.ports object supplied by the composition root. Depends on GRAPHOS-OPS-R032.2.1 and on the graph_os/api/ops/identity.py and registry_factory.py registration from PR #176 (deliver-ops-r014). | A test confirms mcp_server accepts only a ports-typed object and refuses to start without one.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 87
    },
    {
      "id": "GRAPHOS-OPS-R032.2.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Inject identity ports into webui_host and webui_co_service (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Inject identity ports into webui_host and webui_co_service (rollup).** graph_os.webui_host and graph_os.webui_host.webui_co_service (compose_web_application) receive their identity capability as an injected graph_os.identity.ports object supplied by the composition root. Rollup of GRAPHOS-OPS-R032.2.3.1 and GRAPHOS-OPS-R032.2.3.2. Depends on GRAPHOS-OPS-R032.2.1. | Both children are delivered and their bound tests pass.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 88
    },
    {
      "id": "GRAPHOS-OPS-R032.2.3.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "compose_web_application requires injected identity ports",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**compose_web_application requires injected identity ports.** graph_os.webui_host.webui_co_service.compose_web_application takes an `IdentityPorts` argument from graph_os.identity.composition and raises a typed refusal when it is absent or not ports-typed; it imports no graph_os.identity submodule other than ports/composition types. Edits webui_co_service.py only. Depends on GRAPHOS-OPS-R032.2.1. | A test confirms compose_web_application accepts only an IdentityPorts object and refuses to compose without one.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 89
    },
    {
      "id": "GRAPHOS-OPS-R032.2.3.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Thread identity ports through run_web_ui and the webui_host package (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Thread identity ports through run_web_ui and the webui_host package (rollup).** run_web_ui and graph_os.webui_host receive the composition root's IdentityPorts and bind them into the application composer passed to the WebUI factory; graph_os.mcp_server.composition passes the ports when starting the agent-webui co-service. Rollup of GRAPHOS-OPS-R032.2.3.2.1 and GRAPHOS-OPS-R032.2.3.2.2. Depends on GRAPHOS-OPS-R032.2.3.1 and GRAPHOS-OPS-R032.2.2. | Both children are delivered and their bound tests pass.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 90
    },
    {
      "id": "GRAPHOS-OPS-R032.2.3.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "run_web_ui accepts and binds identity ports",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**run_web_ui accepts and binds identity ports.** run_web_ui takes a required `IdentityPorts` argument, refuses to start (typed refusal) when it is absent or not ports-typed, and binds the ports into the composer passed to the WebUI factory with functools.partial over compose_web_application. Delivered together with GRAPHOS-OPS-R032.2.3.1 in one PR because compose_web_application cannot land requiring ports while run_web_ui still passes it bare. Edits webui_co_service.py and the existing webui_host tests only. Depends on GRAPHOS-OPS-R032.2.3.1. | A test confirms run_web_ui refuses to start without ports and passes a composer bound to the supplied ports to the WebUI factory.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 91
    },
    {
      "id": "GRAPHOS-OPS-R032.2.3.2.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Supply identity ports from mcp_server composition to the agent-webui start call",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Supply identity ports from mcp_server composition to the agent-webui start call.** graph_os.mcp_server.composition.start_composed_services receives the composition root's IdentityPorts and passes them to the agent-webui co-service start call. No production identity runtime is constructed anywhere yet (build_identity_ports has only test callers), so this needs the injected runtime from GRAPHOS-OPS-R032.2.2. Depends on GRAPHOS-OPS-R032.2.3.2.1 and GRAPHOS-OPS-R032.2.2. | A test confirms the supervisor start call for agent-webui supplies the ports.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 92
    },
    {
      "id": "GRAPHOS-OPS-R032.2.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Integration test of single injected identity runtime",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Integration test of single injected identity runtime.** An integration test builds the composition root once and confirms mcp_server, webui_host, and webui_co_service all receive the same ports-typed identity object and none imports the concrete runtime. Depends on GRAPHOS-OPS-R032.2.2 and GRAPHOS-OPS-R032.2.3. | The integration test passes against the real composition root.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 93
    },
    {
      "id": "GRAPHOS-OPS-R033",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Dynamic multiplexer discovery, load, and call",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "b9141334e1ba"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Dynamic multiplexer discovery, load, and call.** GraphOS implements find_tools (with browse=true replacing the former catalog listing), load_tools, unload_tools, and multiplexer_status over one per-caller-filtered catalog spanning fleet tools, prompts, resources, skills, and connector items, enforcing a default load cap of 64 (hard maximum 256), one-hour idle expiry, opt-in LRU eviction, and routing every loaded tool's body through a fleet call with the caller's delegated credential. | Integration tests confirm the load cap, idle expiry, and that each loaded tool call is dispatched through the fleet-call path rather than directly.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 94
    },
    {
      "id": "GRAPHOS-OPS-R034",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Eunomia narrowing-only policy enforcement",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4b83c69e2b41"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Eunomia narrowing-only policy enforcement.** GraphOS applies its policy engine as a narrowing-only step at discovery, load, and every call, always leaving exact-scope filtering in place when policy is off, failing closed when policy is enabled but unreachable, defaulting to on for local and external deployments and off only for the none deployment mode, with its doctor check warning when policy is disabled. | Integration tests cover the off, on, and unreachable policy states, and a doctor-check test confirms the warning fires when policy is off.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 95
    },
    {
      "id": "GRAPHOS-OPS-R035",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Multiplexer registration reduced to four resident tools",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Multiplexer registration reduced to four resident tools.** GraphOS replaces its multiplexer's meta-tool registration with the four resident tools (find_tools, load_tools, unload_tools, multiplexer_status), and narrows its session-visibility middleware to routing list and call requests only, no longer making authorization decisions itself. | An integration test confirms the middleware denies nothing on its own and that authorization is enforced solely by the invoke pipeline.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 96
    },
    {
      "id": "GRAPHOS-OPS-R035.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Four-tool meta-registration and routing-only visibility, unit-bound",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "b97b75e763ed"
      ],
      "verified_by": [
        "tests/api/mcp/test_registration_governed_visibility.py:27",
        "tests/api/mcp/test_registration_governed_visibility.py:58"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Four-tool meta-registration and routing-only visibility, unit-bound.** GraphOS's prepared multiplexer registration module defines exactly the four resident fleet meta-tools (find_tools, load_tools, unload_tools, multiplexer_status), and its GovernedSessionVisibility middleware only routes the list-tools candidate set (resident names plus the caller's currently loaded items), raising no denial of its own. | A test confirms FLEET_OPERATIONS is exactly the four named tools and that GovernedSessionVisibility.on_list_tools filters a candidate tool list to resident-plus-loaded without raising.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 97
    },
    {
      "id": "GRAPHOS-OPS-R035.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Registration wired into the live server",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Registration wired into the live server.** GraphOS's server factory calls register_mcp_tools during startup composition so the four-resident-tool surface and GovernedSessionVisibility middleware are active on the running server, not only in isolated unit scope. | A boot/integration test confirms the running server's live MCP surface and middleware chain match the prepared registration module.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 98
    },
    {
      "id": "GRAPHOS-OPS-R036",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Pre-dispatch audit reservation for governed effects",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "a9025191159e"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Pre-dispatch audit reservation for governed effects.** Before any governed write or admin effect, GraphOS reserves a tenant-scoped, idempotent pending audit record through the engine's audit-append operation using verified service claims, links the eventual outcome back to that reservation, and refuses dispatch when the operation has no declared audit class or the durable audit writer is unavailable. | Integration tests confirm a missing audit class or unreachable audit writer blocks dispatch and that a completed effect links to its reservation.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 99
    },
    {
      "id": "GRAPHOS-OPS-R037",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Native first-party A2A facade",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "20f773df9ddd",
        "d53165c2e72c"
      ],
      "verified_by": [
        "tests/a2a/test_application.py:68",
        "tests/a2a/test_application.py:90"
      ],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Native first-party A2A facade.** GraphOS exposes a first-party, natively hosted A2A facade rather than proxying through an external bridge, serving card, send, get, list, and cancel operations directly from its own server process. | Integration tests exercise the native A2A endpoints without any external bridge dependency.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 100
    },
    {
      "id": "GRAPHOS-OPS-R038",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Generated OpenAPI served through Swagger UI",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "1fb96633563e",
        "ea736715b7fb",
        "f13ce20b05dc"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Generated OpenAPI served through Swagger UI.** GraphOS generates an OpenAPI document from its operation registry and serves it through a browsable Swagger UI page. | An integration test confirms the served OpenAPI document matches the generated registry and renders through the Swagger UI endpoint.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 101
    },
    {
      "id": "GRAPHOS-OPS-R039",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Dashboard route parity (replaces AU-BOUNDARY-R001.2, commit 0eb67c99c)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Dashboard route parity (replaces AU-BOUNDARY-R001.2, commit 0eb67c99c).** Every route of the deleted dashboard router is served by graph-os with the same capability split and refusals. Already provided; this row adds proof only. | tests/gateway/test_dashboard_route_census.py passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 102
    },
    {
      "id": "GRAPHOS-OPS-R039.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one test in tests/gateway/test_dashboard_route_census.py asserting the served dashboard router exposes all 15 old method and path pairs",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one test in tests/gateway/test_dashboard_route_census.py asserting the served dashboard router exposes all 15 old method and path pairs. | The test fails when a route is removed.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 103
    },
    {
      "id": "GRAPHOS-OPS-R039.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one test in tests/gateway/test_dashboard_api.py asserting read-capability callers get 403 on PUT /layout, POST /daemon/start, POST /hydrate and POST /hydrate/{source}, while API-key callers pass",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one test in tests/gateway/test_dashboard_api.py asserting read-capability callers get 403 on PUT /layout, POST /daemon/start, POST /hydrate and POST /hydrate/{source}, while API-key callers pass. | The test passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 104
    },
    {
      "id": "GRAPHOS-OPS-R039.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one test in tests/gateway/test_dashboard_api.py asserting GET /health returns 200 without a capability and sets Cache-Control no-store",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one test in tests/gateway/test_dashboard_api.py asserting GET /health returns 200 without a capability and sets Cache-Control no-store. | The test passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 105
    },
    {
      "id": "GRAPHOS-OPS-R039.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one test in tests/gateway/test_dashboard_api.py asserting a malformed hydrate source returns 422 and an unknown service id returns 404",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one test in tests/gateway/test_dashboard_api.py asserting a malformed hydrate source returns 422 and an unknown service id returns 404. | The test passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 106
    },
    {
      "id": "GRAPHOS-OPS-R039.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one test in tests/gateway/test_dashboard_api.py pinning the key set returned by GET /daemon/status and POST /daemon/start against `graph_os.gateway.daemon.daemon_status`, compared with the old keys role, threads, jobs and queue depth",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one test in tests/gateway/test_dashboard_api.py pinning the key set returned by GET /daemon/status and POST /daemon/start against `graph_os.gateway.daemon.daemon_status`, compared with the old keys role, threads, jobs and queue depth. | The test passes and fails when a key is dropped.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 107
    },
    {
      "id": "GRAPHOS-OPS-R039.6",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Replace the `agent_utilities.knowledge_graph.core.shard_topology` import in graph_os/gateway/dashboard_api.py `daemon_shards` with the engine client shard-topology method, after a contract test in tests/gateway/test_dashboard_api.py shows the installed client exposes it (`GRAPHOS-HOST-R002`). BLOCKED on the engine client owner if the method is absent",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Replace the `agent_utilities.knowledge_graph.core.shard_topology` import in graph_os/gateway/dashboard_api.py `daemon_shards` with the engine client shard-topology method, after a contract test in tests/gateway/test_dashboard_api.py shows the installed client exposes it (`GRAPHOS-HOST-R002`). BLOCKED on the engine client owner if the method is absent. | tests/gateway/test_dashboard_api.py: response unchanged, no AU knowledge_graph import in the module.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 108
    },
    {
      "id": "GRAPHOS-OPS-R039.7",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Replace `_active_engine` and `_hydration_manager` in graph_os/gateway/dashboard_api.py with the engine client source-sync methods, keeping 500 on no engine, 400 on `ValueError` and 422 on a malformed source",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Replace `_active_engine` and `_hydration_manager` in graph_os/gateway/dashboard_api.py with the engine client source-sync methods, keeping 500 on no engine, 400 on `ValueError` and 422 on a malformed source. | tests/gateway/test_dashboard_api.py: the four refusal codes and the status shape are unchanged.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 109
    },
    {
      "id": "GRAPHOS-OPS-R039.8",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one test in tests/gateway/test_registry.py asserting GET /widgets returns every widget type of the deleted registry module map except `genius_agent`, with the same field set",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one test in tests/gateway/test_registry.py asserting GET /widgets returns every widget type of the deleted registry module map except `genius_agent`, with the same field set. | The test passes against the list recorded in the test.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 110
    },
    {
      "id": "GRAPHOS-OPS-R039.9",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Replace the `agent_utilities.core.config` and `agent_utilities.security.identity` imports in `_dashboard_capabilities` in graph_os/gateway/dashboard_api.py with a public `agent_utilities.api` capability resolver. Cross-repo prerequisite (owner: agent-utilities): export it under `AU-BOUNDARY-R013`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Replace the `agent_utilities.core.config` and `agent_utilities.security.identity` imports in `_dashboard_capabilities` in graph_os/gateway/dashboard_api.py with a public `agent_utilities.api` capability resolver. Cross-repo prerequisite (owner: agent-utilities): export it under `AU-BOUNDARY-R013`. | tests/gateway/test_dashboard_api.py: 403 cases unchanged; an import census shows no AU-internal import.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 111
    },
    {
      "id": "GRAPHOS-OPS-R040",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Live Artifacts routes (replaces AU-BOUNDARY-R001.3, commit 902f906ca)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Live Artifacts routes (replaces AU-BOUNDARY-R001.3, commit 902f906ca).** graph-os serves create, get and refresh for Live Artifacts over the agent-utilities store. To build. | The artifact tests below pass and the routes are mounted by the host.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 112
    },
    {
      "id": "GRAPHOS-OPS-R040.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Cross-repo prerequisite (owner: agent-utilities)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Cross-repo prerequisite (owner: agent-utilities).** Export the Live Artifact store getter, artifact model, refresh service and bounded-JSON error through a public agent_utilities.api module. | An agent-utilities test imports each name from the public module.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 113
    },
    {
      "id": "GRAPHOS-OPS-R040.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one typed model: create-artifact request in graph_os/gateway/artifacts_api.py, rejecting empty template and oversize data",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one typed model: create-artifact request in graph_os/gateway/artifacts_api.py, rejecting empty template and oversize data. | Refusal tests in tests/gateway/test_artifacts_api.py.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 114
    },
    {
      "id": "GRAPHOS-OPS-R040.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one port: artifact store and refresh ports plus a resolver callable type in graph_os/gateway/ports.py",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one port: artifact store and refresh ports plus a resolver callable type in graph_os/gateway/ports.py. | tests/gateway/test_ports.py checks the ports are protocols.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 115
    },
    {
      "id": "GRAPHOS-OPS-R040.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one route: POST /api/artifacts, returning id and rendered output, 400 on a bounded-JSON error",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one route: POST /api/artifacts, returning id and rendered output, 400 on a bounded-JSON error. | test_artifacts_api.py create and refusal cases.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 116
    },
    {
      "id": "GRAPHOS-OPS-R040.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one route: GET /api/artifacts/{artifact_id}, 404 when absent",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one route: GET /api/artifacts/{artifact_id}, 404 when absent. | test_artifacts_api.py get and 404 cases.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 117
    },
    {
      "id": "GRAPHOS-OPS-R040.6",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one route: POST /api/artifacts/{artifact_id}/refresh with inline data or resolver, 404 when absent, prior render preserved on failure",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one route: POST /api/artifacts/{artifact_id}/refresh with inline data or resolver, 404 when absent, prior render preserved on failure. | test_artifacts_api.py refresh, 404 and failure cases.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 118
    },
    {
      "id": "GRAPHOS-OPS-R040.7",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Wire one call site: a register function in graph_os/gateway/artifacts_api.py called where the host mounts the graph and usage routes, reusing `_require_dashboard_read` on GET and `_require_dashboard_write` on POST from graph_os/gateway/dashboard_api.py (capabilities, not engine scopes; decision D3)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Wire one call site: a register function in graph_os/gateway/artifacts_api.py called where the host mounts the graph and usage routes, reusing `_require_dashboard_read` on GET and `_require_dashboard_write` on POST from graph_os/gateway/dashboard_api.py (capabilities, not engine scopes; decision D3). | tests/gateway/test_artifacts_route_mount.py asserts the routes and the 403 cases.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 119
    },
    {
      "id": "GRAPHOS-OPS-R040.8",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Wire one function: pass the exported `kg_source_resolver` (row GRAPHOS-OPS-R040.1) as the artifacts register function's resolver argument in graph_os/gateway/artifacts_api.py; no graph-os re-derivation code. Without it the default preserve-prior-data resolver is used",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Wire one function: pass the exported `kg_source_resolver` (row GRAPHOS-OPS-R040.1) as the artifacts register function's resolver argument in graph_os/gateway/artifacts_api.py; no graph-os re-derivation code. Without it the default preserve-prior-data resolver is used. | test_artifacts_api.py resolver cases with a fake resolver.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 120
    },
    {
      "id": "GRAPHOS-OPS-R040.9",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Cross-repo prerequisite (owner: agent-utilities): add the proposed `AU-BOUNDARY-R013.<n>` row of plan.md D4 to specs/au-boundary-deconstruction/requirements.md. It is the concrete form of GRAPHOS-OPS-R040.1",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Cross-repo prerequisite (owner: agent-utilities): add the proposed `AU-BOUNDARY-R013.<n>` row of plan.md D4 to specs/au-boundary-deconstruction/requirements.md. It is the concrete form of GRAPHOS-OPS-R040.1. | The agent-utilities row exists and GRAPHOS-OPS-R040.1 cites its ID.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 121
    },
    {
      "id": "GRAPHOS-OPS-R040.10",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one test in tests/gateway/test_artifacts_route_mount.py asserting a caller without gateway:read gets 403 on GET and a caller with only gateway:read gets 403 on both POST routes, while API-key callers pass",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one test in tests/gateway/test_artifacts_route_mount.py asserting a caller without gateway:read gets 403 on GET and a caller with only gateway:read gets 403 on both POST routes, while API-key callers pass. | The test passes (decision D3).",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 122
    },
    {
      "id": "GRAPHOS-OPS-R041",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Agent summary widget dropped (replaces AU-BOUNDARY-R001.7, commit 7717d2e62)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Agent summary widget dropped (replaces AU-BOUNDARY-R001.7, commit 7717d2e62).** The widget is intentionally not carried over because it returned constant data. | The gate test passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 123
    },
    {
      "id": "GRAPHOS-OPS-R041.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Add one test in tests/gateway/test_registry.py asserting genius_agent is absent from the widget registry and no fixed-value widget is registered",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "Add one test in tests/gateway/test_registry.py asserting genius_agent is absent from the widget registry and no fixed-value widget is registered. | The test passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 124
    },
    {
      "id": "GRAPHOS-OPS-R042",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Served operations screen untrusted content and redact secrets (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Served operations screen untrusted content and redact secrets (rollup).** The host must screen fetched content before a run reads it, bound each request, and redact secrets from each response. | All child rows are verified.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 126
    },
    {
      "id": "GRAPHOS-OPS-R042.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Model.** Add `ContentScreenVerdict` (closed values `clean`, `flagged`, `quarantined`), `ScreenFinding` (class, span, rule id) and `ContentOrigin` (`trusted`, `open_web`) in graph_os/api/invoke/screening.py. | tests/api/test_content_screening.py checks the closed value sets.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 127
    },
    {
      "id": "GRAPHOS-OPS-R042.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Behavior.** The default `default_screen_rules` must strip or flag hidden, rendered or markup-embedded instructions and tag each finding with one attack class (perception, reasoning, memory, action, multi-agent, overseer). The default `default_output_redactor` must mask secret values. Each default is replaceable by name. | Unit tests in tests/api/test_content_screening.py cover each class and a masked secret.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 128
    },
    {
      "id": "GRAPHOS-OPS-R042.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Wiring.** Call the screen and the redactor inside `invoke` at graph_os/api/invoke/pipeline.py:810. The screen must run on open-web content before the effect, and the redactor on the result before it returns. The production caller is the served route at graph_os/api/http/routes.py:127. This row creates the call site. | tests/api/test_content_screening.py asserts the call order through `invoke`.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 129
    },
    {
      "id": "GRAPHOS-OPS-R042.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Refusal.** `invoke` must return `OpError(\"CONTENT_QUARANTINED\")` for quarantined content. It must refuse a long-term memory write from unscreened open-web content with reason `UNSCREENED_MEMORY_WRITE`. An oversize request keeps the body-size refusal at graph_os/api/http/routes.py:42. | Refusal tests in tests/api/test_content_screening.py.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 130
    },
    {
      "id": "GRAPHOS-OPS-R042.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Evidence.** The operation trace must record the verdict, finding classes, rule ids and redaction count. It must not record the matched text. | A trace test in tests/api/test_content_screening.py asserts the fields and the absence of secret text.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 131
    },
    {
      "id": "GRAPHOS-OPS-R042.6",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Hot-path proof.** The served route at graph_os/api/http/routes.py enters `invoke` (entry point: the served invoke operation), passes the wired screen, and the test observes a quarantined refusal for planted hidden instructions and a masked secret in a clean response. | tests/gateway/test_content_screening_hot_path.py passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 132
    },
    {
      "id": "GRAPHOS-OPS-R050",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Policy lifecycle operations that guard plans",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Policy lifecycle operations that guard plans.** GraphOS serves operations that turn a constitution into policy entities. Policy entities change only through approved operations: create, update or retire. GraphOS refuses a plan that violates an active policy. The engine decides violation under EG-DECISION-ENGINE-R001. Policy semantics and decision verdicts belong to EG-DECISION-ENGINE-R001; the harness only applies engine decisions. | The hot-path proof row passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 145
    },
    {
      "id": "GRAPHOS-OPS-R050.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Model.** Add `PolicyEntity`, `ConstitutionSource` and `PolicyChange` to graph_os/api/ops/policy.py. The `change` field takes the closed set create, update, retire. Existing `PolicyVersion` at graph_os/control_plane/policy/models.py:203 lacks a constitution link and a retired state. | tests/api/test_policy_models.py covers field validation and the closed set.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 146
    },
    {
      "id": "GRAPHOS-OPS-R050.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Behavior.** Submit constitution clauses through a public engine policy-decision port under EG-DECISION-ENGINE-R001; GraphOS projects the returned PolicyEntity references and never interprets clauses locally. Reuse `PolicyAuthority.publish` at graph_os/control_plane/policy/repository.py:117 for approved operation publication. The engine adapter is new wiring and must remain unavailable until its producer contract is published. A retired policy must stay resolvable by version. | tests/api/test_policy_convert.py asserts one entity per clause and stable digests.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 147
    },
    {
      "id": "GRAPHOS-OPS-R050.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Wiring.** Register `policy.create`, `policy.update` and `policy.retire` with `Confirm.PLAN` beside `handle_policy_read` at graph_os/api/ops/policy.py:36. Attach plan admission in `_policy` at graph_os/api/invoke/pipeline.py:198. `PolicyAuthority.authorize` at graph_os/control_plane/policy/repository.py:179 has no production caller today. This row binds the new EG-backed policy service at `build_operation_runtime` (`graph_os/api/invoke/bootstrap.py:167`) and calls it from `_base_authority` at graph_os/api/invoke/pipeline.py:208; no GraphOS policy evaluator substitutes for a missing producer. | tests/api/test_policy_wiring.py sends an authenticated served request through the composition root and shared invoke to the EG-backed service; an absent producer refuses with zero effects.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 148
    },
    {
      "id": "GRAPHOS-OPS-R050.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Refusal.** Refuse a policy change without a verified approval with `POLICY_DENIED`. Refuse a plan that violates an active policy with `POLICY_DENIED` and the policy reference. Return `POLICY_UNAVAILABLE` when the engine decision is unreachable. | tests/api/test_policy_refusal.py covers all three refusals with zero effects.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 149
    },
    {
      "id": "GRAPHOS-OPS-R050.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Evidence.** Emit the policy reference, version digest, approval reference and outcome. Write them on the audit record of each change and each refused plan. | tests/api/test_policy_evidence.py reads the audit record fields.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 150
    },
    {
      "id": "GRAPHOS-OPS-R050.6",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Hot-path proof.** Entry point: the served operation `policy.create` over POST /api/v1/ops/{op_id}. Then submit a plan through the invoke pipeline. Integration test tests/integration/test_policy_plan_guard.py creates a policy with approval and observes the refusal of a violating plan. | The integration test passes through shared invoke and the named producer port; missing producer contracts remain typed unavailable, never local policy substitutes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 151
    },
    {
      "id": "GRAPHOS-OPS-R051",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Scoped security-evaluation operation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Scoped security-evaluation operation.** GraphOS serves a security-evaluation operation. It accepts a natural-language goal. EG selects the attack/transform/scorer composition from its declared catalog and returns scoring verdicts. AU executes the selected probes. GraphOS authorizes transport, exposes findings and refuses targets outside the verified authorized scope [arXiv:2605.04019]. EG-DECISION-ENGINE-R138 owns attack/transform/scorer records, scorer selection and probe verdicts; EG-DECISION-ENGINE-R001 owns decisions. AU executes the engine-selected probes only. | The hot-path proof row passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 152
    },
    {
      "id": "GRAPHOS-OPS-R051.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Model.** Add `EvaluationGoal`, `EvaluationCatalog`, `EvaluationScope` and `Finding` models in new graph_os/api/ops/security_eval.py. The search found nothing with these terms. `SecurityPolicyMiddleware` at graph_os/security/security_policy_middleware.py:52 only detects jailbreak patterns on input. | tests/api/test_security_eval_models.py covers the models.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 153
    },
    {
      "id": "GRAPHOS-OPS-R051.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Behavior.** Request engine catalog selection under EG-DECISION-ENGINE-R001 and scorer selection/verdicts under EG-DECISION-ENGINE-R138. Enforce the engine-provided probe cap (named default 50) and runtime quota under EG-DECISION-ENGINE-R133; AU executes probes and submits results. GraphOS validates scope and transports the request without local composition or scoring. Producer adapters are new wiring and unavailable until their public contracts exist. | tests/api/test_security_eval_select.py asserts only declared catalog entries appear.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 154
    },
    {
      "id": "GRAPHOS-OPS-R051.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Wiring.** Register `security.evaluate` beside the security read operations in graph_os/api/ops/security.py and list it in graph_os/api/ops/registry_factory.py. No production caller exists today. This row creates the call site, reached from `_effect` at graph_os/api/invoke/pipeline.py:218. | tests/api/test_security_eval_wiring.py asserts the registry lists the operation.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 155
    },
    {
      "id": "GRAPHOS-OPS-R051.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Refusal.** Refuse a target outside the caller's verified authorized target scope with `SUBJECT_ACCESS_DENIED` before any attack runs. Refuse a goal that selects no catalog entry with `INVALID_ARGUMENT`. | tests/api/test_security_eval_refusal.py asserts zero runs started.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 156
    },
    {
      "id": "GRAPHOS-OPS-R051.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Evidence.** Emit the goal digest, selected catalog entries, target and scope references and finding count. Write them on the audit record. | tests/api/test_security_eval_evidence.py reads the record fields.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 157
    },
    {
      "id": "GRAPHOS-OPS-R051.6",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Hot-path proof.** Entry point: the served operation `security.evaluate` over POST /api/v1/ops/{op_id}. Integration test tests/integration/test_security_evaluate.py runs an in-scope target and observes findings. It then runs an out-of-scope target and observes the refusal. | The integration test passes through shared invoke and the named producer port; missing producer contracts remain typed unavailable, never local policy substitutes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 158
    },
    {
      "id": "GRAPHOS-OPS-R052",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Authorization-segmented virtual schema projections",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Authorization-segmented virtual schema projections.** GraphOS segments knowledge-graph query results by authorization boundary. It exposes the segments as virtual schema projections. A caller sees only the projections that its scope covers. The engine owns segmentation under EG-IDENTITY-R001 and EG-FEDERATED-QUERY-R001. GRAPHOS-DATA-MARKET-R005 owns the schema_context surface. | The hot-path proof row passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 159
    },
    {
      "id": "GRAPHOS-OPS-R052.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Model.** Add `SchemaProjection` with fields boundary, scope, tables and mapping reference in new graph_os/api/ops/projections.py. Existing `build_read_op` at graph_os/api/ops/_common.py:106 and the caller-filtered projection at graph_os/api/http/openapi.py:1 lack a result-level projection type. | tests/api/test_projection_models.py covers the fields.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 160
    },
    {
      "id": "GRAPHOS-OPS-R052.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Behavior.** Return the projections that the caller's verified grants cover, through the named default `scope_covers`. The engine supplies the boundary labels. GraphOS must not infer them. | tests/api/test_projection_scope.py asserts exact-cover and partial-cover cases.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 161
    },
    {
      "id": "GRAPHOS-OPS-R052.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Wiring.** Register `query.projections` using `build_read_op` at graph_os/api/ops/_common.py:106 beside the query operations. No production caller exists today. This row creates the call site, reached from `build_operation_runtime` at graph_os/api/invoke/bootstrap.py:167. | tests/api/test_projection_wiring.py asserts the registry lists the operation.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 162
    },
    {
      "id": "GRAPHOS-OPS-R052.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Refusal.** Return `SUBJECT_ACCESS_DENIED` when no projection is covered. Return `UNAVAILABLE` when the engine returns no boundary labels. Uncovered projections must not appear directly or indirectly in caller-visible responses, counts or traces, including refusal details and caller-readable audit views. | tests/api/test_projection_refusal.py covers both refusals and excludes hidden-projection counts from every caller-visible surface.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 163
    },
    {
      "id": "GRAPHOS-OPS-R052.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Evidence.** Record the caller scope and returned projection references in the audit record. A withheld count may be recorded only in a separately authorized operator audit. The denied caller must never read it through the response, traces or any audit view. | tests/api/test_projection_evidence.py proves an authorized operator can read the withheld count. The denied caller cannot access that field or its audit record.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 164
    },
    {
      "id": "GRAPHOS-OPS-R052.6",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Hot-path proof.** Entry point: the served operation `query.projections` over POST /api/v1/ops/{op_id}. Integration test tests/integration/test_projection_scope.py calls it with two scopes and observes different projection sets. Holding caller-visible projections fixed, vary only hidden projections and assert identical caller-visible response contents, counts, refusal details and trace fields. Attempt operator-audit reads as the denied caller and assert refusal without count leakage; a separately authorized operator can read the withheld count. | The integration test passes through shared invoke and the named producer port; missing producer contracts remain typed unavailable, never local policy substitutes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 165
    },
    {
      "id": "GRAPHOS-OPS-R053",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Bounded interaction space",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Bounded interaction space.** GraphOS serves an operation that returns a bounded interaction space, not ranked snippets. The space holds a corpus boundary of documents. The boundary is the union of top-K results of multi-query lexical search. Each query gets one working directory. The space documents object properties and navigation commands [arXiv:2606.06880]. The engine owns ranking under EG-FEDERATED-QUERY-R001. EG-DECISION-ENGINE-R029 owns retrieval-plan decisions and EG-DECISION-ENGINE-R137 owns context budgets; AU executes the engine-directed exploration. SDK-CONNECTOR-CONTROL-R005 owns connector source submission. GRAPHOS-OPS-R021.2 owns `retrieval.search`. | The hot-path proof row passes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 166
    },
    {
      "id": "GRAPHOS-OPS-R053.1",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Model.** Add `InteractionSpace`, `CorpusBoundary` and `QueryDirectory` models in graph_os/api/ops/retrieval.py. The existing `Retriever` port at graph_os/api/ops/retrieval.py:60 returns hits only. It lacks a directory layout and property documentation. | tests/api/test_interaction_space_models.py covers the models.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 167
    },
    {
      "id": "GRAPHOS-OPS-R053.2",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Behavior.** Project the engine-selected boundary as the union of top-K query hits, using engine-provided limits (named defaults K=20 and query cap=8). GraphOS renders one directory per query and documents object properties; EG owns retrieval/context decisions, and AU executes exploration. | tests/api/test_interaction_space_build.py asserts union, caps and directory names.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 168
    },
    {
      "id": "GRAPHOS-OPS-R053.3",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Wiring.** Register `retrieval.space` beside `handle_retrieval_search` at graph_os/api/ops/retrieval.py:77. It reuses `GovernedRetriever.retrieve` at graph_os/control_plane/retrieval/service.py:61. No production constructor of `GovernedRetriever` exists today. This row constructs and binds the EG-backed retrieval service in `build_operation_runtime` at graph_os/api/invoke/bootstrap.py:167 and connects its public engine client; registry registration alone does not prove wiring. | tests/api/test_interaction_space_wiring.py sends a served authenticated request through shared invoke and the composed EG-backed retriever, and checks typed refusal when its producer is missing.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 169
    },
    {
      "id": "GRAPHOS-OPS-R053.4",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Refusal.** Refuse a request above the document cap with `LOAD_CAP_EXCEEDED`. Refuse an empty query list with `INVALID_ARGUMENT`. Return `UNAVAILABLE` when the retriever is not composed. | tests/api/test_interaction_space_refusal.py covers all three.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 170
    },
    {
      "id": "GRAPHOS-OPS-R053.5",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Evidence.** Emit the query count, boundary size, per-query hit count and context budget used. Write them on the audit record. | tests/api/test_interaction_space_evidence.py reads the fields.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 171
    },
    {
      "id": "GRAPHOS-OPS-R053.6",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Hot-path proof.** Entry point: the served operation `retrieval.space` over POST /api/v1/ops/{op_id}. Integration test tests/integration/test_retrieval_space.py runs two queries and observes the boundary and two directories. | The integration test passes through shared invoke and the named producer port; missing producer contracts remain typed unavailable, never local policy substitutes.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 172
    },
    {
      "id": "GRAPHOS-OPS-R054",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Technique-bound benchmark adoption",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Technique-bound benchmark adoption.** Require `AU-INTEGRATION-R014` to publish a producer operation and receipt contract. Bind paged cache, prefix reuse, fused kernels, quantized cache, and expert dispatch to the exact model/configuration, measured gain or non-regression, and activation decision. `graph_os/api/ops/agents.py:handle_rlm` serves `rlm.benchmark`, not AU serving-technique evidence. After the AU contract exists, attach a separate GraphOS projection through `graph_os/api/ops/registry_factory.py:get_registry` and `graph_os/api/invoke/pipeline.py:invoke`. Keep activation unavailable until then. | Future acceptance: `tests/api/test_agent_browser_ops.py::test_benchmark_activation_requires_technique_bound_evidence`. Verify all five technique identities bind to the model/configuration and measured result. Verify missing, mismatched, or regressing evidence refuses activation with no serving effect. No threshold is invented. The proposed test has not run.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 173
    },
    {
      "id": "GRAPHOS-OPS-R055",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Run-bound process remediation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Run-bound process remediation.** Require liveness evidence naming the run and process. Distinguish zombie/hung detection from ordinary progress. GraphOS may expose a proposal only. Termination requires explicit approval bound to the same run and process; quota is not authority. Attach through `graph_os/api/ops/registry_factory.py:get_registry` and `graph_os/api/invoke/pipeline.py:invoke`. The AU liveness detector and proposal operation remain unspecified. Keep reads and remediation unavailable until that contract is published. | Future acceptance: `tests/api/test_ops_admin_ops.py::test_process_remediation_requires_run_bound_approval`. Verify run/process identity and proposal-only behavior before approval. Verify one authorized application after approval. Missing, stale, or mismatched evidence must refuse with zero process effects. The proposed test has not run.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 174
    },
    {
      "id": "GRAPHOS-OPS-R056",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Source-bound changeset review",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Source-bound changeset review.** Bind each review result to the exact source changeset. Require evidence-backed findings for injection, authorization bypass, data exposure, cryptography, and business-logic flaws. Include a declared low-impact false-positive filter. Project only an owner-produced verdict through `graph_os/api/ops/registry_factory.py:get_registry` and `graph_os/api/invoke/pipeline.py:invoke`. `graph_os/api/ops/decide.py:handle_decide_commit` owns `decide.commit`, not review. The EG/AU review operation and evidence contract remain unspecified, so no review is served. | Future acceptance: `tests/api/test_decide_ops.py::test_changeset_review_binds_revision_classes_and_findings`. Verify every finding references the same diff/source revision. Verify impact filtering preserves evidence. Missing or mismatched owner verdicts must refuse without a review claim. The proposed test has not run.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 175
    },
    {
      "id": "GRAPHOS-OPS-R057",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Stable prompt serialization and difference oracle",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Stable prompt serialization and difference oracle.** Define deterministic JSON for the Pydantic disk representation and a semantic difference oracle. The current GraphOS tree has no `RepositoryWriteBackParams` or served repository-writeback handler. If those contracts justify an operation, attach it through `graph_os/api/ops/registry_factory.py:get_registry` and `graph_os/api/invoke/pipeline.py:invoke`. Do so only after EG `R094.2/.3/.5/.7` and SDK source-effect/receipt contracts are published. Keep the operation unavailable until then. | Future acceptance: `tests/api/test_write_back_models.py::test_prompt_json_roundtrip_and_difference_oracle_is_stable`. Verify stable round-trip serialization, semantic equivalence, true semantic changes, and existing source-effect refusals. The proposed test has not run.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 176
    },
    {
      "id": "GRAPHOS-OPS-R058",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Authorized table-browser projection",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Authorized table-browser projection.** Reuse the read-only `graph_os/gateway/schema_context_api.py:register_schema_context_routes` and `graph_os/gateway/schema_context_service.py:get_schema_context` attachment. Bind only owner-authorized table data. WebUI table-control/statistics requirements and EG producer bindings remain unassigned. Keep data unavailable until those contracts are published. Define no table mutation or statistics projection here. | Future acceptance: `tests/gateway/test_schema_context_api.py::test_table_browser_projection_requires_owner_binding`. Verify authorized data and denied scope. Verify missing producer and zero calls/effects on refusal. Add a served WebUI consumer acceptance after the owner contract is assigned. The proposed test has not run.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 177
    },
    {
      "id": "GRAPHOS-OPS-R061",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Indexed token and cost projection",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Indexed token and cost projection.** Model: UsageQueryV1 accepts a bounded time window. It also accepts model, project, and agent filters with grouping. It accepts currency, bounded page size, and a snapshot cursor. Derive tenant scope only from the verified caller. UsageProjectionV1 preserves four disjoint EG counters: uncached input, cached input, nonreasoning output, and reasoning output. Preserve producer-derived input and output totals. Include amount, currency, minor unit, accounting revision, pinned PriceTableV1 revision, and currency revision. Also include source coverage, index watermark, cursor, and latency-profile metadata. That metadata carries producer profile revision, p95 bound and units, measurement boundary, workload, indexed dataset size, and data/index/cache-policy revisions. Apply exact-rational aggregation per final group and category. Round half-even once after each final aggregation. Keep unknown attribution, price, or currency explicitly unknown with a reason and coverage. Never convert unknown values to zero. Keep currencies separate unless EG supplies a pinned FX revision. Behavior: Map to RunTraceUsageQueryV1 under EG-ORCH-VOCAB-R010.101. GraphOS forwards producer aggregates and performs no token or cost arithmetic. Bind the producer p95 profile at 500 ms. Measure from authenticated-handler entry through serialized response. Use 1,000,000 indexed traces, 32 readers, and 1,000 fixed-window queries. Bind data, index, and cache-policy revisions. Reject caller-selected replacement bounds. Wiring: Extend graph_os/api/ops/usage.py beside usage.read with a distinct usage.index.query and typed EG reader. Use build_read_op with existing usage:read. Register through the existing registry factory and shared invoke path. WebUI counterpart: WEBUI-APPS-R004.8.1-.6 via ObservabilityView.tsx. Preserve GRAPHOS-OPS-R021.4.3/.4 runs.metrics grouping. Preserve zero-solved abstention and cost-per-solved-task semantics. usage.read context peaks and budgets are not total usage. Refusal: Authorize and bind tenant before EG dispatch. Denied or foreign scope, stale cursors, and revision mismatches expose no rows. Treat stale profile, watermark, or currency revisions as refusals. Missing, nonfinite, nonpositive, or exceeded latency evidence returns typed UNAVAILABLE without usage aggregates. Unknown attribution, price, or currency stays unknown with its reason and coverage. Never use zero or calculate mixed-currency totals. Evidence: A served browser query reconciles each grouping against an independent EG ledger. Record the bound, units, boundary, workload, measured p95, and data/index/cache revisions. This definition claims no implemented operation or served receipt. | Planned served acceptance checks four exact counters and producer totals. It covers rational aggregation, half-even rounding, pinned PriceTableV1, minor units, revisions, coverage, watermark, cursor, pagination, unknown-value reasons, denied scope, stale revisions, and absent, invalid, or exceeded latency evidence.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 178
    },
    {
      "id": "GRAPHOS-OPS-R063",
      "kind": "requirement",
      "parent": "GRAPHOS-OPS",
      "source": "specs/hosted-api-operations/status.json",
      "title": "Retrieval evaluation and authorized context projection",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-OPS \u2014 Hosted API and intent operations",
      "definition": "**Retrieval evaluation and authorized context projection.** Model: RetrievalEvaluationQueryV1 binds corpus/revision/digest, relevance-label-set/revision/digest, query-set ID/revision/digest, evaluator revision, and k from 1 through 1000. It requires at least two registered algorithm IDs, versions, and settings digests. RetrievalComparisonV1 preserves producer numerator, denominator, metric, and input/result digests. For hits_at_k, the denominator is the complete identically labeled query set. The numerator counts queries with at least one relevant result in top k. RetrievalContextV1 preserves document/revision/digest and half-open UTF-8 byte offsets into original stored text. Every result carries query/index/authorization revisions and an opaque snapshot-bound cursor. Limit each response to 100 spans and each span to 8 KiB. Behavior: Forward EG-DECISION-ENGINE-R100.100 DecisionEval RetrievalRankingSubmit/RetrievalRankingV1 and Method::RetrievalContextSearch/RetrievalContextSearchV1. All algorithms share the corpus, complete label-set revision/digest, query-set ID/revision/digest, evaluator revision, k, and query inputs. Pin each algorithm's settings digest to its own registered configuration and preserve it in the result. GraphOS never computes hits_at_k or treats local RRF as relevance truth. If indexing normalizes text, preserve a separate NFC digest and producer index digest. Validate the normalized-to-original byte map. Public offsets still address the stored-text digest and original bytes. Wiring: Extend graph_os/api/ops/retrieval.py with typed retrieval.evaluation.compare and retrieval.context.search models and producer ports. Use build_read_op, memory:read, registry_factory, and shared invoke. WebUI counterpart: WEBUI-APPS-R001.1.1-.6 via src/components/table-explorer/TryItPanel.tsx and its generated GraphOS client. Refusal: Denied scope refuses before dispatch. Missing labels, an incomplete query set, or a zero denominator refuses. Mismatched corpus, labels, evaluator, or query inputs refuse. Missing or mismatched per-algorithm settings digests refuse against that algorithm's registered configuration. Stale cursor/revisions, invalid offsets/maps, and over-limit spans return typed refusals. Refusals expose no partial metrics, protected counts, or offsets. Evidence: A served fixed-corpus test compares two registered algorithms against an independent hits_at_k ledger. Use the same complete labeled query set and pinned evaluator revision. Composed/decomposed Unicode and multibyte cases prove byte slicing against original stored text. Escape hostile source before highlighting. Preserve the original byte spans. Refusal cases cover missing labels, stale/cross-tenant state, bad maps/offsets, and bounds. This definition claims no implemented operation or served receipt. | Planned served acceptance checks identical inputs, metric numerator/denominator meanings, and result digests. It verifies original-text UTF-8 spans, NFC digest, validated mapping, cursor binding, and limits. It tests escaping hostile source before highlighting. It covers authenticated, stale, missing-label, zero-denominator, invalid-map, and refusal cases.",
      "definition_source": "specs/hosted-api-operations/requirements.md",
      "definition_line": 179
    },
    {
      "id": "GRAPHOS-IDENTITY",
      "kind": "spec",
      "parent": null,
      "source": "specs/identity-access/status.json",
      "title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/identity-access/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/authority.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/authority.py"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/access/service.py:90",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/access/service.py#L90"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/http/auth.py:127",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/http/auth.py#L127"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/invoke/audit.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/invoke/audit.py"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/mcp/caller.py:12",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/mcp/caller.py#L12"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/api/ops/access.py:151",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/api/ops/access.py#L151"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/deployment/cli.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/deployment/cli.py"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/gateway/graph_api.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/gateway/graph_api.py"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/gateway/remote_oauth_api.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/gateway/remote_oauth_api.py"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/gateway/remote_oauth_api.py:245",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/gateway/remote_oauth_api.py#L245"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/identity/composition.py:48",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/identity/composition.py#L48"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/identity/oidc.py:102",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/identity/oidc.py#L102"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/mcp_server/server.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/mcp_server/server.py"
        },
        {
          "declared_in": "specs/identity-access/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/webui_host/webui_co_service.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/webui_host/webui_co_service.py"
        },
        {
          "declared_in": "specs/identity-access/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/identity-access/requirements.md"
        }
      ],
      "relations": [],
      "plan_diagrams": [
        "flowchart LR\n    B[\"Browser, CLI, MCP, A2A\"] --> C[GraphOS serving composition]\n    C --> A[Authenticator per mode]\n    A --> P[Principal and scope resolver]\n    P --> I[Local issuer and short-lived token]\n    I --> U[Verified actor and delegated session]\n    U --> E[\"Engine identity, RBAC, CheckAccess, elevation, lease, audit\"]\n    E --> R[Typed redacted result]\n    R --> C\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-IDENTITY-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Elevation request, approve, and revoke surfaces",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4a3410afa6de"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Elevation request, approve, and revoke surfaces.** GraphOS exposes elevation request, approval, and revoke actions through its web console, its A2A authority boundary, and chat-based tooling. Each surface invokes the engine's access service rather than deciding locally. | Verified by an integration test exercising the REST and MCP access operations from each surface. It also confirms self-approval and delegated-approval attempts are denied.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-IDENTITY-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Domain scopes consume the generated scope registry",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "a2212420d6c6",
        "d497f656144a"
      ],
      "verified_by": [
        "tests/api/test_domain_scopes.py:50"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Domain scopes consume the generated scope registry.** GraphOS's own domain scopes use the shared scope classes (user, domain, service-only, approver, admin) and are kept consistent with the single generated scope registry rather than a separately maintained list. | Verified by a registry property test asserting every scope GraphOS advertises matches the generated registry's name and class.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-IDENTITY-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Persistent local token issuer with secret-backed key",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "9a8cbf921748",
        "c4c9cb1fac8f"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Persistent local token issuer with secret-backed key.** GraphOS runs a persistent local token issuer that publishes discovery and JWKS metadata under a well-known path, stores its signing key as a secret reference, rotates keys with bounded overlap, and exchanges tokens from an external identity provider or a local authenticator for a verified local principal token. | Verified by a contract test validating discovery/JWKS responses, stable token subject identity, and bounded-overlap key rotation.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-IDENTITY-R004",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Rollup",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cd652df8f6c8"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Rollup.** See `GRAPHOS-IDENTITY-R004.1` and `GRAPHOS-IDENTITY-R004.2`. In unauthenticated mode, GraphOS resolves a request as the bootstrap principal through the ordinary RBAC and scope path, refuses non-loopback binds unless an explicit exposure acknowledgment is supplied, validates the Host header and same-origin Origin on cookie-mutating requests, and shows an unsecured-mode banner, page title, and doctor diagnostic, with the previously identified authentication bypasses removed. | See children.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-IDENTITY-R004.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Typed bootstrap-principal model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "cd652df8f6c8",
        "d497f656144a"
      ],
      "verified_by": [
        "tests/identity/test_bootstrap_mfa_admin_console_models.py:15",
        "tests/identity/test_bootstrap_mfa_admin_console_models.py:28"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Typed bootstrap-principal model.** `LoopbackBootstrapPrincipal` refuses construction for a non-loopback bind host unless an explicit exposure acknowledgment is set, and refuses an empty bind host. | Verified by refusal unit tests in `tests/identity/test_bootstrap_mfa_admin_console_models.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-IDENTITY-R004.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Bootstrap resolution path",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4a3410afa6de"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Bootstrap resolution path.** Wire the typed model into the ordinary RBAC/scope resolution path, Host/Origin validation on cookie-mutating requests. It also wires the unsecured-mode banner/title/doctor diagnostic. | Verified by a served HTTP/MCP test asserting loopback-only access and Host/Origin rejection before token issuance. It also asserts the unsecured-mode indicators across session, status, and initialize responses.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-IDENTITY-R005",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Local account lifecycle with server-side sessions",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "9a8cbf921748"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Local account lifecycle with server-side sessions.** GraphOS implements local login, logout, registration, password change, and password reset backed by opaque server-side sessions, a CSRF token for cookie-based authentication, session-fixation rotation on login and privilege change, and uniform public error responses that never reveal whether an account exists. | Verified by an end-to-end account-lifecycle test covering CSRF validation, session rotation, and uniform throttled responses for unknown users and wrong passwords.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 11
    },
    {
      "id": "GRAPHOS-IDENTITY-R006",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Optional MFA with TOTP, WebAuthn, and recovery codes",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cd652df8f6c8"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Optional MFA with TOTP, WebAuthn, and recovery codes.** GraphOS supports TOTP, WebAuthn, and one-use recovery codes for multi-factor authentication, with enrollment optional by default globally while an administrator can require it for members of a configured group. | Verified by MFA ceremony tests covering valid and replayed TOTP codes, WebAuthn origin and signature-counter checks, single-use recovery codes, and enforced enrollment for a required group.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 12
    },
    {
      "id": "GRAPHOS-IDENTITY-R006.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Typed MFA enrollment model",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cd652df8f6c8"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Typed MFA enrollment model.** `MfaEnrollment` refuses an unknown MFA method and refuses a required-group enrollment with zero methods. | Verified by refusal unit tests in `tests/identity/test_bootstrap_mfa_admin_console_models.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 13
    },
    {
      "id": "GRAPHOS-IDENTITY-R006.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "MFA ceremonies",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4a3410afa6de"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**MFA ceremonies.** Implement the TOTP, WebAuthn, and recovery-code ceremonies and group-enrollment enforcement over the typed model. | Verified by MFA ceremony tests covering valid and replayed TOTP codes, WebAuthn origin and signature-counter checks, single-use recovery codes, and enforced enrollment for a required group.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 14
    },
    {
      "id": "GRAPHOS-IDENTITY-R007",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Admin console tabs with mapping dry-run and mode wizard",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cd652df8f6c8"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Admin console tabs with mapping dry-run and mode wizard.** GraphOS's web console provides identity administration tabs for users, sessions, providers, and policy, a dry-run view that previews the roles an identity-provider mapping rule would assign, and a guided wizard for switching authentication mode. | Verified by a browser-driven test exercising each admin tab, the mapping dry-run preview, and a full mode-transition walkthrough.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 15
    },
    {
      "id": "GRAPHOS-IDENTITY-R007.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Typed admin-console tab model",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "cd652df8f6c8"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Typed admin-console tab model.** `AdminConsoleTab` refuses a name outside the fixed `users`/`sessions`/`providers`/`policy` set. | Verified by refusal unit tests in `tests/identity/test_bootstrap_mfa_admin_console_models.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 16
    },
    {
      "id": "GRAPHOS-IDENTITY-R007.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Admin console behavior",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4a3410afa6de"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Admin console behavior.** Implement the mapping dry-run preview and mode-transition wizard over the typed tab model. | Verified by a browser-driven test exercising each admin tab, the mapping dry-run preview, and a full mode-transition walkthrough.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 17
    },
    {
      "id": "GRAPHOS-IDENTITY-R008",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "API keys and service accounts replace static MCP tokens",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "e74110bb69b5"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**API keys and service accounts replace static MCP tokens.** GraphOS issues expiring API keys and service accounts in place of static MCP tokens. It intersects a key's effective scopes with its current owner's scopes on every use. It rejects approver-class scopes on keys. It denies a revoked or expired key immediately, with no static-token compatibility path. | Verified by an API-key contract test asserting scope intersection at use time. It also asserts immediate denial of a revoked, expired, or approver-scoped key.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 18
    },
    {
      "id": "GRAPHOS-IDENTITY-R009",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Multi-provider OIDC with mapping rules and JIT policy",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "4a3410afa6de",
        "e74110bb69b5"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Multi-provider OIDC with mapping rules and JIT policy.** GraphOS authenticates through multiple OIDC providers using PKCE, state, and nonce verification, applies deterministic ordered mapping rules with configurable just-in-time user creation or denial, supports a preset configuration for a common identity provider, migrates existing identity links idempotently, and sends a logout hint to the provider where supported. | Verified by an OIDC integration test against mock issuers asserting PKCE/nonce/state validation, mapping-rule outcomes, idempotent link migration, and hinted logout.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 19
    },
    {
      "id": "GRAPHOS-IDENTITY-R010",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "LDAPS bind with nested group sync",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "e74110bb69b5"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**LDAPS bind with nested group sync.** GraphOS binds to a directory over LDAPS, escapes search filters, and synchronizes group membership including nested Active Directory groups, deprovisioning access for disabled directory accounts. | An integration test uses a mock TLS LDAP directory. It covers escaped filters, bounded nested-group resolution and disabled-account deprovisioning.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 20
    },
    {
      "id": "GRAPHOS-IDENTITY-R008.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Typed API-key grant model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "8b0005ee65dd"
      ],
      "verified_by": [
        "tests/identity/test_api_key_grant.py:20",
        "tests/identity/test_api_key_grant.py:26",
        "tests/identity/test_api_key_grant.py:9"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Typed API-key grant model.** `ApiKeyGrant` refuses an approver-class scope and refuses an empty owner principal id. | Verified by refusal unit tests in `tests/identity/test_api_key_grant.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 21
    },
    {
      "id": "GRAPHOS-IDENTITY-R008.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Scope intersection and revocation",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d45ad779b80c"
      ],
      "verified_by": [
        "tests/identity/test_api_key_use_time.py:22",
        "tests/identity/test_api_key_use_time.py:31",
        "tests/identity/test_api_key_use_time.py:39",
        "tests/identity/test_api_key_use_time.py:49"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Scope intersection and revocation.** Intersect effective scopes with the owner's current scopes at use time; deny a revoked or expired key immediately. | Verified by an API-key contract test asserting scope intersection at use time and immediate denial of a revoked, expired, or approver-scoped key.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 22
    },
    {
      "id": "GRAPHOS-IDENTITY-R009.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Typed OIDC mapping-rule model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "6c3a92eb849a"
      ],
      "verified_by": [
        "tests/identity/test_oidc_mapping_rule.py:23",
        "tests/identity/test_oidc_mapping_rule.py:29",
        "tests/identity/test_oidc_mapping_rule.py:36",
        "tests/identity/test_oidc_mapping_rule.py:43"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Typed OIDC mapping-rule model.** `OidcMappingRule` refuses an unknown JIT policy and refuses a negative rule order. | Verified by refusal unit tests in `tests/identity/test_api_keys_oidc_ldap_models.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 23
    },
    {
      "id": "GRAPHOS-IDENTITY-R009.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "OIDC authentication flow (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**OIDC authentication flow (rollup).** Delivered through children `.2.1`-`.2.4`: ordered rule evaluation, ID-token validation, callback wiring, and live IdP probe. | Verified when every child is verified.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 24
    },
    {
      "id": "GRAPHOS-IDENTITY-R009.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Ordered claim-to-rule evaluation",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "0714a7bf6f8e"
      ],
      "verified_by": [
        "tests/identity/test_oidc_rule_selection.py:17",
        "tests/identity/test_oidc_rule_selection.py:24",
        "tests/identity/test_oidc_rule_selection.py:30",
        "tests/identity/test_oidc_rule_selection.py:37",
        "tests/identity/test_oidc_rule_selection.py:43"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Ordered claim-to-rule evaluation.** `select_mapping_rule` returns the lowest-order matching `OidcMappingRule` for a provider and refuses no match, duplicate order, or malformed match. | Verified by unit tests in `tests/identity/test_oidc_rule_selection.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 25
    },
    {
      "id": "GRAPHOS-IDENTITY-R009.2.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "ID-token validation inputs and typed refusal",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4ecc19a9f4e8"
      ],
      "verified_by": [
        "tests/identity/test_oidc_id_token_claims.py:41",
        "tests/identity/test_oidc_id_token_claims.py:47",
        "tests/identity/test_oidc_id_token_claims.py:52",
        "tests/identity/test_oidc_id_token_claims.py:58",
        "tests/identity/test_oidc_id_token_claims.py:66"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**ID-token validation inputs and typed refusal.** Pure PKCE/state/nonce/audience/expiry checks over decoded token claims, refusing any mismatch. | Verified by refusal unit tests.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 26
    },
    {
      "id": "GRAPHOS-IDENTITY-R009.2.3",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Callback handler wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Callback handler wiring.** Wire rule evaluation and token validation into the OIDC callback, with idempotent link migration and hinted logout. | Verified by a callback test against a mock issuer.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 27
    },
    {
      "id": "GRAPHOS-IDENTITY-R009.2.4",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Live IdP probe",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Live IdP probe.** Exercise the flow against a live identity provider (requires a deployed IdP service). | Verified by a live probe against the deployed IdP.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 28
    },
    {
      "id": "GRAPHOS-IDENTITY-R010.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Typed LDAPS bind-config model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "02d2a6e84ec7"
      ],
      "verified_by": [
        "tests/identity/test_ldap_bind_config.py:11",
        "tests/identity/test_ldap_bind_config.py:18",
        "tests/identity/test_ldap_bind_config.py:25"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Typed LDAPS bind-config model.** `LdapBindConfig` refuses a non-`ldaps` scheme and refuses an invalid port. | Verified by refusal unit tests in `tests/identity/test_api_keys_oidc_ldap_models.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 29
    },
    {
      "id": "GRAPHOS-IDENTITY-R010.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Directory bind and group sync (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "9fc4eae0f299"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Directory bind and group sync (rollup).** Split into `.2.1`-`.2.4`; implement the LDAPS bind, filter escaping, nested-group resolution, and deprovisioning of disabled accounts. | An integration test uses a mock TLS LDAP directory. It covers escaped filters, bounded nested-group resolution and disabled-account deprovisioning.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 30
    },
    {
      "id": "GRAPHOS-IDENTITY-R010.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Group-DN-to-role mapping evaluation",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "9fc4eae0f299"
      ],
      "verified_by": [
        "tests/identity/test_ldap_group_roles.py:13",
        "tests/identity/test_ldap_group_roles.py:19",
        "tests/identity/test_ldap_group_roles.py:25",
        "tests/identity/test_ldap_group_roles.py:32"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Group-DN-to-role mapping evaluation.** `map_groups_to_roles()` maps a directory user's group DNs (DN-normalized, case-insensitive) to roles through an explicit mapping and refuses with `IdentityUnavailable` when no group matches. | Verified by unit tests in `tests/identity/test_ldap_group_roles.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 31
    },
    {
      "id": "GRAPHOS-IDENTITY-R010.2.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Bind through an injected directory port",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "57c4aff42c64"
      ],
      "verified_by": [
        "tests/identity/test_ldap_bind.py:22",
        "tests/identity/test_ldap_bind.py:29",
        "tests/identity/test_ldap_bind.py:35",
        "tests/identity/test_ldap_bind.py:41"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Bind through an injected directory port.** Bind and search via an injected directory port with typed `IdentityUnavailable` refusal when the directory is unavailable, plus search-filter escaping. | Verified by unit tests using a fake directory port.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 32
    },
    {
      "id": "GRAPHOS-IDENTITY-R010.2.3",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Scheduled group sync (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Scheduled group sync (rollup).** Split into `.2.3.1` and `.2.3.2`; bounded nested-group resolution and scheduled sync, deprovisioning disabled accounts. | Verified by a test against a fake directory covering bounded nesting and deprovisioning of a disabled account.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 33
    },
    {
      "id": "GRAPHOS-IDENTITY-R010.2.3.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Pure sync plan",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "937d3788413d"
      ],
      "verified_by": [
        "tests/identity/test_ldap_sync_plan.py:12",
        "tests/identity/test_ldap_sync_plan.py:27"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Pure sync plan.** `plan_directory_sync()` turns a directory snapshot (users with group DNs and a disabled flag) into a typed `SyncPlan` of role assignments per user and users to deprovision, listing enabled users with no mapped role as unmapped, and refuses an empty snapshot with `IdentityUnavailable`. | Verified by unit tests in `tests/identity/test_ldap_sync_plan.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 34
    },
    {
      "id": "GRAPHOS-IDENTITY-R010.2.3.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Scheduled apply",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Scheduled apply.** Schedule the sync and apply the plan through the identity port. | Verified by a test with a fake directory and fake identity port applying a deprovision.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 35
    },
    {
      "id": "GRAPHOS-IDENTITY-R010.2.4",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Live directory probe",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Live directory probe.** Probe a live LDAPS directory (requires a live service). | Verified by a live probe against the deployed directory.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 36
    },
    {
      "id": "GRAPHOS-IDENTITY-R011",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "SCIM 2.0 provisioning server",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "117ad5b56bc6"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**SCIM 2.0 provisioning server.** GraphOS exposes a SCIM 2.0 server bound to a provider-specific service credential, supporting user and group provisioning and deprovisioning without deleting owned data. | Verified by a SCIM contract test covering create/update/patch/deactivate flows and rejection of a token scoped to a different provider.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 37
    },
    {
      "id": "GRAPHOS-IDENTITY-R012",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Native SAML service provider",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "117ad5b56bc6"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Native SAML service provider.** GraphOS acts as a SAML 2.0 service provider itself, so a deployment can sign in through a SAML identity provider without an OIDC broker in between; brokering through an OIDC provider remains a supported alternative. Assertions are accepted only with a valid signature from the configured provider certificate, the expected audience and recipient, an unexpired validity window and an unreplayed assertion ID, and a SAML sign-in resolves to the same stable principal and narrowed scopes as every other login method. | Integration tests assert a signed assertion yields the stable principal, and unsigned, wrongly signed, wrong-audience, expired and replayed assertions and XML signature-wrapping attempts are each refused.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 38
    },
    {
      "id": "GRAPHOS-IDENTITY-R011.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Typed SCIM service-credential model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "95e2a2ed3519"
      ],
      "verified_by": [
        "tests/identity/test_scim_credential.py:11",
        "tests/identity/test_scim_credential.py:17",
        "tests/identity/test_scim_credential.py:23",
        "tests/identity/test_scim_credential.py:31"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Typed SCIM service-credential model.** `ScimServiceCredential` refuses an empty provider id and exposes `authorizes()` refusing a mismatched provider. | Verified by refusal unit tests in `tests/identity/test_scim_saml_models.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 39
    },
    {
      "id": "GRAPHOS-IDENTITY-R011.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "SCIM server surface (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**SCIM server surface (rollup).** Implement the create/update/patch/deactivate flows and provisioning/deprovisioning without deleting owned data. | Verified by a SCIM contract test covering create/update/patch/deactivate flows and rejection of a token scoped to a different provider.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 40
    },
    {
      "id": "GRAPHOS-IDENTITY-R011.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Typed SCIM User resource model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "e92d812eb39d"
      ],
      "verified_by": [
        "tests/identity/test_scim_user.py:15",
        "tests/identity/test_scim_user.py:21",
        "tests/identity/test_scim_user.py:26",
        "tests/identity/test_scim_user.py:32",
        "tests/identity/test_scim_user.py:40"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Typed SCIM User resource model.** `ScimUser` validates a SCIM 2.0 User payload (schema URN, non-empty userName, boolean active) and refuses a malformed one. | Verified by refusal unit tests in `tests/identity/test_scim_user.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 41
    },
    {
      "id": "GRAPHOS-IDENTITY-R011.2.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "SCIM credential check",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "966dc25b5493"
      ],
      "verified_by": [
        "tests/identity/test_scim_credential_check.py:17",
        "tests/identity/test_scim_credential_check.py:22",
        "tests/identity/test_scim_credential_check.py:29",
        "tests/identity/test_scim_credential_check.py:35"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**SCIM credential check.** Gate every SCIM request on `ScimServiceCredential.authorizes` and refuse a token scoped to a different provider. | Verified by a cross-provider rejection unit test.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 42
    },
    {
      "id": "GRAPHOS-IDENTITY-R011.2.3",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "SCIM create/patch/deactivate handlers",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "e848425636e4"
      ],
      "verified_by": [
        "tests/identity/test_scim_handlers.py:33",
        "tests/identity/test_scim_handlers.py:40",
        "tests/identity/test_scim_handlers.py:47",
        "tests/identity/test_scim_handlers.py:54",
        "tests/identity/test_scim_handlers.py:64"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**SCIM create/patch/deactivate handlers.** Handlers create, patch and deactivate users through an injected identity port; deactivation never deletes owned data. | Verified by a SCIM contract test over a fake identity port.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 43
    },
    {
      "id": "GRAPHOS-IDENTITY-R011.2.4",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "SCIM route registration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**SCIM route registration.** Register the `/scim/v2/Users` routes in the graph-os HTTP surface. | Verified by a route-registration test.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 44
    },
    {
      "id": "GRAPHOS-IDENTITY-R012.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Typed SAML service-provider model",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "66b447b6f3f3"
      ],
      "verified_by": [
        "tests/identity/test_saml_models.py:11",
        "tests/identity/test_saml_models.py:21",
        "tests/identity/test_saml_models.py:29"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Typed SAML service-provider model.** `SamlServiceProvider` refuses a non-URL ACS endpoint and refuses a missing IdP certificate. | Verified by refusal unit tests in `tests/identity/test_saml_models.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 45
    },
    {
      "id": "GRAPHOS-IDENTITY-R012.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Assertion verification and sign-in (rollup of .2.1-.2.4)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Assertion verification and sign-in (rollup of .2.1-.2.4).** Implement signature, audience/recipient, validity-window and replay checks, and resolve a SAML sign-in to the same stable principal as every other login method. | Integration tests assert a signed assertion yields the stable principal, and unsigned, wrongly signed, wrong-audience, expired and replayed assertions and XML signature-wrapping attempts are each refused.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 46
    },
    {
      "id": "GRAPHOS-IDENTITY-R012.2.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Typed parsed-assertion model and condition checks",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "fdbaebdb795a"
      ],
      "verified_by": [
        "tests/identity/test_saml_assertion_conditions.py:37",
        "tests/identity/test_saml_assertion_conditions.py:42",
        "tests/identity/test_saml_assertion_conditions.py:64",
        "tests/identity/test_saml_assertion_conditions.py:74",
        "tests/identity/test_saml_assertion_conditions.py:89"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Typed parsed-assertion model and condition checks.** `ParsedSamlAssertion` refuses malformed claims, and `check_assertion_conditions()` refuses a wrong audience, wrong recipient, not-yet-valid or expired assertion with a typed `SamlRefusalReason`. | Verified by refusal unit tests in `tests/identity/test_saml_assertion_conditions.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 47
    },
    {
      "id": "GRAPHOS-IDENTITY-R012.2.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Signature verification through an injected verifier port",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2eaa6baaabc5"
      ],
      "verified_by": [
        "tests/identity/test_saml_signature_verification.py:47",
        "tests/identity/test_saml_signature_verification.py:54",
        "tests/identity/test_saml_signature_verification.py:63"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Signature verification through an injected verifier port.** Define a `SamlSignatureVerifier` port and refuse unsigned, wrongly signed and signature-wrapped assertions; no crypto or XML implementation lives in graph-os. | Verified by unit tests with a fake verifier port covering unsigned, wrongly signed and wrapped assertions.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 48
    },
    {
      "id": "GRAPHOS-IDENTITY-R012.2.3",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Replay check and sign-in handler wiring (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Replay check and sign-in handler wiring (rollup).** Refuse a replayed assertion ID and resolve an accepted assertion to the same stable principal and narrowed scopes as every other login method; delivered by `.2.3.1` and `.2.3.2`. | Verified by the child rows.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 49
    },
    {
      "id": "GRAPHOS-IDENTITY-R012.2.3.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Replay check through a seen-assertion-id store port",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "7f5cd8d1fe7d"
      ],
      "verified_by": [
        "tests/identity/test_saml_replay.py:41",
        "tests/identity/test_saml_replay.py:48",
        "tests/identity/test_saml_replay.py:57",
        "tests/identity/test_saml_replay.py:64"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Replay check through a seen-assertion-id store port.** Define a `SamlReplayStore` `Protocol` and `check_assertion_replay`, which, after `verify_assertion`, refuses a repeated `assertion_id` with the typed reason `REPLAYED`. | Unit tests with an in-memory fake store assert a first assertion is accepted and a repeated assertion ID is refused with `REPLAYED`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 50
    },
    {
      "id": "GRAPHOS-IDENTITY-R012.2.3.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Sign-in handler wiring into the browser authority",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Sign-in handler wiring into the browser authority.** Resolve an accepted assertion to the same stable principal and narrowed scopes as every other login method. | Integration tests assert a verified assertion yields the stable principal.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 51
    },
    {
      "id": "GRAPHOS-IDENTITY-R012.2.4",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Live IdP sign-in probe",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Live IdP sign-in probe.** A committed probe signs in through a real SAML IdP; needs a live IdP service. | Verified by the probe run against the deployed IdP.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 52
    },
    {
      "id": "GRAPHOS-IDENTITY-R013",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Identity CLI commands and doctor diagnostics",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4a3410afa6de"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Identity CLI commands and doctor diagnostics.** The GraphOS identity CLI supports claim, link-claim, transition, reset-admin, and rotate commands with profile-aware defaults, and its doctor diagnostic reports a failing check for an exposed unauthenticated mode or an automatically generated secret. | Verified by a CLI contract test asserting each command's typed result and a doctor test asserting failing diagnostics for an exposed mode and an auto-generated secret.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 53
    },
    {
      "id": "GRAPHOS-IDENTITY-R014",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Shared RBAC decision oracle across identity modes",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "4a3410afa6de"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Shared RBAC decision oracle across identity modes.** GraphOS runs the same principal-by-scope-by-action-by-resource decision table against its unauthenticated, local, and external authentication modes, the last using mock OIDC and LDAP providers, and asserts identical allow/deny outcomes, reason codes, and claims digest for each principal across modes, including after a full mode-transition round trip. | Verified by a cross-mode oracle test comparing decision-table results and claims digests across all three modes.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 54
    },
    {
      "id": "GRAPHOS-IDENTITY-R015",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Identity operations documentation and cutover runbook",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "765e4c3a46fe"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Identity operations documentation and cutover runbook.** GraphOS documents its identity and access operations and configuration, and provides a runbook for cutting an existing deployment over between authentication modes. The runbook references a committed browser sign-in probe as the verification step for an external provider. | Verified by following the documented runbook end to end against a test deployment. The test confirms each described step and diagnostic matches observed behavior.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 55
    },
    {
      "id": "GRAPHOS-IDENTITY-R016",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Optional SMTP adapter for identity email",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "adf48206cdff"
      ],
      "verified_by": [
        "tests/identity/test_mail_capability.py:15",
        "tests/identity/test_mail_capability.py:30",
        "tests/identity/test_mail_capability.py:45"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Optional SMTP adapter for identity email.** GraphOS optionally sends password-reset, verification, and invitation email through a configurable SMTP adapter; when no adapter is configured, email-only affordances are hidden while administrator reset and recovery-code paths remain available. | Verified by a notification test asserting a one-use reset email is sent when SMTP is configured and that email-only UI options are hidden when it is absent.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 56
    },
    {
      "id": "GRAPHOS-IDENTITY-R016.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Graph-os-side mail capability model",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "adf48206cdff"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Graph-os-side mail capability model.** A typed `SmtpAdapterSettings` model refuses an unusable adapter (missing host, out-of-range port, invalid `mail_from`), and `email_affordances()` hides every email-only UI affordance while keeping the administrator-issued reset and recovery-code paths available when no adapter is configured. | Verified by refusal and capability-flag unit tests in `tests/identity/test_mail_capability.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 57
    },
    {
      "id": "GRAPHOS-IDENTITY-R016.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "SMTP/listmonk send integration",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**SMTP/listmonk send integration.** Wire a real SMTP/listmonk transport into the password-reset, verification, and invitation send pipeline so a one-use reset email is actually sent when an adapter is configured. Pinned to the epistemic-graph >=2.28 engine release (current pin: `epistemic-graph>=2.27.0,<3.0.0`); not deliverable until that pin moves. | Verified by a notification test asserting a one-use reset email is sent when SMTP is configured, once the epistemic-graph >=2.28 dependency lands.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 58
    },
    {
      "id": "GRAPHOS-IDENTITY-R017",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Remove the unauthenticated opt-out once clients migrate",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "adf48206cdff"
      ],
      "verified_by": [
        "tests/identity/test_client_entry_points.py:14",
        "tests/identity/test_client_entry_points.py:21"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Remove the unauthenticated opt-out once clients migrate.** Once every GraphOS client path, including bootstrap, REST, MCP, A2A, CLI, and background service calls, carries a verified local-issuer or permitted service token, GraphOS stops relying on the engine's unauthenticated opt-out so the engine refuses any unsigned request. | Verified by a served test asserting every client entry point is denied when its token is missing, expired, or has the wrong audience, with no unsigned retry or fallback path exercised.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 59
    },
    {
      "id": "GRAPHOS-IDENTITY-R017.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Client entry-point token audit registry",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "adf48206cdff"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Client entry-point token audit registry.** `CLIENT_TOKEN_REQUIREMENTS` enumerates every GraphOS client path (bootstrap, REST, MCP, A2A, CLI, background service) and records that each one carries a verified local-issuer or permitted service token, with `entry_points_without_verified_tokens()` empty -- the audited precondition for removing reliance on the engine's opt-out. | Verified by registry-completeness and token-requirement unit tests in `tests/identity/test_client_entry_points.py`.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 60
    },
    {
      "id": "GRAPHOS-IDENTITY-R017.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Engine opt-out removal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Engine opt-out removal.** Once the engine stops honoring the unauthenticated opt-out, GraphOS stops relying on it so the engine refuses any unsigned request. Pinned to the epistemic-graph >=2.28 engine release (current pin: `epistemic-graph>=2.27.0,<3.0.0`); not deliverable until that pin moves. | Verified by a served test asserting every client entry point is denied when its token is missing, expired, or has the wrong audience, once the epistemic-graph >=2.28 dependency lands.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 61
    },
    {
      "id": "GRAPHOS-IDENTITY-R017.3",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Model.** BearerVerificationProfile pins issuer, audience, signing algorithms, key authority, tenant claim mapping and validity limits. VerifiedBearer binds subject, tenant, client, scopes, token expiry and verification evidence. Tenant is a required nonempty signed claim, mapped to the existing internal tenant field. Headers, cookies, process identity and defaults cannot fill an absent tenant. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 62
    },
    {
      "id": "GRAPHOS-IDENTITY-R017.4",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Behavior.** Validate each API bearer independently of local browser-session storage. Verify signature, issuer, audience, expiry, not-before and required tenant before resolving current EG authority. Stateless token verification does not bypass revocation, delegation or current authorization. A valid browser cookie cannot rescue an invalid bearer or create an API principal. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 63
    },
    {
      "id": "GRAPHOS-IDENTITY-R017.5",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Wiring.** Reuse `verify_local_bearer_request` at `graph_os/api/http/auth.py:127` and `caller_from_session` at `graph_os/api/mcp/caller.py:12.` `VerifiedMCPCaller.caller_for_request` at line 117 resolves each call. The existing verifier result lacks current policy authority. Missing qualified token verification, tenant validation or current EG resolution keeps ingress unavailable; decoded-claims helpers alone cannot admit a bearer. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 64
    },
    {
      "id": "GRAPHOS-IDENTITY-R017.6",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Refusal.** Reject missing or duplicate bearer headers, invalid signature, unknown issuer/key, wrong audience, absent tenant, expiry and revoked credentials. A tenant mismatch refuses before discovery, dispatch or source access. Missing key or policy authority returns UNAVAILABLE without accepting cached positive authorization beyond its validity. Preserve uniform public authentication errors and bounded internal reasons. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 65
    },
    {
      "id": "GRAPHOS-IDENTITY-R017.7",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Evidence.** Record request, verified tenant/principal/client, issuer profile, key ID, policy revision and refusal category. Never retain raw bearer material or log a reversible token encoding. Bearer evidence identifies the exact request and authority source. Browser-session evidence remains separate and cannot imply bearer validation. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 66
    },
    {
      "id": "GRAPHOS-IDENTITY-R017.8",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Hot-path proof.** `tests/identity/test_bearer_tenant_ingress.py::test_served_stateless_bearer_requires_tenant` enters the tools/call wire method and REST with local issuer tokens. Empty browser-session storage must not block a valid bearer. Missing tenant, expired token, wrong audience, duplicate headers and forged signature cause zero handler calls. Restart, revoked authority and cross-tenant calls preserve refusal. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 67
    },
    {
      "id": "GRAPHOS-IDENTITY-R018",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Identity administration operations for self, admin, config",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "2c70abad2b68",
        "336f9faf3f21"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Identity administration operations for self, admin, config.** GraphOS exposes identity operations covering the authenticated caller's own record, administrator management of users, sessions, API keys, service accounts, roles, groups, identity providers with mapping dry-run, policy, mode, issuer, audit, and SCIM client configuration, all requiring exact identity-admin scope, console origin, and fresh multi-factor authentication for mutations. | Verified by an integration test exercising each identity operation and asserting admin mutations are denied without exact scope, console origin, or fresh MFA.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 68
    },
    {
      "id": "GRAPHOS-IDENTITY-R019",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Access operations for elevation and approval decisions",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "d467b8f6c708",
        "f0432f0a0cef",
        "f22badda8f35"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Access operations for elevation and approval decisions.** GraphOS exposes access operations for elevation request, list, revoke, and approve/deny, approval listing and grant/deny, lease management, access checks, and policy explanation, all backed by the engine's access authority with no separate GraphOS-local approval or lease record. | Verified by an access-operations contract test asserting self-approval and delegated-approval attempts are denied and that REST and MCP surfaces return identical decisions.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 69
    },
    {
      "id": "GRAPHOS-IDENTITY-R019.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Model.** ResourceAccessRequest binds verified tenant/principal/client, canonical resource reference, protocol, operation and immutable constraints. ResourceGrant binds an EG decision, verified user or role, exact resource version, scope ceiling, expiry and revocation revision. Protocol is web, ssh, rdp or database. Unknown resource, protocol or operation has no implicit grant. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 70
    },
    {
      "id": "GRAPHOS-IDENTITY-R019.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Behavior.** Require an explicit current grant at every protocol boundary before opening an upstream channel. Match user or verified role, tenant, resource, protocol and operation together. Grants never authorize a whole host or network by proximity. Reauthorize each new operation and stop active access when authority expires or revocation becomes known. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 71
    },
    {
      "id": "GRAPHOS-IDENTITY-R019.3",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Wiring.** Reuse `graph_os/access/service.py:90` `check_access` and `graph_os/api/ops/access.py:151` operations for EG-backed access projection. The shared invoke policy path at `graph_os/api/invoke/pipeline.py:198` remains mandatory. Protocol resource resolution, grant adapters and web/SSH/RDP/database enforcement are missing integration; no existing graph access verdict establishes protocol-wide enforcement. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 72
    },
    {
      "id": "GRAPHOS-IDENTITY-R019.4",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Refusal.** Default deny for missing grant, unknown resource, untrusted role, stale policy, expired grant, tenant mismatch or unavailable EG authority. If a protocol adapter cannot enforce the granted operation and constraints, refuse `unsupported_enforcement` before opening the connection. Opaque tunneling cannot be represented as operation-scoped authorization. Denied and unknown resources share a safe public refusal. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 73
    },
    {
      "id": "GRAPHOS-IDENTITY-R019.5",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Evidence.** Join ingress request, verified principal/client/tenant, canonical resource version, protocol, operation, EG decision and enforcement outcome. Record grant expiry, revocation observation and channel termination. Never record credentials, database payloads or private destination details in general logs. Evidence must prove the actual protocol boundary, not only an access-preview result. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 74
    },
    {
      "id": "GRAPHOS-IDENTITY-R019.6",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Hot-path proof.** `tests/identity/test_resource_protocol_access.py::test_served_protocol_grants_default_deny` enters the served operation through REST/MCP and each local protocol adapter. Controlled web, SSH, RDP and database endpoints record connection attempts. Explicit user and role grants permit only their exact resources. Unrelated resources, revoked grants and unsupported enforcement cause zero upstream connections. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 75
    },
    {
      "id": "GRAPHOS-IDENTITY-R020",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Domain scope registry covers finance, fleet, loops, ops",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "a2212420d6c6"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Domain scope registry covers finance, fleet, loops, ops.** GraphOS registers and exports its domain scopes, including finance read, fleet read and control, loops read and control, and ops read and admin, each with an exact name and scope class, consuming the generated engine scope registry rather than a separate list. | Verified by a registry property test asserting each exported scope's name and class matches the generated registry.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 76
    },
    {
      "id": "GRAPHOS-IDENTITY-R021",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Identity wiring depends only on identity ports",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2c70abad2b68",
        "336f9faf3f21"
      ],
      "verified_by": [
        "tests/identity/test_identity_ports_boundary.py:105",
        "tests/identity/test_identity_ports_boundary.py:77"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Identity wiring depends only on identity ports.** GraphOS's web host, web co-service, and MCP server packages depend only on the identity ports protocols and DTOs for identity behavior, with the concrete issuer, session, and authority implementations constructed once in the serving composition root and injected, removing the prior direct dependencies between these packages. | Verified by an import-graph and composition test asserting a single constructed implementation per port, no import cycle, and compliance with the configured dependency-count threshold.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 77
    },
    {
      "id": "GRAPHOS-IDENTITY-R022",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Fleet authorization fails closed on exact scopes",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "2c70abad2b68",
        "76d418e32221"
      ],
      "verified_by": [
        "tests/fleet/test_multiplexer_dynamic_gateway.py:1550",
        "tests/fleet/test_multiplexer_dynamic_gateway.py:1761",
        "tests/fleet/test_multiplexer_dynamic_gateway.py:1806",
        "tests/fleet/test_multiplexer_dynamic_gateway.py:1824"
      ],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Fleet authorization fails closed on exact scopes.** GraphOS's fleet capability check accepts only the exact fleet scope for a requested operation rather than treating a general admin or cluster-admin scope as sufficient, applies the same check to local stdio transport as to any other transport, denies dispatch of an unrecognized native tool rather than allowing it by default, and enforces this filtering on every served MCP request regardless of which code path constructed the server. | Verified by positive and negative tests asserting an admin-only or cluster-admin-only caller is denied fleet access, an unknown tool is denied, and stdio-transport requests are checked identically to networked requests.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 78
    },
    {
      "id": "GRAPHOS-IDENTITY-R023",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Native, self-refreshing credentials for MCP clients",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Native, self-refreshing credentials for MCP clients.** GraphOS issues and refreshes its own service-account or API-key tokens in process and serves them directly to IDE and agent MCP clients, removing the need for an external scheduled credential-refresh process or a file-based token cache read by a separate bridge process. | Verified by a client integration test asserting an MCP client obtains and automatically renews a working token from GraphOS with no external refresh process or cached credential file.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 79
    },
    {
      "id": "GRAPHOS-IDENTITY-R023.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Model",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Model.** Frozen CredentialUseRequest binds tenant, owner principal, requesting principal/client, connector, provider, audience, scopes, resource and operation. CredentialUseGrant adds EG decision reference, vault reference, expiry, revocation revision and declared provider token profile. AuthorizationChallenge binds that request, issuer, client, callback, state, nonce, PKCE challenge, attempt and deadline. No shared-host identity or supplied actor field grants reuse. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 80
    },
    {
      "id": "GRAPHOS-IDENTITY-R023.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Behavior",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Behavior.** Resolve only an explicit reuse grant for the exact requesting agent, admitted connector and purpose. Derive connector identity from trusted admission; reject caller-forged or mismatched values. Validate provider tokens under the declared JWT/OIDC or opaque profile defined in the plan. Missing credentials start one admitted inline PKCE challenge. Persist acquired tokens through the approved host vault before reporting readiness. Resume only the unchanged pending operation after fresh EG authorization. Expiry, revocation and concurrent refresh preserve the same narrowed authority. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 81
    },
    {
      "id": "GRAPHOS-IDENTITY-R023.3",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Wiring",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Wiring.** Extend authorize at `graph_os/gateway/remote_oauth_api.py:245` and `oauth_callback` at line 280 through the existing broker boundary. `build_identity_ports` at `graph_os/identity/composition.py:48` injects qualified identity authorities. Reuse SDK-CONNECTOR-CONTROL-R035 and R046 for credential references and PKCE transport. Scoped reuse, vault persistence receipts and inline operation continuation remain missing producer wiring. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 82
    },
    {
      "id": "GRAPHOS-IDENTITY-R023.4",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Refusal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Refusal.** Return `credential_missing`, `reuse_denied`, `browser_launch_failed`, `callback_unavailable`, `input_timeout`, `state_mismatch`, `insecure_redirect`, `provider_unavailable`, `persistence_failed`, revoked or expired. An unavailable interactive channel returns `interaction_required` immediately. Errors contain no code, verifier or token. A refused ceremony cannot dispatch the pending operation or leave a usable credential grant. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 83
    },
    {
      "id": "GRAPHOS-IDENTITY-R023.5",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Evidence",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Evidence.** Record tenant, requesting principal/client, provider, granted scopes, resource, operation, challenge reference, EG decision and vault receipt. Include issuance, refresh, revocation and expiry references. Redact authorization codes, verifier, tokens, cookies and credential values. Record cross-agent use independently; process or host identity cannot substitute for caller provenance. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 84
    },
    {
      "id": "GRAPHOS-IDENTITY-R023.6",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Hot-path proof",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Hot-path proof.** `tests/identity/test_scoped_credential_reuse.py::test_served_pkce_reuse_and_refusal` enters the served operation through REST and MCP tools/call. A local OIDC provider and real callback complete PKCE and vault persistence. A granted second client succeeds; unrelated clients and mismatched connectors fail before token use. JWT and opaque-token fixtures prove the declared validation profile without fabricating claims. Browser opening failure, timed-out input, replay and failed persistence cause no backend effect. | Served acceptance in the named identity tests; runtime evidence remains required.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 85
    },
    {
      "id": "GRAPHOS-IDENTITY-R024",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Committed browser and Keycloak SSO probe",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Committed browser and Keycloak SSO probe.** GraphOS provides a committed, reusable script that drives a real browser through sign-in against an external OIDC provider such as Keycloak and verifies the resulting session, replacing any uncommitted ad hoc probe. | Verified by running the committed probe against a test identity-provider realm and confirming it reports a successful authenticated session.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 86
    },
    {
      "id": "GRAPHOS-IDENTITY-R025",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Register identity ops once the engine contract lists `identity:admin`",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Register identity ops once the engine contract lists `identity:admin`.** GraphOS registers the identity operations only after the engine contract lists scope `identity:admin`. Until then registration is skipped with a doctor warning. Depends on the engine registering `identity:admin` (closed PR #176 failed `tests/api/test_registry_factory.py` for this). | `tests/api/test_registry_factory.py` passes with the engine contract listing `identity:admin` and skips identity ops without it.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 87
    },
    {
      "id": "GRAPHOS-IDENTITY-R026",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Hosted sessions are attributed to a client and segmented by principal",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Hosted sessions are attributed to a client and segmented by principal.** GraphOS must attribute every streamable-http session, agent run and audit event to a verified client principal, and must show each caller only its own. Rollup: LANDED when every `GRAPHOS-IDENTITY-R026.<n>` child is LANDED. | A served test with two principals shows no cross-client visibility and the children pass.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 88
    },
    {
      "id": "GRAPHOS-IDENTITY-R026.1",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Client session record",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Client session record.** GraphOS must define a typed client session record in graph_os/identity/client_session.py. It holds principal, tenant, session id and start time. | tests/identity/test_client_session.py: fields required; an unsigned principal is rejected.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 89
    },
    {
      "id": "GRAPHOS-IDENTITY-R026.2",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Record at session open",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Record at session open.** GraphOS must create the record when an MCP session opens, from the verified principal. The first task locates the session-open call site in graph_os/mcp_server. | tests/identity/test_client_session_open.py: opening a session stores one record for the caller.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 90
    },
    {
      "id": "GRAPHOS-IDENTITY-R026.3",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Runs carry the session id",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Runs carry the session id.** Each agent run started through GraphOS must carry its client session id and principal into the run record. | tests/identity/test_run_attribution.py: run record shows the opening session id.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 91
    },
    {
      "id": "GRAPHOS-IDENTITY-R026.4",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Audit event per run",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Audit event per run.** GraphOS must write one audit event per orchestrated run, holding trace id, principal and session id, in graph_os/api/invoke/audit.py. | tests/identity/test_run_audit.py: one event per run with all three fields.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 92
    },
    {
      "id": "GRAPHOS-IDENTITY-R026.5",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Caller-scoped client listing",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Caller-scoped client listing.** A list-clients operation must return only the caller's sessions and runs, and must return all of them only for an exact admin scope. | tests/identity/test_list_clients.py: user sees own rows; admin sees all; reader scope without admin is limited.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 93
    },
    {
      "id": "GRAPHOS-IDENTITY-R026.6",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "User and service account parity",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**User and service account parity.** A user and a service account holding the same grants must see the same operation catalog and the same graph data. | tests/identity/test_principal_parity.py: equal catalog and equal visible-row count for both principals.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 94
    },
    {
      "id": "GRAPHOS-IDENTITY-R026.7",
      "kind": "requirement",
      "parent": "GRAPHOS-IDENTITY",
      "source": "specs/identity-access/status.json",
      "title": "Cross-client denial is uniform",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-IDENTITY \u2014 ACCESS \u2014 identity, authorization, and access operations",
      "definition": "**Cross-client denial is uniform.** A read of another client's session must fail with the same refusal as an unknown session id. | tests/identity/test_cross_client_denial.py: both cases return identical structured denials.",
      "definition_source": "specs/identity-access/requirements.md",
      "definition_line": 95
    },
    {
      "id": "GRAPHOS-MCP-RESOURCES",
      "kind": "spec",
      "parent": null,
      "source": "specs/mcp-resource-publication-reconciliation/status.json",
      "title": "GRAPHOS-MCP-RESOURCES \u2014 MCP resource/template publication reconciliation",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/mcp-resource-publication-reconciliation/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/mcp-resource-publication-reconciliation/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "`docs/fleet.md`",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/docs/fleet.md"
        },
        {
          "declared_in": "specs/mcp-resource-publication-reconciliation/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "`docs/status.md`",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/docs/status.md"
        },
        {
          "declared_in": "specs/mcp-resource-publication-reconciliation/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/fleet/catalog_reader.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/fleet/catalog_reader.py"
        },
        {
          "declared_in": "specs/mcp-resource-publication-reconciliation/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/fleet/mcp_resource_reconciliation.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/fleet/mcp_resource_reconciliation.py"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/mcp-resource-publication-reconciliation/spec.md",
          "evidence": "external declaration; not verified",
          "kind": "references",
          "label": "`EG-REPO-INGEST-001`",
          "repository": "Knuckles-Team/epistemic-graph",
          "url": "https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/repository-index-and-ingestion/spec.md"
        },
        {
          "declared_in": "specs/mcp-resource-publication-reconciliation/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "`fleet-catalog-and-tools/spec.md`",
          "repository": "Knuckles-Team/graph-os",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/fleet-catalog-and-tools/spec.md"
        },
        {
          "declared_in": "specs/mcp-resource-publication-reconciliation/spec.md",
          "evidence": "missing source",
          "kind": "references",
          "label": "fleet-catalog-and-tools/spec.md",
          "repository": "Unresolved",
          "url": ""
        }
      ],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-MCP-RESOURCES-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-MCP-RESOURCES",
      "source": "specs/mcp-resource-publication-reconciliation/status.json",
      "title": "Publication gate refuses without a valid receipt (rollup)",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-MCP-RESOURCES \u2014 MCP resource/template publication reconciliation",
      "definition": "**Publication gate refuses without a valid receipt (rollup).** graph-os's MCP resource/template publication path never claims a candidate generation is published unless a `ReconciliationReceipt` exists, matches that exact candidate, and is fresh; otherwise it returns the typed `reingestion-unreconciled` result. Delivered through its child requirement, producer first. | Covered by `GRAPHOS-MCP-RESOURCES-R001.1` plus `GRAPHOS-MCP-RESOURCES-R003` (not yet specified).",
      "definition_source": "specs/mcp-resource-publication-reconciliation/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-MCP-RESOURCES-R001.1",
      "kind": "requirement",
      "parent": "GRAPHOS-MCP-RESOURCES",
      "source": "specs/mcp-resource-publication-reconciliation/status.json",
      "title": "Typed `ReconciliationReceipt` model and publication gate",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "6a19f564d301"
      ],
      "verified_by": [
        "tests/fleet/test_mcp_resource_reconciliation.py:22"
      ],
      "parent_title": "GRAPHOS-MCP-RESOURCES \u2014 MCP resource/template publication reconciliation",
      "definition": "**Typed `ReconciliationReceipt` model and publication gate.** `graph_os/fleet/mcp_resource_reconciliation.py` defines a frozen `ReconciliationReceipt` and `gate_mcp_resource_publication()` returning a typed `PublicationGateResult`: `\"reconciled\"` only for a receipt matching the exact tenant, `catalog_generation`, `snapshot_digest`, and all four families (`tools`, `prompts`, `resources`, `resource_templates`) within a freshness bound; `\"reingestion-unreconciled\"` with a stable `reason` (`missing`, `stale`, `invalid`) otherwise. | `tests/fleet/test_mcp_resource_reconciliation.py` covers missing, stale, digest-mismatched, generation-mismatched, partial-family, and wrong-tenant receipts all returning `reingestion-unreconciled`, and a fully matching fresh receipt returning `reconciled`.",
      "definition_source": "specs/mcp-resource-publication-reconciliation/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-MCP-RESOURCES-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-MCP-RESOURCES",
      "source": "specs/mcp-resource-publication-reconciliation/status.json",
      "title": "epistemic-graph is the sole admissible receipt source",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "028338c38838"
      ],
      "verified_by": [
        "tests/fleet/test_mcp_resource_receipt_source.py:32"
      ],
      "parent_title": "GRAPHOS-MCP-RESOURCES \u2014 MCP resource/template publication reconciliation",
      "definition": "**epistemic-graph is the sole admissible receipt source.** The gate may only treat as reconciling a receipt epistemic-graph issued after durably committing the candidate's four-family projection. Graph-os never synthesizes or locally fabricates a passing receipt. Producing contract: [`EG-REPO-INGEST-001`](https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/repository-index-and-ingestion/spec.md) (owned by epistemic-graph). | Cross-repository link verification: this spec's `spec.md` cites the exact EG spec ID and URL. No graph-os code path constructs a `ReconciliationReceipt` locally outside of test fixtures.",
      "definition_source": "specs/mcp-resource-publication-reconciliation/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-MCP-RESOURCES-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-MCP-RESOURCES",
      "source": "specs/mcp-resource-publication-reconciliation/status.json",
      "title": "Gate wired at the one catalog-publish entry point (rollup)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-MCP-RESOURCES \u2014 MCP resource/template publication reconciliation",
      "definition": "**Gate wired at the one catalog-publish entry point (rollup).** The fleet catalog's atomic generation-publish step (`fleet-catalog-and-tools` R022/PA-12) calls `gate_mcp_resource_publication()` before swapping the active generation pointer for the four MCP families; only an all-families `\"reconciled\"` result allows the swap. Split because the publish step it must call is not yet built in graph-os (`fleet-catalog-and-tools` R022/PA-12 is still BUILDING, so there is no entry point to wire). Delivered through its children. | Covered by `GRAPHOS-MCP-RESOURCES-R003.1` and `GRAPHOS-MCP-RESOURCES-R003.2`.",
      "definition_source": "specs/mcp-resource-publication-reconciliation/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-MCP-RESOURCES-R003.1",
      "kind": "requirement",
      "parent": "GRAPHOS-MCP-RESOURCES",
      "source": "specs/mcp-resource-publication-reconciliation/status.json",
      "title": "Swap guard function",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "965d34390876"
      ],
      "verified_by": [
        "tests/fleet/test_mcp_resource_reconciliation.py:119",
        "tests/fleet/test_mcp_resource_reconciliation.py:138"
      ],
      "parent_title": "GRAPHOS-MCP-RESOURCES \u2014 MCP resource/template publication reconciliation",
      "definition": "**Swap guard function.** `graph_os/fleet/mcp_resource_reconciliation.py` adds `require_reconciled_for_swap()`, which wraps `gate_mcp_resource_publication()` and raises a typed `PublicationRefusedError` carrying the `PublicationGateResult` for any `reingestion-unreconciled` result, and returns the receipt only for `reconciled`. The publish step can then call one function that cannot be bypassed by ignoring a return value. | Unit tests: missing, stale, and invalid receipts raise `PublicationRefusedError` with the typed result attached and the stable `reason`. A matching fresh receipt returns the receipt.",
      "definition_source": "specs/mcp-resource-publication-reconciliation/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-MCP-RESOURCES-R003.2",
      "kind": "requirement",
      "parent": "GRAPHOS-MCP-RESOURCES",
      "source": "specs/mcp-resource-publication-reconciliation/status.json",
      "title": "Call the guard from the publish step (depends on `fleet-catalog-and-tools` R022/PA-12 landing in graph-os)",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-MCP-RESOURCES \u2014 MCP resource/template publication reconciliation",
      "definition": "**Call the guard from the publish step (depends on `fleet-catalog-and-tools` R022/PA-12 landing in graph-os).** The atomic generation-publish step calls `require_reconciled_for_swap()` before swapping the active generation pointer for the four families, leaves the last-known-good generation active on refusal, and surfaces the typed result in the reload outcome. | Integration test drives the publish step with missing/stale/invalid receipts and confirms the swap is refused with the typed result surfaced; a matching receipt allows the swap.",
      "definition_source": "specs/mcp-resource-publication-reconciliation/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-MCP-RESOURCES-R004",
      "kind": "requirement",
      "parent": "GRAPHOS-MCP-RESOURCES",
      "source": "specs/mcp-resource-publication-reconciliation/status.json",
      "title": "Status docs are the gate's result, not hand-maintained prose",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "94ee72171294"
      ],
      "verified_by": [
        "tests/fleet/test_mcp_resource_status_docs.py:20",
        "tests/fleet/test_mcp_resource_status_docs.py:25",
        "tests/fleet/test_mcp_resource_status_docs.py:32",
        "tests/fleet/test_mcp_resource_status_docs.py:44"
      ],
      "parent_title": "GRAPHOS-MCP-RESOURCES \u2014 MCP resource/template publication reconciliation",
      "definition": "**Status docs are the gate's result, not hand-maintained prose.** `docs/status.md`'s \"Explicitly unavailable surfaces\" row and `docs/fleet.md`'s reconciliation paragraph describe exactly the `reingestion-unreconciled` result the gate returns. | A docs-consistency check (or review note) confirms the status/reason vocabulary in both docs matches `graph_os/fleet/mcp_resource_reconciliation.py` exactly. Not built in this slice.",
      "definition_source": "specs/mcp-resource-publication-reconciliation/requirements.md",
      "definition_line": 11
    },
    {
      "id": "GRAPHOS-MESSAGING",
      "kind": "spec",
      "parent": null,
      "source": "specs/messaging-channel-supervision/status.json",
      "title": "GRAPHOS-MESSAGING \u2014 Messaging channel supervision lifecycle",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/messaging-channel-supervision/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/messaging-channel-supervision/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "GRAPHOS-HOST-R011",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/host-composition-boundary/requirements.md"
        },
        {
          "declared_in": "specs/messaging-channel-supervision/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/messaging-channel-supervision/requirements.md"
        },
        {
          "declared_in": "specs/messaging-channel-supervision/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "test-spec.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/messaging-channel-supervision/test-spec.md"
        }
      ],
      "relations": [],
      "plan_diagrams": [
        "stateDiagram-v2\n  [*] --> STOPPED\n  STOPPED --> STARTING: start()\n  STARTING --> RUNNING: is_connected observed\n  STARTING --> STOPPED: not connected, skipped\n  STARTING --> DEGRADED: adapter missing/import failed\n  RUNNING --> BACKING_OFF: recoverable listener failure\n  BACKING_OFF --> RUNNING: listener resumed\n  BACKING_OFF --> STOPPING: stop() during backoff\n  RUNNING --> STOPPING: stop()\n  DEGRADED --> STOPPING: stop()\n  STOPPING --> STOPPED: tasks drained\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-MESSAGING-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-MESSAGING",
      "source": "specs/messaging-channel-supervision/status.json",
      "title": "Typed channel supervision state machine",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "63a66f60915a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-MESSAGING \u2014 Messaging channel supervision lifecycle",
      "definition": "**Typed channel supervision state machine.** GraphOS models each supervised messaging backend's lifecycle as a closed, typed state enum (`STOPPED`, `STARTING`, `RUNNING`, `BACKING_OFF`, `DEGRADED`, `STOPPING`) with a fixed legal-transition table; `InboundRouter` reports this state per backend. Delivered as the rollup of `GRAPHOS-MESSAGING-R001.1` (typed model, transition table, refusal tests) plus the router wiring that reports it live. | Unit tests over the typed model prove every legal transition and refuse every illegal one; an integration test confirms `InboundRouter` reports the live state per registered backend.",
      "definition_source": "specs/messaging-channel-supervision/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-MESSAGING-R001.1",
      "kind": "requirement",
      "parent": "GRAPHOS-MESSAGING",
      "source": "specs/messaging-channel-supervision/status.json",
      "title": "Typed state model, transition table, and refusal tests",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "63a66f60915a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-MESSAGING \u2014 Messaging channel supervision lifecycle",
      "definition": "**Typed state model, transition table, and refusal tests.** GraphOS defines the `ChannelSupervisionState` enum and a `TRANSITIONS: dict[ChannelSupervisionState, frozenset[ChannelSupervisionState]]` table as the sole authority for legal moves, plus a `transition(current, target)` function that returns the target on a legal move and raises a typed `IllegalSupervisionTransition` otherwise. No router wiring is required for this slice. | Unit tests cover every legal transition pair and assert a representative set of illegal pairs (including `STOPPED -> RUNNING` and `DEGRADED -> RUNNING`) each raise `IllegalSupervisionTransition` with the attempted pair in its message.",
      "definition_source": "specs/messaging-channel-supervision/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-MESSAGING-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-MESSAGING",
      "source": "specs/messaging-channel-supervision/status.json",
      "title": "Health-gated start",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "63a66f60915a"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-MESSAGING \u2014 Messaging channel supervision lifecycle",
      "definition": "**Health-gated start.** `InboundRouter.start()` transitions a registered backend through `STARTING` and only reaches `RUNNING` once `backend.is_connected` is observed true; a backend that is not connected at start is recorded `STOPPED` (skipped), never `RUNNING`. | A unit test with a fixture backend whose `is_connected` is `False` asserts the router records it as not running and does not create a listener task for it; a connected fixture backend reaches `RUNNING`.",
      "definition_source": "specs/messaging-channel-supervision/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-MESSAGING-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-MESSAGING",
      "source": "specs/messaging-channel-supervision/status.json",
      "title": "Bounded restart backoff with healthy-run reset",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "29a592980f26"
      ],
      "verified_by": [
        "tests/messaging/test_supervision.py:152",
        "tests/messaging/test_supervision.py:186"
      ],
      "parent_title": "GRAPHOS-MESSAGING \u2014 Messaging channel supervision lifecycle",
      "definition": "**Bounded restart backoff with healthy-run reset.** On a recoverable listener failure, `_supervise_backend` moves the backend to `BACKING_OFF`, computing its next delay from `MESSAGING_LISTEN_BACKOFF_BASE_S` (floored at a nonzero value so a zero base never busy-loops), doubling on each consecutive failure, capped at `MESSAGING_LISTEN_BACKOFF_MAX_S` (default 60s); a run lasting at least `MESSAGING_LISTEN_HEALTHY_RESET_S` (default 60s) resets the delay to base before the next failure. | A unit test drives a sequence of simulated short-lived failures and asserts the delay sequence is monotonically bounded by the cap; a separate test simulates one long-lived healthy run followed by a failure and asserts the delay resets to base.",
      "definition_source": "specs/messaging-channel-supervision/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-MESSAGING-R004",
      "kind": "requirement",
      "parent": "GRAPHOS-MESSAGING",
      "source": "specs/messaging-channel-supervision/status.json",
      "title": "Graceful stop and drain",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "29a592980f26"
      ],
      "verified_by": [
        "tests/messaging/test_supervision.py:221"
      ],
      "parent_title": "GRAPHOS-MESSAGING \u2014 Messaging channel supervision lifecycle",
      "definition": "**Graceful stop and drain.** `InboundRouter.stop()` moves every supervised backend to `STOPPING` before cancelling its listener and inbox-reaper tasks, awaits their completion with `return_exceptions=True`, then reports `STOPPED`; a task observing `asyncio.CancelledError` during a backoff wait propagates as clean shutdown and triggers no further restart attempt. | A unit test cancels a router with an in-flight backoff wait and asserts no restart task is scheduled after `stop()` returns and that the task collection is empty.",
      "definition_source": "specs/messaging-channel-supervision/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-MESSAGING-R005",
      "kind": "requirement",
      "parent": "GRAPHOS-MESSAGING",
      "source": "specs/messaging-channel-supervision/status.json",
      "title": "Typed degraded adapter state and configuration-aware health",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "29a592980f26",
        "785693fbf7a3"
      ],
      "verified_by": [
        "tests/messaging/test_registry_degraded.py:101",
        "tests/messaging/test_registry_degraded.py:85"
      ],
      "parent_title": "GRAPHOS-MESSAGING \u2014 Messaging channel supervision lifecycle",
      "definition": "**Typed degraded adapter state and configuration-aware health.** GraphOS records configured adapter failures as DEGRADED with typed reasons. It continues creating other configured channels. R005.1 defines configuration-aware health and alert eligibility. | Named registry and health cases in R005.1 exercise these behaviors.",
      "definition_source": "specs/messaging-channel-supervision/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-MESSAGING-R005.1",
      "kind": "requirement",
      "parent": "GRAPHOS-MESSAGING",
      "source": "specs/messaging-channel-supervision/status.json",
      "title": "Typed adapter degradation and configuration-aware health",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-MESSAGING \u2014 Messaging channel supervision lifecycle",
      "definition": "**Typed adapter degradation and configuration-aware health.** Preserve the configured missing/import-failed adapter record as DEGRADED with AdapterMissing or AdapterImportFailed. Continue creating other configured channels. Expose components.messaging_intake on authenticated GET /api/dashboard/health and graph_configure(action=\"health\"). Return stable enabled, configured, state, alert_eligible, and backends fields. Set enabled only when MESSAGING_INTAKE_ENABLED is explicitly true and KG_DAEMON_ROLE=host. Credentials alone never enable intake. Set configured when at least one supported backend has credential material. Never return credential values. Set state to disabled when intake is off. Use not_configured when enabled but no backend is configured. Use degraded when enabled with any unavailable configured backend. Use healthy only when every configured backend is connected. Set alert_eligible true exactly when enabled and state is not_configured or degraded. Build backends in stable ID order from configured backend IDs and typed degraded-record IDs. Each row has id, configured, state, and nullable reason_code. States are not_configured, disabled, connected, or unavailable. Use not_configured without credentials and disabled when intake is off. Use connected only when enabled and is_connected=true. Otherwise mark configured rows unavailable. Map AdapterMissing to adapter_missing, AdapterImportFailed to adapter_import_failed, and false is_connected to backend_not_connected. Never expose credentials or raw exception text. Alert evaluators may emit only when alert_eligible=true. Health reads never send messages. Keep unauthenticated /health and /health/ready detail-free. | MSG-T07 and MSG-T09\u2013MSG-T12 prove typed failure preservation, state distinctions, alert eligibility, matching authenticated projections, safe output, and detail-free probes.",
      "definition_source": "specs/messaging-channel-supervision/requirements.md",
      "definition_line": 11
    },
    {
      "id": "GRAPHOS-MESSAGING-R006",
      "kind": "requirement",
      "parent": "GRAPHOS-MESSAGING",
      "source": "specs/messaging-channel-supervision/status.json",
      "title": "Supervision/adapter ownership boundary",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-MESSAGING \u2014 Messaging channel supervision lifecycle",
      "definition": "**Supervision/adapter ownership boundary.** GraphOS's supervision types import only `agent_utilities.messaging.base.MessagingBackend`'s public adapter contract and `agent_utilities.messaging.models`. GraphOS implements no channel adapter and agent-utilities implements no supervision, health gating, or backoff. This requirement links `AU-INTEGRATION-001` (`AU-INTEGRATION-R002`, `AU-INTEGRATION-R019`) as the agent-utilities-owned messaging/router spec this boundary depends on. | A source-level import check confirms `graph_os/messaging/{router,registry,service}.py` import no agent-utilities module outside `agent_utilities.messaging.{base,models}` and `agent_utilities.core.config`.",
      "definition_source": "specs/messaging-channel-supervision/requirements.md",
      "definition_line": 12
    },
    {
      "id": "GRAPHOS-DEPLOY",
      "kind": "spec",
      "parent": null,
      "source": "specs/portable-deployment/status.json",
      "title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/portable-deployment/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/portable-deployment/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "deploy/compose/compose.yaml",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/deploy/compose/compose.yaml"
        },
        {
          "declared_in": "specs/portable-deployment/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "deploy/swarm/stack.yml",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/deploy/swarm/stack.yml"
        },
        {
          "declared_in": "specs/portable-deployment/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/a2a/routing.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/a2a/routing.py"
        },
        {
          "declared_in": "specs/portable-deployment/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "graph_os/skills/graphos-genesis/references/bare-metal.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/graph_os/skills/graphos-genesis/references/bare-metal.md"
        },
        {
          "declared_in": "specs/portable-deployment/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "scripts/check_deployment_image_digests.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "implementation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/scripts/check_deployment_image_digests.py"
        },
        {
          "declared_in": "specs/portable-deployment/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "specs/hosted-api-operations/plan.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/hosted-api-operations/plan.md"
        },
        {
          "declared_in": "specs/portable-deployment/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/deployment/test_graphos_deploy_artifacts.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/tests/deployment/test_graphos_deploy_artifacts.py"
        },
        {
          "declared_in": "specs/portable-deployment/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "tests/deployment/test_image_digests.py",
          "repository": "Knuckles-Team/graph-os",
          "role": "test",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/tests/deployment/test_image_digests.py"
        },
        {
          "declared_in": "specs/portable-deployment/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/portable-deployment/requirements.md"
        }
      ],
      "relations": [],
      "plan_diagrams": [],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-DEPLOY-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Worker topology manifest is digest-pinned",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "e7ae64dec334"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Worker topology manifest is digest-pinned.** GraphOS's Kubernetes worker-topology manifest pins its dispatch, ingest and other worker workloads, their horizontal pod autoscalers, and its stateful set to an exact image digest rather than a floating tag. | A manifest lint check fails any workload image reference in the manifest that is not digest-pinned.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-DEPLOY-R002",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Executable release-qualification runbook",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "689f232dc362",
        "d75db1ea42e8",
        "eaabc7449a93"
      ],
      "verified_by": [
        "tests/deployment/test_release_qualification_runbook.py:32",
        "tests/deployment/test_release_qualification_runbook.py:47",
        "tests/deployment/test_release_qualification_runbook.py:58",
        "tests/deployment/test_release_qualification_runbook.py:72"
      ],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Executable release-qualification runbook.** GraphOS publishes an executable, step-by-step release-qualification runbook covering the graph engine, connector SDK, agent runtime, GraphOS itself, the web UI, and the connector package fleet, through production redeployment, as the companion procedure to the exit-criteria matrix. | Each runbook stage is backed by an automated check or script that a reviewer can run directly.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 6
    },
    {
      "id": "GRAPHOS-DEPLOY-R003",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Pre-push hooks always run the full gate suite",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "4a2d2cd9ac55",
        "689f232dc362",
        "c3c6be59a12a"
      ],
      "verified_by": [
        "tests/deployment/test_doctor_prepush_hook.py:22",
        "tests/deployment/test_doctor_prepush_hook.py:42",
        "tests/deployment/test_pre_push_hook_shim.py:77",
        "tests/deployment/test_pre_push_hook_shim.py:91"
      ],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Pre-push hooks always run the full gate suite.** GraphOS's pre-push git hook resolves to its actual pre-commit configuration file and runs its full gate suite before a push succeeds; a relocated configuration path or a missing hook installation is treated as a failure, never a silent pass-through. | A hook-audit test invokes the generated pre-push shim and confirms it executes the configured gates rather than exiting silently.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 7
    },
    {
      "id": "GRAPHOS-DEPLOY-R004",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "mypy hook type-checks the test suite",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "689f232dc362",
        "9d8a787b8495"
      ],
      "verified_by": [
        "tests/deployment/test_mypy_hook_scope.py:13"
      ],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**mypy hook type-checks the test suite.** GraphOS's pre-commit mypy hook type-checks its test suite rather than excluding it, and the type errors that exclusion had hidden are fixed rather than suppressed. | The mypy hook runs against the test suite in continuous integration and passes with zero errors.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 8
    },
    {
      "id": "GRAPHOS-DEPLOY-R005",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Web UI keeps its component package name",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d6f16cd447e2",
        "d75db1ea42e8",
        "eaabc7449a93"
      ],
      "verified_by": [
        "tests/deployment/test_component_names_and_scripts.py:17"
      ],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Web UI keeps its component package name.** Operator decision 2026-10-09: only front-end-facing items carry the Graph OS name; the web UI stays the `agent-webui` component (`agent_webui` import, `agent-webui` distribution). GraphOS's import sites, optional web UI package extra, package source reference, release workflow checkout step, preflight checks, and browser-control tests and docs keep referencing `agent-webui`; no package rename cutover is required. | A focused test run and the offline lock check confirm every reference resolves against the `agent-webui` package.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 9
    },
    {
      "id": "GRAPHOS-DEPLOY-R006",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "gateway-widgets extra pins a compatible connector floor",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "45283d0137b9",
        "d58ee3e25028",
        "d6f16cd447e2",
        "f42856691f97"
      ],
      "verified_by": [
        "tests/gateway/test_gateway_widgets_extra.py:57"
      ],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**gateway-widgets extra pins a compatible connector floor.** GraphOS's `gateway-widgets` optional extra declares a minimum version for each fleet connector package equal to the first published release compatible with the agent runtime's current module layout, so installing the extra never pulls a connector package that imports a removed module. | The widget test suite passes when the extra is installed from the published package index.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 10
    },
    {
      "id": "GRAPHOS-DEPLOY-R007",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "GraphOS hosts deployment doctor and skill certification",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "fd761d59a171"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**GraphOS hosts deployment doctor and skill certification.** GraphOS hosts the sole deployment doctor, skill-certification, OIDC-certification, skill-validation, and fleet-harness/skill-graph test modules. It incorporates any behavior unique to the agent runtime's former deployment package. Its `pyproject.toml` is the canonical source of console-script registrations for this tooling. No equivalent script remains declared by the agent runtime. Rollup: LANDED when every `GRAPHOS-DEPLOY-R007.<n>` child is LANDED. | A package-layout test confirms the agent runtime's deployment package is absent. It also confirms every related console script resolves to a GraphOS-owned module.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 11
    },
    {
      "id": "GRAPHOS-DEPLOY-R007.1",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "`agent-utilities-doctor` console-script collision resolved",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d6f16cd447e2",
        "fd761d59a171"
      ],
      "verified_by": [
        "tests/deployment/test_component_names_and_scripts.py:40"
      ],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**`agent-utilities-doctor` console-script collision resolved.** GraphOS's `pyproject.toml` is the sole declarer of the `agent-utilities-doctor` console script (`graph_os.deployment.doctor:main`). The agent runtime's `pyproject.toml` no longer registers the same script name against its own separate `agent_utilities.deployment.doctor:main`. The agent runtime's `agent_utilities.deployment.doctor` module itself may remain while it still has real non-test importers. Only the duplicate console-script registration is required to be gone. | A package-metadata check confirms exactly one installed distribution declares the `agent-utilities-doctor` entry point, and it resolves to `graph_os.deployment.doctor:main`.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 12
    },
    {
      "id": "GRAPHOS-DEPLOY-R007.2",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "`setup-config` console-script collision resolved",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "d6f16cd447e2",
        "fd761d59a171"
      ],
      "verified_by": [
        "tests/deployment/test_component_names_and_scripts.py:49"
      ],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**`setup-config` console-script collision resolved.** GraphOS's `pyproject.toml` is the sole declarer of the `setup-config` console script (`graph_os.deployment.cli:main`). The agent runtime's `pyproject.toml` no longer registers the same script name against its own separate `agent_utilities.deployment.cli:main`. The agent runtime's `agent_utilities.deployment.cli` module itself may remain while it is still exercised directly (by a test, or via `python -m`). Only the duplicate console-script registration is required to be gone. | A package-metadata check confirms exactly one installed distribution declares the `setup-config` entry point, and it resolves to `graph_os.deployment.cli:main`.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 13
    },
    {
      "id": "GRAPHOS-DEPLOY-R007.3",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "`graph-os-daemon` console-script collision resolved",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "fd761d59a171"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**`graph-os-daemon` console-script collision resolved.** GraphOS's `pyproject.toml` is the sole declarer of the `graph-os-daemon` console script (`graph_os.gateway.daemon:main`). The agent runtime's `pyproject.toml` no longer registers the same script name against its own separate `agent_utilities.gateway.daemon:main`. The agent runtime's `agent_utilities.gateway.daemon` module itself may remain while it still has real non-test importers. Only the duplicate console-script registration is required to be gone. | A package-metadata check confirms exactly one installed distribution declares the `graph-os-daemon` entry point, and it resolves to `graph_os.gateway.daemon:main`.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 14
    },
    {
      "id": "GRAPHOS-DEPLOY-R007.4",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "`agent-utilities-venv` console-script collision resolved",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "fd761d59a171"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**`agent-utilities-venv` console-script collision resolved.** GraphOS's `pyproject.toml` is the sole declarer of the `agent-utilities-venv` console script (`graph_os.deployment.venv_sync:main`). The agent runtime's `pyproject.toml` no longer registers the same script name against its own separate `agent_utilities.deployment.venv_sync:main`. The agent runtime's `agent_utilities.deployment.venv_sync` module itself may remain while it still has real non-test importers. Only the duplicate console-script registration is required to be gone. | A package-metadata check confirms exactly one installed distribution declares the `agent-utilities-venv` entry point, and it resolves to `graph_os.deployment.venv_sync:main`.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 15
    },
    {
      "id": "GRAPHOS-DEPLOY-R007.5",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "`graph-os-release-canary` console-script collision resolved",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "fd761d59a171"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**`graph-os-release-canary` console-script collision resolved.** GraphOS's `pyproject.toml` is the sole declarer of the `graph-os-release-canary` console script (`graph_os.deployment.release_canary:main`). The agent runtime's `pyproject.toml` no longer registers the same script name against its own separate `agent_utilities.deployment.release_canary:main`. The agent runtime's `agent_utilities.deployment.release_canary` module itself may remain while it still has a real non-test importer. Only the duplicate console-script registration is required to be gone. | A package-metadata check confirms exactly one installed distribution declares the `graph-os-release-canary` entry point, and it resolves to `graph_os.deployment.release_canary:main`.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 16
    },
    {
      "id": "GRAPHOS-DEPLOY-R008",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "GraphOS hosts its own boundary modules",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "ae856bc9a101"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**GraphOS hosts its own boundary modules.** GraphOS hosts its own security request-identity, error-surface, browser-auth and security-policy-middleware modules with their conformance tests. It also hosts its own gateway and runtime health and metrics observability. It also hosts its own profile-guard, install, release-channel, live-mount-guard, paths, workspace and config-admin core modules. It also hosts its own hook-installer, agent-manager-dashboard, release-catalog and gateway-client modules. It also hosts its own connection-registry and engine-discovery modules under `graph_os.fleet`. | A package-layout census confirms these modules are imported only from their GraphOS location. It also confirms the agent runtime no longer declares equivalents.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 17
    },
    {
      "id": "GRAPHOS-DEPLOY-R009",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "GraphOS owns hosting/deployment configuration settings",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ae856bc9a101"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**GraphOS owns hosting/deployment configuration settings.** GraphOS owns the hosting and deployment configuration settings split out of the agent runtime's monolithic configuration module, while connector base settings move to the connector SDK's own configuration module and agent/model settings remain with the agent runtime. | A configuration-schema test confirms GraphOS resolves its hosting and deployment settings from its own module without importing the agent runtime's configuration internals.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 18
    },
    {
      "id": "GRAPHOS-DEPLOY-R009.1",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "GraphOS hosts a typed `graph_os.core.config_admin` hosting/deployment settings module",
      "delivery_state": "VERIFIED",
      "state": "verified",
      "done": true,
      "landed_in": [
        "ae856bc9a101"
      ],
      "verified_by": [
        "tests/core/test_config_admin.py:17",
        "tests/core/test_config_admin.py:30",
        "tests/core/test_config_admin.py:41",
        "tests/core/test_config_admin.py:57"
      ],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**GraphOS hosts a typed `graph_os.core.config_admin` hosting/deployment settings module.** GraphOS resolves host, port, deploy-profile and data-dir settings from its own validated, typed module. It has no import of the agent runtime's configuration internals. | A test confirms the module's source has no reference to the agent runtime's configuration module. It also confirms the module resolves documented defaults and environment overrides. It also confirms the module rejects an invalid port or deploy profile.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 19
    },
    {
      "id": "GRAPHOS-DEPLOY-R010",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Ecosystem and repository development skills are published",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "96e23d7f4ed4"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Ecosystem and repository development skills are published.** GraphOS publishes an ecosystem-wide development skill and its own repository development skill documenting architecture boundaries, build-host requirements, required gates, contract regeneration, and identity setup for working in this codebase; GraphOS's `AGENTS.md` is trimmed to navigation with a pointer to that skill. | A documentation-freshness check confirms the skill content matches current gate commands and `AGENTS.md` contains the pointer rather than duplicated procedure.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 20
    },
    {
      "id": "GRAPHOS-DEPLOY-R011",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Deployment layout test suite passes in full",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "2b605acbf3a6",
        "962462cdc788"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Deployment layout test suite passes in full.** GraphOS's deployment manifest layout passes its full deployment test suite with no failing tests. | The deployment test suite reports all tests passing, including cases that previously failed on this layout.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 21
    },
    {
      "id": "GRAPHOS-DEPLOY-R012",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Pipelines dependency is referenced at main, never pinned",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "0f780429fb19",
        "6c4b89f91732"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Pipelines dependency is referenced at main, never pinned.** GraphOS's pre-commit configuration and GitHub Actions workflows reference the shared pipelines repository at its default branch. They do not use a pinned commit. GraphOS therefore automatically tracks pipeline fixes. | A reference-pin lint check fails any pre-commit `rev:` or workflow `uses:` entry for the pipelines repository that names a commit instead of the default branch.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 22
    },
    {
      "id": "GRAPHOS-DEPLOY-R013",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Development and production deployment profiles",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [
        "0da5f7440603",
        "2abb9ebb3905",
        "99028d9d9f82",
        "d75db1ea42e8",
        "e9d992980035"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Development and production deployment profiles.** GraphOS's deployment skills provide a development profile using Docker Compose on a single host with no or local identity. They also provide a production profile using Kubernetes/Helm with external or local identity. Each profile runs the graph engine as a sidecar. Each profile enforces an identity mode with a forced first administrator. Each profile applies default authorization policy and selects an appropriate secrets backend. Each profile also performs first-boot verification. These GraphOS-owned skills replace the agent runtime's retired deployment copies. The connector SDK's federation capability replaces any direct graph-database mirror. | A first-boot test provisions each profile. It confirms readiness, administrator creation, and the selected secrets backend before accepting traffic.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 23
    },
    {
      "id": "GRAPHOS-DEPLOY-R014",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Agent runtime split into connector SDK, GraphOS and engine",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "fe7c5c9a4a32"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Agent runtime split into connector SDK, GraphOS and engine.** The former agent runtime is split into separately published repositories: the connector SDK, GraphOS, and the graph engine, each publishing its own installable package so GraphOS depends on the others only through their public APIs. | GraphOS's dependency manifest pins each split repository's published package rather than a path into the former combined source tree.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 24
    },
    {
      "id": "GRAPHOS-DEPLOY-R015",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "AVX2 guard test runs on any hosted runner",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "67a387e5dbed"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**AVX2 guard test runs on any hosted runner.** GraphOS's AVX2 guard test validates CPU feature-detection logic without asserting that the execution host lacks the AVX2 instruction set, so it passes on both AVX2-capable and non-AVX2 hosts. | The guard test passes in continuous integration on a standard hosted runner in addition to a non-AVX2 target host.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 25
    },
    {
      "id": "GRAPHOS-DEPLOY-R016",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "One host daemon process shares the in-pod engine",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "8b20c11b5dc5",
        "eb31b7757681",
        "f3bcee6dfbcf"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**One host daemon process shares the in-pod engine.** A Kubernetes deployment that pins its serving container to the client role runs exactly one separate host-role daemon container in the same pod. The daemon container uses the serving image and source mounts. It runs `graph_os.gateway.daemon` with daemons enabled. It serves no MCP, web UI or messaging intake. It connects to the in-pod engine over the shared Unix socket volume and never spawns an engine. It authenticates with the GraphOS process identity. It shares the task-queue data volume with the serving container. | A manifest contract test asserts exactly one host-role container, the client-role serving container, the daemon entry point, the Unix socket endpoint, the shared volumes and the shared image. A server-side dry run accepts the manifest. A live receipt shows the daemon holding the host lock and the sparse index rising above zero.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 26
    },
    {
      "id": "GRAPHOS-DEPLOY-R017",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Deployment placement and sequencing go through the engine decision functionality",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Deployment placement and sequencing go through the engine decision functionality.** GraphOS adds no deployment planner. Where to run is one typed Decide question asked of the engine (`EG-DECISION-ENGINE-R046`/`R111`); the ordered fleet-tool steps are an engine-assembled agent graph (`AgentAssemble`, `EG-DECISION-ENGINE-R036`) shown to the operator and confirmed through `graphos.plan/confirm`; manifests are the existing `deploy/` artifacts. Supersedes the deleted agent-utilities planner (AU-BOUNDARY-R002.2) without re-creating it. Rollup: LANDED when every `GRAPHOS-DEPLOY-R017.<n>` child is LANDED. | A package-layout test shows no graph-os plan type or backend selection exists and the children pass.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 27
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.1",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Placement Decide mapping",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Placement Decide mapping.** Add a typed request/response mapping that asks the engine one placement Decide question and returns the engine decision verbatim, with no backend selection in graph-os, in graph_os/deployment/placement.py. Depends on `EG-DECISION-ENGINE-R046`/`R111`; needs the engine prerequisite below. | tests/deployment/test_placement_decide.py: request fields, decision passed through unchanged, no backend names referenced in graph-os.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 28
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.2",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Request assembly for a deployment task",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Request assembly for a deployment task.** Add a function that submits a deployment task to the engine's `AgentAssemble` (`EG-DECISION-ENGINE-R036`, routed per `R044`) in graph_os/deployment/assembly.py and returns the engine's assembled graph unmodified. | tests/deployment/test_deploy_assembly_request.py with a fake engine: task and capabilities sent, graph returned as-is.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 29
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.3",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Present the assembled graph read-only",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Present the assembled graph read-only.** Add a read-only presenter that prints the engine-returned graph for the operator and cannot mutate or dispatch it, in graph_os/deployment/assembly_view.py. | tests/deployment/test_deploy_assembly_view.py: output lists nodes in engine order; presenter has no dispatch path.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 30
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.4",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Confirm through plan/confirm",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Confirm through plan/confirm.** Route operator confirmation of the assembled graph through `graphos.plan/confirm` (rows `GRAPHOS-A2A-R005.1`/`R006.1`) and record the choice with `decide.commit`, in graph_os/deployment/assembly.py calling graph_os/a2a/application.py and graph_os/api/ops/decide.py. | tests/deployment/test_deploy_confirm.py: confirmation goes only through plan/confirm; nothing runs unconfirmed.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 31
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.5",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Typed refusal while unavailable",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Typed refusal while unavailable.** Return a typed refusal when the engine assemble handler or the confirm surface is unavailable (today both are refusal stubs), in graph_os/deployment/assembly.py. | tests/deployment/test_deploy_refusal.py: stub assemble and stub confirm each produce a distinct typed refusal and no side effect.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 32
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.6",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Existing artifact per target",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Existing artifact per target.** Select the existing deploy artifact for a decided target from deploy/environments; add no renderer. Compose, helm and swarm are supported; systemd is explicitly unsupported, in graph_os/deployment/artifacts.py. | tests/deployment/test_deploy_artifacts.py: each of compose, helm, swarm resolves to an existing file, image references are digest-pinned via scripts/check_deployment_image_digests.py, systemd is refused as unsupported.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 33
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.7",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "In-process unchanged",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**In-process unchanged.** Keep `start_composed_services` as the in-process path; no wrapper or plan type, verified by a test only. | tests/deployment/test_deployment_in_process.py: live start calls `start_composed_services` with a fake supervisor and composition from `detect_composition`.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 34
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.8",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Thin setup-config subcommand",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Thin setup-config subcommand.** Add a `setup-config deploy` subcommand that asks the engine (rows .1 and .2) and prints the returned decision and assembled graph. It holds no planning logic, in graph_os/deployment/cli.py. | tests/deployment/test_deploy_cli.py: output equals the fake engine's decision and graph. The handler imports no backend or renderer.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 35
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.9",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Checker dispatches on document shape",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Checker dispatches on document shape.** In scripts/check_deployment_image_digests.py, add one dispatch in `_check_resource` so a document with a top-level `services` mapping and no `kind` goes to a new compose/swarm walker while Kubernetes documents are unchanged. | tests/deployment/test_image_digests.py: a Compose fixture is walked; every existing Kubernetes case still passes.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 36
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.10",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Compose/Swarm literal images use the existing grammar",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Compose/Swarm literal images use the existing grammar.** Add the walker `_check_services` in scripts/check_deployment_image_digests.py that passes each service `image` through `_valid_image` and counts it, rejecting a service with no `image`. | tests/deployment/test_image_digests.py: pinned literal accepted, tagged literal and missing image rejected with a `services.<name>.image` location.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 37
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.11",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Template mode accepts the required-variable form",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Template mode accepts the required-variable form.** Add one rule in scripts/check_deployment_image_digests.py: an image of exactly `${NAME:?...}` is accepted and counted as pin-required. `${NAME:-default}` and `${NAME}` are validated or rejected, never accepted blindly. | tests/deployment/test_image_digests.py: `${X:?m}` accepted; `${X:-repo:latest}` and bare `${X}` rejected; `${X:-repo@sha256:<hex>}` accepted.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 38
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.12",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Resolve mode checks the supplied value",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Resolve mode checks the supplied value.** Add a repeatable `--set NAME=value` argument to scripts/check_deployment_image_digests.py that substitutes before validation so the real reference is checked. | tests/deployment/test_image_digests.py: `--set` with a digest passes, with a tag fails, with an unused name is an error.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 39
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.13",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Run the checker on the shipped Compose and Swarm files",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Run the checker on the shipped Compose and Swarm files.** Add one test that runs the script against deploy/compose/compose.yaml and deploy/swarm/stack.yml in template mode and again with a fixture digest via `--set`. | tests/deployment/test_deploy_artifacts.py: both files exit 0 and report one image each; a tag value for GRAPHOS_IMAGE exits 1.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 40
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.14",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Helm pinned and default renders",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Helm pinned and default renders.** Add a values fixture with a digest for `graphos.image`, `engine.image` and one connector, and a test (skipped when `helm` is absent) that renders it and pipes to the script, expecting exit 0 with the graph-os, daemon, engine and connector images checked; a default-values render must exit 1. | tests/deployment/test_helm_image_digests.py: pinned render passes; default render fails on `replace-me`.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 41
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.15",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "systemd stays refused",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**systemd stays refused.** Add the typed `unsupported_target` refusal naming the bare-metal reference for `systemd` in graph_os/deployment/artifacts.py (extends R017.6). | tests/deployment/test_deploy_artifacts.py: `systemd` refused, compose/helm/swarm still resolve.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 42
    },
    {
      "id": "GRAPHOS-DEPLOY-R017.16",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Environment policy drives the check",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Environment policy drives the check.** Add one function in graph_os/deployment/artifacts.py that maps `release.tag_policy` from the selected deploy/environments profile to whether the digest check is required (required for `digest-pinned`, skipped with an explicit note for `floating-tag`). | tests/deployment/test_deploy_artifacts.py: prod and test require the check, dev reports it skipped by policy.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 43
    },
    {
      "id": "GRAPHOS-DEPLOY-R018",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Small deployment shares one engine per host",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Small deployment shares one engine per host.** A small GraphOS deployment must start its own engine only when none answers on the host, and every GraphOS or agent server on that host must share one engine. Rollup: LANDED when every `GRAPHOS-DEPLOY-R018.<n>` child is LANDED. | A package-layout test shows no second engine is spawned and the children pass.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 44
    },
    {
      "id": "GRAPHOS-DEPLOY-R018.1",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Engine endpoint type",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Engine endpoint type.** GraphOS must model an engine endpoint as a Unix socket path or a remote URL in graph_os/mcp_server/composition.py. | tests/deployment/test_engine_endpoint.py: both forms parse; an empty or malformed endpoint is rejected.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 45
    },
    {
      "id": "GRAPHOS-DEPLOY-R018.2",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Probe before start",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Probe before start.** `detect_composition` must probe the configured endpoint and report a running engine before any start decision, in graph_os/mcp_server/composition.py. | tests/deployment/test_engine_probe.py: live fake engine detected; dead socket reported absent.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 46
    },
    {
      "id": "GRAPHOS-DEPLOY-R018.3",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Start only when absent",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Start only when absent.** `start_composed_services` must start the engine only when the probe finds none, and must record that it is the owner. | tests/deployment/test_engine_owner.py: absent starts once and records owner; present starts nothing.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 47
    },
    {
      "id": "GRAPHOS-DEPLOY-R018.4",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Second process attaches",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Second process attaches.** A second GraphOS or agent server on the same host must attach to the running engine and spawn none. | tests/deployment/test_engine_attach.py: two processes, one engine, spawn count is one.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 48
    },
    {
      "id": "GRAPHOS-DEPLOY-R018.5",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Owner stands down the engine",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Owner stands down the engine.** The owner must stop the engine it started on exit when no attached client remains, and must leave it running otherwise. | tests/deployment/test_engine_standdown.py: last client exit stops the engine; early owner exit does not.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 49
    },
    {
      "id": "GRAPHOS-DEPLOY-R018.6",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Remote engine skips local start",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Remote engine skips local start.** A configured remote engine URL must skip local start, and GraphOS must refuse to start when that URL carries no verified credential. | tests/deployment/test_remote_engine.py: remote URL starts nothing locally; missing credential gives a typed refusal.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 50
    },
    {
      "id": "GRAPHOS-DEPLOY-R010.1",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Preserve development skill coverage",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Preserve development skill coverage.** Model: The original parent remains the complete contract. Behavior: Retain every original skill topic, architecture boundary, build-host rule, gate, regeneration command and identity setup obligation. Wiring: Use the original documentation-freshness check and AGENTS navigation check. Refusal: New child evidence cannot replace any original acceptance obligation. Evidence: Retain the original parent receipts and require its complete acceptance. | The complete original R010 documentation acceptance remains binding.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 51
    },
    {
      "id": "GRAPHOS-DEPLOY-R010.2",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Keep deployment guidance executable and synchronized",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Keep deployment guidance executable and synchronized.** Model: `DeploymentExample` binds profile, configuration schema, transport, argument vector and expected probe. Behavior: Keep matching deployment examples in the packaged skill, README and documentation, including stdio and streamable HTTP. Wiring: Extend the existing development and deployment skills; derive example fields from the same host declarations and parser. Refusal: Undocumented consumed variables, unsupported commands and divergent profiles fail the documentation check. Evidence: Record example digests and actual parser and probe results. | Extract all three surfaces, parse their examples and start both transport fixtures. An obsolete flag or missing required field fails.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 52
    },
    {
      "id": "GRAPHOS-DEPLOY-R010.3",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Publish complete supported-profile instructions",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Publish complete supported-profile instructions.** Model: Each profile example declares prerequisites, install source, authority setup, startup, probes, logs and shutdown. Behavior: Document production package or pinned-image installation and explicit development editable installation separately. Wiring: Reuse the profile matrix under R013 and public deployment skill references. Refusal: A missing adapter stays unavailable; guidance must not present an unimplemented target as supported. Evidence: Bind each instruction set to its profile digest and repeatable clean-environment commands. | A contributor follows each supported profile from a fresh environment to a real served probe, then performs the documented shutdown.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 53
    },
    {
      "id": "GRAPHOS-DEPLOY-R013.1",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Preserve original profile and first-boot obligations",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Preserve original profile and first-boot obligations.** Model: The original parent remains the complete contract. Behavior: Retain both original profiles, identity modes, forced administrator, policy, secrets, sidecar topology and first-boot checks. Wiring: Keep GraphOS deployment skill ownership and SDK federation replacing direct graph-database mirrors. Refusal: New child evidence cannot replace any original acceptance obligation. Evidence: Retain the original parent receipts and require its complete acceptance. | The original first-boot tests still prove readiness, administrator creation and the chosen secrets backend before traffic.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 54
    },
    {
      "id": "GRAPHOS-DEPLOY-R013.2",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Record explicit component deploy or reuse choices",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Record explicit component deploy or reuse choices.** Model: `ComponentDeploymentChoice` binds component ID, selected action, endpoint reference, profile and operator confirmation. Behavior: Ask separately for every component; select deploy or reuse explicitly. Preserve operator tunings in the resolved configuration. Wiring: Extend `deployment/cli.py:134` and `genesis_environments.py`; submit choices as constraints to existing R017 engine decisions. Refusal: Missing choices, conflicting endpoints and undeclared components refuse before deployment. Evidence: Record the confirmed component inventory and its canonical digest without credentials. | Run onboarding with all-new, all-reused and mixed components. The actual presented choices match the confirmed inventory exactly.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 55
    },
    {
      "id": "GRAPHOS-DEPLOY-R013.3",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Make reused components connect-only",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Make reused components connect-only.** Model: A reuse choice is an immutable no-deployment constraint in the approved request. Behavior: Validate connectivity and compatibility without installing, replacing, configuring remotely or restarting the existing component. Wiring: Apply the constraint before every deployment action under R017 and the SDK effect boundary. Refusal: A plan containing effects for a reused component refuses before any source call. Unreachable reuse never falls back to deployment. Evidence: Record read-only probes and zero create, update, delete, restart and credential-write effects for reused components. | Inject a create or update for a reused service and require zero effects. A healthy reused service connects without mutation.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 56
    },
    {
      "id": "GRAPHOS-DEPLOY-R013.4",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Define the complete deployment target matrix",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Define the complete deployment target matrix.** Model: Each profile binds an explicit target, runtime and privilege triple from the plan matrix. Behavior: Standalone and compose each require the cross-product of daemon-managed and daemonless runtimes with rootful and rootless modes. Wiring: Extend existing profile validation and deployment artifacts; R017 remains the placement and assembly authority. Refusal: Missing target adapters or required privileges yield `unsupported_target`; never silently substitute another runtime. Evidence: Record selected target, privilege mode, package or image digest, capability probe and artifact digest. | Derive cases from every declared triple and require the complete container cross-product. Each cell needs served success and no-effect refusal evidence.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 57
    },
    {
      "id": "GRAPHOS-DEPLOY-R013.5",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Bind confirmed profiles to governed deployment",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Bind confirmed profiles to governed deployment.** Model: Confirmation binds component choices, target, resolved configuration digest, artifact digest and checked actor. Behavior: Present engine-produced placement and ordered steps; admit only the confirmed exact plan before SDK source effects. Wiring: Reuse R017 and GRAPHOS-A2A-R005/R006; their missing deployment-question and confirmation producers remain prerequisites. Refusal: Changed choices, stale artifacts, unavailable authority and unmatched receipts refuse. GraphOS creates no parallel deployment planner. Evidence: Join confirmed request, engine decision, SDK effects and served post-deploy probes. | A valid mixed deployment changes only deploy-marked components. Altered bindings cause zero deployment effects through the real command.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 58
    },
    {
      "id": "GRAPHOS-DEPLOY-R013.6",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Prove component choices and target profiles",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Prove component choices and target profiles.** Model: Seeded component inventories cover deploy, reuse, compatibility and target capability combinations. Behavior: Invoke the actual onboarding command, governed application and served first-boot probes. Wiring: Proposed `tests/deployment/test_component_choices_served.py` uses controlled services and the existing R017 path. Refusal: Mocked plan rendering alone cannot prove no-effect reuse or functional target startup. Evidence: Record exact component effects, resource identities, profile digests, readiness and surviving reused services. | For seed 4110, run 32 mixed inventories plus cases derived from every matrix triple. Omitted privilege cells fail coverage; refused plans cause zero effects.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 59
    },
    {
      "id": "GRAPHOS-DEPLOY-R018.7",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Preserve reuse through engine attachment",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Preserve reuse through engine attachment.** Model: The confirmed engine choice binds the selected endpoint and its compatibility evidence. Behavior: A reuse-marked engine only attaches; a dead endpoint never authorizes a local replacement. All existing R018 children still bind. Wiring: Extend `detect_composition` and `start_composed_services` using the R013 confirmed choice. Refusal: Unavailable or incompatible reuse returns a typed refusal with zero starts. Evidence: Record actual endpoint identity and engine start count across repeated starts. | Two hosts reuse one engine, then repeat with it unavailable. The unavailable case starts zero replacement engines.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 60
    },
    {
      "id": "GRAPHOS-DEPLOY-R018.8",
      "kind": "requirement",
      "parent": "GRAPHOS-DEPLOY",
      "source": "specs/portable-deployment/status.json",
      "title": "Keep reused resources alive across host shutdown",
      "delivery_state": "SPECIFIED",
      "state": "specified",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "parent_title": "GRAPHOS-DEPLOY \u2014 Portable GraphOS development and deployment",
      "definition": "**Keep reused resources alive across host shutdown.** Model: Lifecycle ownership distinguishes a created engine from a reused endpoint. Behavior: Stop only resources this start owns under the original last-client rule; never stop a reused service. Wiring: Use the existing composition supervisor and R018.3 through R018.6 ownership contract. Refusal: Unknown ownership refuses destructive cleanup rather than guessing. Evidence: Record shutdown decisions and independent post-exit probes of reused endpoints. | Restart and stop both host clients. The reused engine remains reachable; the original owned-engine last-client tests remain required.",
      "definition_source": "specs/portable-deployment/requirements.md",
      "definition_line": 61
    },
    {
      "id": "GRAPHOS-INGRESS",
      "kind": "spec",
      "parent": null,
      "source": "specs/public-ingress-identity/status.json",
      "title": "GRAPHOS-INGRESS \u2014 Portable public ingress and identity cutover",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [],
      "verified_by": [],
      "document": "specs/public-ingress-identity/spec.md",
      "component": "Unassigned",
      "code_refs": [
        {
          "declared_in": "specs/public-ingress-identity/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "access control",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/identity-access/plan.md"
        },
        {
          "declared_in": "specs/public-ingress-identity/plan.md",
          "evidence": "file exists; coverage not verified",
          "label": "docs/quality-gate-terms.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/docs/quality-gate-terms.md"
        },
        {
          "declared_in": "specs/public-ingress-identity/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Cutover",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/public-ingress-identity/plan.md#cutover-and-rollback"
        },
        {
          "declared_in": "specs/public-ingress-identity/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Portable proof",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/public-ingress-identity/plan.md#quality-and-release-gates"
        },
        {
          "declared_in": "specs/public-ingress-identity/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Profile contract",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/public-ingress-identity/plan.md#profile-and-interface-contract"
        },
        {
          "declared_in": "specs/public-ingress-identity/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Request path",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/public-ingress-identity/plan.md#request-and-deployment-path"
        },
        {
          "declared_in": "specs/public-ingress-identity/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "Security",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/public-ingress-identity/plan.md#security-and-failure-handling"
        },
        {
          "declared_in": "specs/public-ingress-identity/spec.md",
          "evidence": "file exists; coverage not verified",
          "label": "requirements.md",
          "repository": "Knuckles-Team/graph-os",
          "role": "documentation",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/public-ingress-identity/requirements.md"
        }
      ],
      "relations": [
        {
          "declared_in": "specs/public-ingress-identity/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "Access control",
          "repository": "Knuckles-Team/graph-os",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/identity-access/spec.md"
        },
        {
          "declared_in": "specs/public-ingress-identity/spec.md",
          "evidence": "file exists; coverage not verified",
          "kind": "references",
          "label": "Portable deployment",
          "repository": "Knuckles-Team/graph-os",
          "url": "https://github.com/Knuckles-Team/graph-os/blob/331044ed7daec51a3633e0a7ea712293b2063bf3/specs/portable-deployment/spec.md"
        }
      ],
      "plan_diagrams": [
        "flowchart LR\n  Browser --> Ingress[Operator TLS ingress]\n  Ingress --> Gateway[GraphOS gateway]\n  Gateway --> Admission[Existing identity middleware]\n  Admission --> Service[GraphOS application service]\n  Service --> Engine[Graph engine authorization]\n  Browser --> IdP[Operator OIDC provider]\n"
      ],
      "unparsed_references": []
    },
    {
      "id": "GRAPHOS-INGRESS-R001",
      "kind": "requirement",
      "parent": "GRAPHOS-INGRESS",
      "source": "specs/public-ingress-identity/status.json",
      "title": "Public ingress rename with Keycloak and OpenBao cutover",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "d35d445334f2"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-INGRESS \u2014 Portable public ingress and identity cutover",
      "definition": "**Public ingress rename with Keycloak and OpenBao cutover.** GraphOS's public ingress is served from its own hostname with a renamed TLS certificate, ingress resource and secret, backed by an OpenBao-stored key delivered through an ExternalSecret, updated Keycloak redirect URIs, and the corresponding host-path and environment configuration; a time-bounded redirect from the prior hostname is available during cutover. | A served probe completes a browser login through Keycloak against the new hostname and confirms the MCP and REST endpoints respond under the renamed ingress.",
      "definition_source": "specs/public-ingress-identity/requirements.md",
      "definition_line": 5
    },
    {
      "id": "GRAPHOS-INGRESS-R001.1",
      "kind": "requirement",
      "parent": "GRAPHOS-INGRESS",
      "source": "specs/public-ingress-identity/status.json",
      "title": "Typed public-ingress profile model",
      "delivery_state": "LANDED",
      "state": "landed",
      "done": false,
      "landed_in": [
        "d35d445334f2"
      ],
      "verified_by": [],
      "parent_title": "GRAPHOS-INGRESS \u2014 Portable public ingress and identity cutover",
      "definition": "**Typed public-ingress profile model.** A closed-schema, versioned value object (`PublicIngressProfile`) carries the canonical public origin, TLS secret reference, exact callback URI and trusted-proxy identity, independent of `EnvironmentProfile`; it refuses an unknown field, a missing/malformed TLS reference, a malformed callback, an HTTP origin that is not loopback, and a wildcard Host or proxy. | Unit tests (T-IN-01/T-IN-02) show a deterministic redacted render for a valid mapping and a named-key refusal for each malformed/unknown/missing input, with no secret value in any error text.",
      "definition_source": "specs/public-ingress-identity/requirements.md",
      "definition_line": 6
    }
  ],
  "github": {
    "issues": {
      "available": true,
      "items": []
    },
    "pull_requests": {
      "available": true,
      "items": [
        {
          "number": 279,
          "title": "Draft GraphOS audit batch: owner-bound specification group",
          "html_url": "https://github.com/Knuckles-Team/graph-os/pull/279",
          "created_at": "2026-10-12T16:45:09Z",
          "updated_at": "2026-10-12T20:20:47Z"
        }
      ]
    }
  },
  "spec_edges": [
    [
      "GRAPHOS-A2A",
      "references",
      "https://github.com/Knuckles-Team/agent-utilities/blob/main/specs/agent-control-plane/spec.md"
    ],
    [
      "GRAPHOS-A2A",
      "references",
      "https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/decision-engine/spec.md"
    ],
    [
      "GRAPHOS-ACP",
      "references",
      "AU-CONTROL-001"
    ],
    [
      "GRAPHOS-ACP",
      "references",
      "GRAPHOS-IDENTITY"
    ],
    [
      "GRAPHOS-CAPACITY",
      "references",
      "GRAPHOS-OPS"
    ],
    [
      "GRAPHOS-HOST",
      "references",
      "GRAPHOS-A2A"
    ],
    [
      "GRAPHOS-INGRESS",
      "references",
      "GRAPHOS-DEPLOY"
    ],
    [
      "GRAPHOS-INGRESS",
      "references",
      "GRAPHOS-IDENTITY"
    ],
    [
      "GRAPHOS-MCP-RESOURCES",
      "references",
      "GRAPHOS-FLEET"
    ],
    [
      "GRAPHOS-MCP-RESOURCES",
      "references",
      "fleet-catalog-and-tools/spec.md"
    ],
    [
      "GRAPHOS-MCP-RESOURCES",
      "references",
      "https://github.com/Knuckles-Team/epistemic-graph/blob/main/specs/repository-index-and-ingestion/spec.md"
    ],
    [
      "GRAPHOS-OPS",
      "references",
      "GRAPHOS-A2A"
    ],
    [
      "GRAPHOS-RELEASE",
      "references",
      "GRAPHOS-DEPLOY"
    ],
    [
      "GRAPHOS-RELEASE",
      "references",
      "GRAPHOS-INGRESS"
    ]
  ]
}
