{
  "bundleVersion": "airlock-evidence/v1",
  "result": {
    "airlockVersion": "0.1.0",
    "manifestPath": "manifests/openclaw-oc4.json",
    "agent": {
      "name": "openclaw-oc4-skill-pilot",
      "version": "OC-4 Block 1 reconciled",
      "owner": "agentadmin",
      "purpose": "Pilot of five instruction-only conversational skills (project analyst, evidence researcher, adversarial reviewer, cost analyst, acceptance-test designer) intended to expand reasoning capability without expanding execution authority.",
      "riskTier": "moderate"
    },
    "targetEnv": "preview",
    "verdict": "STOP",
    "rationale": "2 blocking finding(s) must be resolved before this agent may be deployed. Blockers are not waivable at this gate.",
    "checks": [
      {
        "checkId": "AL-001",
        "title": "Kill switch declared present and defaulting to off",
        "status": "fail",
        "findings": [
          {
            "id": "kill-switch-missing",
            "source": "deterministic",
            "checkId": "AL-001",
            "severity": "DEPLOYMENT_CONDITION",
            "title": "No kill switch declared",
            "detail": "Risk tier \"moderate\" requires a way to disable this agent's capability without a code change.",
            "evidence": [],
            "remediation": "Add an environment-controlled flag that gates the agent's privileged capability, and declare it in controls.killSwitch."
          }
        ],
        "evidence": [
          "riskTier=moderate",
          "killSwitch.present=false",
          "killSwitch.variable=(none)",
          "killSwitch.default=(unset)",
          "killSwitch.verifiedDisables=(unset)"
        ]
      },
      {
        "checkId": "AL-002",
        "title": "Every metered provider has a declared per-run ceiling",
        "status": "fail",
        "findings": [
          {
            "id": "budget-missing-web",
            "source": "deterministic",
            "checkId": "AL-002",
            "severity": "BLOCKER",
            "title": "No spend ceiling declared for \"web\"",
            "detail": "Tools call \"web\" but controls.budgets contains no entry for it. An agent that can call a metered provider without a declared ceiling has an unbounded worst case.",
            "evidence": [
              "providers used: web"
            ],
            "remediation": "Add a controls.budgets entry for \"web\" with an explicit perRunMax."
          }
        ],
        "evidence": [
          "providers used: web",
          "providers budgeted: (none)"
        ]
      },
      {
        "checkId": "AL-003",
        "title": "Ceilings are declared as enforced in code",
        "status": "not_applicable",
        "findings": [],
        "evidence": [
          "no budgets declared"
        ]
      },
      {
        "checkId": "AL-004",
        "title": "No automatic retries of metered or mutating work",
        "status": "pass",
        "findings": [],
        "evidence": [
          "controls.retries.automatic=false"
        ]
      },
      {
        "checkId": "AL-005",
        "title": "Outbound network defaults to deny",
        "status": "fail",
        "findings": [
          {
            "id": "egress-default-allow",
            "source": "deterministic",
            "checkId": "AL-005",
            "severity": "DEPLOYMENT_CONDITION",
            "title": "Outbound network defaults to allow",
            "detail": "Any retained outbound path is an exfiltration path. Default-allow egress means every tool the agent has, plus anything injected into its context, can reach the open internet.",
            "evidence": [],
            "remediation": "Set egress to default-deny and allowlist only the domains the agent genuinely needs."
          }
        ],
        "evidence": [
          "surface.egress.default=allow"
        ]
      },
      {
        "checkId": "AL-006",
        "title": "Egress allowlist covers every declared provider",
        "status": "not_applicable",
        "findings": [],
        "evidence": [
          "egress is not default-deny; allowlist coverage is not meaningful"
        ]
      },
      {
        "checkId": "AL-007",
        "title": "Credential scope matches the deployment target",
        "status": "not_applicable",
        "findings": [],
        "evidence": [
          "no credentials declared"
        ]
      },
      {
        "checkId": "AL-008",
        "title": "No sensitive credential is exposed to the client",
        "status": "pass",
        "findings": [],
        "evidence": []
      },
      {
        "checkId": "AL-009",
        "title": "A tested, reversible rollback path exists",
        "status": "fail",
        "findings": [
          {
            "id": "rollback-untested",
            "source": "deterministic",
            "checkId": "AL-009",
            "severity": "DEPLOYMENT_CONDITION",
            "title": "Rollback path has not been tested",
            "detail": "An untested rollback is a plan, not a control. The first time you run it should not be during an incident.",
            "evidence": [],
            "remediation": "Execute the rollback once in a non-production environment and record the result."
          }
        ],
        "evidence": [
          "path: Deactivate all five skills and restore the pre-pilot effective-skill set.",
          "reversible=true",
          "tested=false"
        ]
      },
      {
        "checkId": "AL-010",
        "title": "Mutating tools at elevated risk require human approval",
        "status": "not_applicable",
        "findings": [],
        "evidence": [
          "agent declares no mutating tools"
        ]
      },
      {
        "checkId": "AL-011",
        "title": "PII handling declares a retention policy",
        "status": "not_applicable",
        "findings": [],
        "evidence": [
          "agent declares it does not handle PII"
        ]
      },
      {
        "checkId": "AL-012",
        "title": "Production is explicitly protected for non-production deploys",
        "status": "pass",
        "findings": [],
        "evidence": [
          "targetEnv=preview",
          "productionUntouched=true"
        ]
      },
      {
        "checkId": "AL-013",
        "title": "Automated test evidence is present and green",
        "status": "warn",
        "findings": [
          {
            "id": "no-test-evidence",
            "source": "deterministic",
            "checkId": "AL-013",
            "severity": "OPTIONAL",
            "title": "No automated test evidence declared",
            "detail": "Without tests, every behavioural claim in this manifest rests on manual observation.",
            "evidence": [],
            "remediation": "Declare evidence.tests with the passing and total counts from the run that produced this build."
          }
        ],
        "evidence": [
          "evidence.tests not declared"
        ]
      },
      {
        "checkId": "AL-017",
        "title": "Declared risk tier is not below the tier the surface warrants",
        "status": "pass",
        "findings": [],
        "evidence": [
          "declared tier: moderate",
          "computed floor: moderate",
          "floor driver — moderate: agent calls external providers",
          "floor driver — moderate: agent ingests or emits untrusted content: public-web, arbitrary-outbound-host"
        ]
      },
      {
        "checkId": "AL-015",
        "title": "Declared kill switch appears in the source tree",
        "status": "not_applicable",
        "findings": [],
        "evidence": [
          "no kill switch declared"
        ]
      },
      {
        "checkId": "AL-016",
        "title": "Ceilings claimed as enforced appear in the source tree",
        "status": "not_applicable",
        "findings": [],
        "evidence": [
          "no budget claims enforcement in code"
        ]
      },
      {
        "checkId": "AL-018",
        "title": "Declared egress restrictions appear in the source tree",
        "status": "not_applicable",
        "findings": [],
        "evidence": [
          "egress.default is not 'deny'; there is no restriction claim to corroborate"
        ]
      },
      {
        "checkId": "AL-014",
        "title": "No credential material in the scanned tree",
        "status": "fail",
        "findings": [
          {
            "id": "secret-scan-not-requested",
            "source": "deterministic",
            "checkId": "AL-014",
            "severity": "BLOCKER",
            "title": "No paths declared for secret scanning",
            "detail": "evidence.scanPaths is empty, so Airlock could not verify that the deliverable is free of credential material. An unscanned tree is an unknown tree, and this gate does not pass unknowns.",
            "evidence": [
              "evidence.scanPaths=[]"
            ],
            "remediation": "Declare the paths that make up this agent's deliverable so they can be scanned."
          }
        ],
        "evidence": [
          "evidence.scanPaths=[]"
        ]
      }
    ],
    "findings": [
      {
        "id": "budget-missing-web",
        "source": "deterministic",
        "checkId": "AL-002",
        "severity": "BLOCKER",
        "title": "No spend ceiling declared for \"web\"",
        "detail": "Tools call \"web\" but controls.budgets contains no entry for it. An agent that can call a metered provider without a declared ceiling has an unbounded worst case.",
        "evidence": [
          "providers used: web"
        ],
        "remediation": "Add a controls.budgets entry for \"web\" with an explicit perRunMax."
      },
      {
        "id": "secret-scan-not-requested",
        "source": "deterministic",
        "checkId": "AL-014",
        "severity": "BLOCKER",
        "title": "No paths declared for secret scanning",
        "detail": "evidence.scanPaths is empty, so Airlock could not verify that the deliverable is free of credential material. An unscanned tree is an unknown tree, and this gate does not pass unknowns.",
        "evidence": [
          "evidence.scanPaths=[]"
        ],
        "remediation": "Declare the paths that make up this agent's deliverable so they can be scanned."
      },
      {
        "id": "egress-default-allow",
        "source": "deterministic",
        "checkId": "AL-005",
        "severity": "DEPLOYMENT_CONDITION",
        "title": "Outbound network defaults to allow",
        "detail": "Any retained outbound path is an exfiltration path. Default-allow egress means every tool the agent has, plus anything injected into its context, can reach the open internet.",
        "evidence": [],
        "remediation": "Set egress to default-deny and allowlist only the domains the agent genuinely needs."
      },
      {
        "id": "kill-switch-missing",
        "source": "deterministic",
        "checkId": "AL-001",
        "severity": "DEPLOYMENT_CONDITION",
        "title": "No kill switch declared",
        "detail": "Risk tier \"moderate\" requires a way to disable this agent's capability without a code change.",
        "evidence": [],
        "remediation": "Add an environment-controlled flag that gates the agent's privileged capability, and declare it in controls.killSwitch."
      },
      {
        "id": "review-skipped",
        "source": "deterministic",
        "checkId": "AL-000",
        "severity": "DEPLOYMENT_CONDITION",
        "title": "Adversarial review was skipped by the operator",
        "detail": "This gate ran deterministic checks only. Injection, exfiltration, excessive-agency and confused-deputy risks were not assessed.",
        "evidence": [
          "reviewMode=skipped",
          "effectiveTier=moderate"
        ],
        "remediation": "Re-run without --no-review before treating this verdict as a complete assessment."
      },
      {
        "id": "rollback-untested",
        "source": "deterministic",
        "checkId": "AL-009",
        "severity": "DEPLOYMENT_CONDITION",
        "title": "Rollback path has not been tested",
        "detail": "An untested rollback is a plan, not a control. The first time you run it should not be during an incident.",
        "evidence": [],
        "remediation": "Execute the rollback once in a non-production environment and record the result."
      },
      {
        "id": "no-test-evidence",
        "source": "deterministic",
        "checkId": "AL-013",
        "severity": "OPTIONAL",
        "title": "No automated test evidence declared",
        "detail": "Without tests, every behavioural claim in this manifest rests on manual observation.",
        "evidence": [],
        "remediation": "Declare evidence.tests with the passing and total counts from the run that produced this build."
      }
    ],
    "reviewMode": "skipped",
    "effectiveRiskTier": "moderate",
    "computedRiskFloor": "moderate",
    "counts": {
      "BLOCKER": 2,
      "DEPLOYMENT_CONDITION": 4,
      "DEFERRED": 0,
      "OPTIONAL": 1
    },
    "generatedAt": "2026-08-19T05:06:26.321Z"
  },
  "digest": "f6cae5a9680e666544f8474f711710ccb1730f87b1a9f289ce77f25c4c471a3c"
}
