5.8 KiB
Sandbox Activation Runbook
This runbook operationalises the Project Bus for the Epimonos Sandbox project. It does not itself authorize an internet-facing endpoint or replacement of the existing formal project channels.
Authority and transition rule
WP-PA-001 is the accepted software baseline. WP-PA-002 covers deployment and
activation. SG, PTO and the existing project threads remain authoritative
until the independent reviewer returns APPROVE on the operationalisation
commit and the Sandbox PM closes the WP-PA-002 gate with ACCEPT.
Before that gate, Project Bus records are shadow records. Differences are resolved in favour of the formal threads and recorded as corrections rather than silently rewriting history.
Deployment preparation
- Use a dedicated single-node host or controlled test VM.
- Keep the endpoint private unless PM-to-PO consultation has approved internet exposure.
- Copy
deploy/project-bus.env.exampleto a root/service-owner-readable file outside the repository. - Generate independent random bearer credentials of at least 32 bytes for SYSTEM, PO, PM, PA, Codex and Claude. Never reuse Git or account tokens.
- Replace the example values and set permissions to owner-read/write only.
- Configure TLS/authenticated ingress before any non-local exposure.
- Pin the reviewed Git commit or immutable image digest.
Start:
docker compose --env-file /secure/path/project-bus.env \
-f deploy/compose.yaml up -d --build
docker compose -f deploy/compose.yaml ps
The container must report healthy and run as the non-root image user.
Project bootstrap
The bootstrap command reads the SYSTEM credential only from an environment variable. The manifest contains identities and roles, never credentials.
export PROJECT_BUS_BOOTSTRAP_TOKEN='read-from-secret-store'
project-bus-ops bootstrap \
--endpoint http://127.0.0.1:8080/mcp \
--manifest deploy/sandbox-project.json
unset PROJECT_BUS_BOOTSTRAP_TOKEN
Run the same command a second time. It must replay successfully and create no duplicate project, actor or event records.
After bootstrap, remove the SYSTEM credential from the steady-state service configuration and restart. Retain it offline only if the operating policy requires future project creation; otherwise rotate/revoke it.
Actor connection and smoke test
For each actor credential:
- call
initializewithout authentication; - call
get_projectforepimonos-sandbox; - verify returned roster and formal role expectations;
- call
sync_sincewith that client's durable cursor; - call
list_pending_actions; - persist the new cursor only after processing all returned events.
Store each actor token in that client's secret facility. Do not place tokens in
.mcp.json, project instructions, prompts, shell history or Git.
Claude Code endpoint registration:
claude mcp add --scope project --transport http \
epimonos-project-bus https://approved-project-bus.example/mcp
The endpoint configuration may be project-scoped; the credential must remain in a user/workload secret store.
Initial shadow records
Once the actors authenticate, the PM registers WP-PA-002 through
issue_work_package, Codex claims it, and the PA links the implementation
commit and evidence. These records mirror the formal thread record during the
bootstrap phase. Claude submits the independent review through both the
existing formal channel and the bus.
The PM then closes the WP-PA-002 gate. Only an ACCEPT outcome after an
independent APPROVE permits the separately recorded operational decision
that the bus becomes the primary project interface.
Backup and restore
Create a consistent online backup:
project-bus-ops backup \
--source /data/project-bus.db \
--destination /secure/backup/project-bus-$(date +%Y%m%dT%H%M%S).db
The command uses SQLite's online backup API and runs PRAGMA integrity_check.
Copy the backup off-host under the applicable retention policy.
Quarterly and before primary-interface activation:
- restore a backup into an isolated instance;
- start the exact reviewed application version against the restored database;
- authenticate with a temporary test credential;
- compare the restored maximum event cursor with the backup receipt;
- run
get_project,sync_sinceandlist_pending_actions; - destroy the isolated restore instance and revoke the test credential.
Rotation and revocation
Static-token changes require a restart in v0.1. Generate a replacement, update the external secret configuration, restart, verify the new credential, then remove the old credential and restart again. Treat exposure as an incident; rotate first and investigate from the immutable event trail and edge logs.
Cursor recovery
Each consumer owns a durable cursor per project. When processing fails, retain the last successfully processed cursor and replay from it. Reads are safe to repeat; mutations require stable idempotency keys. Never advance a cursor before all returned events have been durably processed.
Rollback
Before the activation gate, stop the bus and return solely to SG/PTO/project threads; no authority has transferred. After activation, announce the incident in the fallback formal channels, stop writes, preserve the database and logs, restore the latest verified backup if required, and record reconciliation events when service resumes. Never delete or edit prior events.
Gate evidence checklist
- exact reviewed commit/image digest;
- healthy non-root container;
- two successful bootstrap runs with unchanged event cursor on replay;
- successful authenticated checks for every formal actor;
- backup receipt, restore result and matching event cursor;
- secret scan with no credential material in Git;
- independent Claude review report;
- PM
ACCEPTgate event and explicit primary-interface operational decision.