{
  "$schema": "./runbook.schema.json",
  "schemaVersion": "1.0.0",
  "runbook": {
    "id": "RBK-CACHE-001",
    "revision": "1.1.0",
    "title": "Review a stale cache signal in a fictional staging fixture",
    "ownerRoleId": "service-owner",
    "purpose": "Coordinate a bounded, non-production cache-freshness simulation and preserve the observations needed for accountable review.",
    "trigger": {
      "id": "trigger-cache-age",
      "condition": "The fictional staging fixture reports a cache-age header above its reviewed 300-second exercise threshold.",
      "evidenceRef": "evidence-trigger"
    },
    "scope": {
      "environment": "staging",
      "serviceUrl": "https://status.ops.example.test",
      "production": false,
      "included": [
        "Read-only observations of the fictional staging fixture.",
        "A local refresh-request placeholder that does not change a remote system."
      ],
      "excluded": [
        "Production systems, customer data, destructive commands, and deployment automation.",
        "Cross-functional process documentation, generic SOP ownership, incident command, on-call scheduling, security approval, and compliance certification."
      ]
    },
    "prerequisites": [
      {
        "id": "prerequisite-access",
        "check": "Confirm the operator has the reviewed fixture-observer role and no production role is required.",
        "verification": "The authorization owner compares the operator role with the fictional access record.",
        "evidenceRef": "evidence-access"
      },
      {
        "id": "prerequisite-window",
        "check": "Confirm the scheduled exercise window and service-owner availability.",
        "verification": "The operator compares the current exercise record with the planned window and named owner role.",
        "evidenceRef": "evidence-window"
      }
    ],
    "roles": [
      {
        "id": "operator",
        "name": "Staging fixture operator",
        "responsibility": "Perform only the ordered read-only checks and local placeholder action.",
        "permissions": [
          "Read the reserved fixture endpoint.",
          "Record safe observation references for the exercise."
        ],
        "forbidden": [
          "Approve their own access or change authorization boundaries.",
          "Run destructive, production, deployment, or infrastructure commands."
        ]
      },
      {
        "id": "authorization-owner",
        "name": "Authorization owner",
        "responsibility": "Confirm the operator and operation fit the reviewed non-production boundary.",
        "permissions": ["Authorize or stop this bounded fictional staging exercise."],
        "forbidden": ["Treat schema validation as evidence that an action ran or succeeded."]
      },
      {
        "id": "service-owner",
        "name": "Fictional cache service owner",
        "responsibility": "Own escalation, recovery choice, communications, evidence handling, and revision review.",
        "permissions": ["Review safe observations and update the runbook revision."],
        "forbidden": ["Claim production readiness, security, or compliance from this example."]
      }
    ],
    "actions": [
      {
        "id": "action-observe-baseline",
        "sequence": 1,
        "actorRoleId": "operator",
        "description": "Read the reserved staging fixture response metadata without changing remote state.",
        "command": "curl --fail --silent --show-error --head https://status.ops.example.test/health",
        "expectedOutput": "An HTTP response with a documented fixture status and cache-age header available for comparison.",
        "verification": "Compare the response metadata with the fictional fixture contract and record any mismatch as uncertainty.",
        "evidenceRef": "evidence-baseline",
        "stopGateRef": "gate-baseline"
      },
      {
        "id": "action-record-request",
        "sequence": 2,
        "actorRoleId": "operator",
        "description": "Emit a local placeholder representing a reviewed refresh request; it does not contact or change a remote service.",
        "command": "printf '%s\\n' 'refresh-requested-for-fictional-staging-fixture'",
        "expectedOutput": "refresh-requested-for-fictional-staging-fixture",
        "verification": "Confirm the local output matches exactly and record that no remote mutation is represented by this step.",
        "evidenceRef": "evidence-request",
        "stopGateRef": "gate-request"
      },
      {
        "id": "action-observe-after",
        "sequence": 3,
        "actorRoleId": "operator",
        "description": "Repeat the read-only fixture observation after the fictional owner records its simulated response.",
        "command": "curl --fail --silent --show-error --head https://status.ops.example.test/health",
        "expectedOutput": "An HTTP response whose status and cache-age header can be compared with the baseline.",
        "verification": "Compare before and after metadata; record uncertainty; and stop if the reviewed fixture contract is not met.",
        "evidenceRef": "evidence-after",
        "stopGateRef": "gate-after"
      }
    ],
    "stopGates": [
      {
        "id": "gate-baseline",
        "condition": "The endpoint is unavailable, the response lacks the documented headers, or the environment boundary is uncertain.",
        "action": "stop",
        "escalationRef": "escalation-owner",
        "recoveryRef": "recovery-return-baseline"
      },
      {
        "id": "gate-request",
        "condition": "The placeholder output differs, any remote mutation is proposed, or authorization is no longer clear.",
        "action": "stop",
        "escalationRef": "escalation-authorization",
        "recoveryRef": "recovery-return-baseline"
      },
      {
        "id": "gate-after",
        "condition": "The final observation remains unexplained or differs from the reviewed fictional fixture contract.",
        "action": "stop",
        "escalationRef": "escalation-owner",
        "recoveryRef": "recovery-forward-review"
      }
    ],
    "evidence": [
      {
        "id": "evidence-trigger",
        "kind": "trigger-record",
        "location": "https://evidence.ops.example.test/exercises/cache-001/trigger",
        "retentionOwnerRoleId": "service-owner"
      },
      {
        "id": "evidence-access",
        "kind": "authorization-record",
        "location": "https://evidence.ops.example.test/exercises/cache-001/access",
        "retentionOwnerRoleId": "authorization-owner"
      },
      {
        "id": "evidence-window",
        "kind": "exercise-record",
        "location": "https://evidence.ops.example.test/exercises/cache-001/window",
        "retentionOwnerRoleId": "service-owner"
      },
      {
        "id": "evidence-baseline",
        "kind": "observation-reference",
        "location": "https://evidence.ops.example.test/exercises/cache-001/baseline",
        "retentionOwnerRoleId": "service-owner"
      },
      {
        "id": "evidence-request",
        "kind": "local-placeholder-record",
        "location": "https://evidence.ops.example.test/exercises/cache-001/request",
        "retentionOwnerRoleId": "service-owner"
      },
      {
        "id": "evidence-after",
        "kind": "observation-reference",
        "location": "https://evidence.ops.example.test/exercises/cache-001/after",
        "retentionOwnerRoleId": "service-owner"
      },
      {
        "id": "evidence-recovery",
        "kind": "recovery-reference",
        "location": "https://evidence.ops.example.test/exercises/cache-001/recovery",
        "retentionOwnerRoleId": "service-owner"
      }
    ],
    "escalations": [
      {
        "id": "escalation-owner",
        "when": "A fixture observation differs from the reviewed contract or its cause is uncertain.",
        "toRoleId": "service-owner",
        "channel": "Documented fictional operations channel",
        "messageTemplate": "State RBK-CACHE-001, the staging boundary, expected state, observed state, stop gate, and safe evidence references."
      },
      {
        "id": "escalation-authorization",
        "when": "The operator, environment, proposed action, or authorization boundary differs from the reviewed record.",
        "toRoleId": "authorization-owner",
        "channel": "Documented fictional authorization channel",
        "messageTemplate": "Stop the exercise and state the changed role, environment, action, or boundary without including credentials or personal data."
      }
    ],
    "recovery": {
      "terminalState": "The fictional staging fixture remains unchanged or has a documented owner reviewing the unexplained state.",
      "rollback": [
        {
          "id": "recovery-return-baseline",
          "fromActionId": "action-record-request",
          "description": "Record that the runbook performed no remote mutation and return control to the service owner.",
          "command": "printf '%s\\n' 'no-remote-change-performed'",
          "expectedOutput": "no-remote-change-performed",
          "verification": "The service owner confirms the evidence record describes only local placeholders and read-only observations.",
          "evidenceRef": "evidence-recovery"
        }
      ],
      "forward": [
        {
          "id": "recovery-forward-review",
          "fromActionId": "action-observe-after",
          "description": "Repeat only the read-only observation after the service owner resolves or reclassifies the fictional fixture state.",
          "command": "curl --fail --silent --show-error --head https://status.ops.example.test/health",
          "expectedOutput": "An HTTP response whose metadata can be compared with the reviewed fixture contract.",
          "verification": "The service owner records the new observation, remaining uncertainty, and whether a revised runbook is required.",
          "evidenceRef": "evidence-recovery"
        }
      ]
    },
    "communications": [
      {
        "id": "communication-before",
        "timing": "before",
        "audienceRoleIds": ["authorization-owner", "service-owner"],
        "channel": "Documented fictional operations channel",
        "message": "Share the runbook ID, trigger, staging boundary, scheduled window, operator role, stop gates, and evidence locations."
      },
      {
        "id": "communication-during",
        "timing": "during",
        "audienceRoleIds": ["service-owner"],
        "channel": "Documented fictional operations channel",
        "message": "Share each observation, uncertainty, and stop-gate decision without copying response bodies, secrets, or personal data."
      },
      {
        "id": "communication-after",
        "timing": "after",
        "audienceRoleIds": ["authorization-owner", "service-owner"],
        "channel": "Documented fictional operations channel",
        "message": "Share the terminal state, safe evidence references, unresolved uncertainty, follow-up owner, and revision need."
      }
    ],
    "monitoring": [
      {
        "id": "monitoring-cache-age",
        "signal": "Fictional cache-age response header",
        "expected": "At or below the reviewed 300-second exercise threshold after owner resolution.",
        "threshold": "Stop and escalate on a missing header or unexplained value above 300 seconds.",
        "checkActionRef": "action-observe-after"
      },
      {
        "id": "monitoring-fixture-status",
        "signal": "Fictional fixture status response metadata",
        "expected": "Matches the reviewed non-production fixture contract.",
        "threshold": "Stop and escalate on an unavailable endpoint or contract mismatch.",
        "checkActionRef": "action-observe-baseline"
      }
    ],
    "revisions": [
      {
        "version": "1.0.0",
        "changedAt": "2026-07-15",
        "authorRoleId": "service-owner",
        "summary": "Created the fictional staging cache-freshness exercise."
      },
      {
        "version": "1.1.0",
        "changedAt": "2026-08-01",
        "authorRoleId": "service-owner",
        "summary": "Added authorization stop gates, expected-observation pairs, and reachable recovery references."
      }
    ],
    "review": {
      "reviewerRoleId": "authorization-owner",
      "nextReviewAt": "2026-11-01",
      "reviewTriggers": [
        "The fixture interface, environment, owner, operator role, authorization, evidence policy, or recovery path changes.",
        "An exercise reaches a stop gate, produces an unexplained observation, or exposes an ambiguous instruction."
      ]
    }
  }
}
