{
  "version": "0.4-pre",
  "updatedAt": "2026-06-19",
  "rules": [
    {
      "id": "guardrail.ops.must_qualify_ops_term",
      "severity": "error",
      "summary": "Do not say OPS without specifying OPS Product, OPS Gateway, or ENGINE-side OpsLayer.",
      "entityIds": ["ops.card", "agent.identity", "engine.tech_debt.ops_layer"]
    },
    {
      "id": "guardrail.ops.card_is_root_work_object",
      "severity": "error",
      "summary": "Use ops.card as canonical work object; issue/task/work item are aliases or subtypes.",
      "entityIds": ["ops.card", "ops.card_type"]
    },
    {
      "id": "guardrail.hub.open_contour_not_client_context",
      "severity": "error",
      "summary": "hub.open_contour is not an ordinary hub.client_context.",
      "entityIds": ["hub.open_contour", "hub.client_context", "hub.public_pool_client"]
    },
    {
      "id": "guardrail.hub.application_card_not_authority",
      "severity": "error",
      "summary": "hub.application_card is presentation only; access authority belongs to application_access/grant/exception.",
      "entityIds": ["hub.application_card", "hub.application_access", "hub.app_grant", "hub.app_exception"]
    },
    {
      "id": "guardrail.gateway.identity_not_user_or_assistant",
      "severity": "error",
      "summary": "agent.identity is Gateway execution identity, not human user and not assistant persona.",
      "entityIds": ["agent.identity", "hub.user", "assistant.assistant"]
    },
    {
      "id": "guardrail.gateway_enforces_permissions",
      "severity": "error",
      "summary": "Ontology advises context; OPS Gateway enforces grants, scopes, audit, and idempotency.",
      "entityIds": ["agent.grant", "agent.scope", "agent.audit_event", "agent.idempotency_key", "assistant.bridge"]
    },
    {
      "id": "guardrail.engine.l1_l2_runtime_ids_are_distinct",
      "severity": "error",
      "summary": "engine.workflow_l1 id, engine.workflow_l2, and engine.workflow_l2_runtime_id are distinct concepts.",
      "entityIds": ["engine.workflow_l1", "engine.workflow_l2", "engine.workflow_l2_runtime_id"]
    },
    {
      "id": "guardrail.engine.ops_layer_noncanonical",
      "severity": "error",
      "summary": "ENGINE-side OpsLayer/Agent Monitor/tender UI are current tech debt and must not define OPS Product ontology.",
      "entityIds": ["engine.tech_debt.ops_layer", "engine.tech_debt.agent_monitor_node", "engine.tech_debt.tender_domain_ui", "ops.card"]
    },
    {
      "id": "guardrail.interface_layer_not_engine_core_ui",
      "severity": "warning",
      "summary": "Future automation UI belongs in a dedicated Interface Layer, not hardcoded inside ENGINE core.",
      "entityIds": ["future.interface_layer", "future.interface_view", "future.interface_binding", "engine.workflow_l1"]
    },
    {
      "id": "guardrail.assistant_role_never_bypasses_launcher_scope",
      "severity": "error",
      "summary": "Assistant admin role unlocks assistant-admin commands only inside existing Launcher root/client admin scope.",
      "entityIds": ["assistant.access_role", "assistant.admin_scope", "hub.membership", "hub.role"]
    },
    {
      "id": "guardrail.assistant_blocked_hides_all_surfaces",
      "severity": "error",
      "summary": "Blocked assistant access means no assistant icon/surface and no assistant capability in HUB, OPS Product, ENGINE, or Gateway flows.",
      "entityIds": ["assistant.core_access", "assistant.access_role", "assistant.capability"]
    },
    {
      "id": "guardrail.assistant_member_not_admin",
      "severity": "error",
      "summary": "Assistant member mode allows personal/basic assistant use but not user, role, invite, or cross-user access administration.",
      "entityIds": ["assistant.access_role", "assistant.capability", "hub.user", "hub.invite"]
    },
    {
      "id": "guardrail.assistant_actions_must_be_registered",
      "severity": "error",
      "summary": "Assistant must resolve user requests to registered action cards before policy checks or execution.",
      "entityIds": ["assistant.action_registry", "assistant.action", "assistant.action_request"]
    },
    {
      "id": "guardrail.assistant_never_hard_deletes",
      "severity": "error",
      "summary": "Assistant actions must not hard-delete users, records, database rows, files, or production state.",
      "entityIds": ["assistant.action", "assistant.risk_policy", "hub.user", "ops.card", "engine.workflow_l1"]
    },
    {
      "id": "guardrail.assistant_no_self_lockout",
      "severity": "error",
      "summary": "Assistant must not allow a user to remove, block, or disable their own last admin/access path.",
      "entityIds": ["assistant.action", "assistant.admin_scope", "hub.membership", "hub.user"]
    }
  ],
  "blockedConflations": [
    ["ops.card", "engine.tech_debt.ops_layer"],
    ["agent.identity", "hub.user"],
    ["agent.identity", "assistant.assistant"],
    ["assistant.access_role", "hub.role"],
    ["assistant.admin_scope", "agent.grant"],
    ["assistant.action", "assistant.capability"],
    ["hub.open_contour", "hub.client_context"],
    ["hub.application_card", "hub.application_access"],
    ["engine.workflow_l1", "engine.workflow_l2_runtime_id"],
    ["future.interface_layer", "engine.tech_debt.tender_domain_ui"]
  ]
}
