diff --git a/.claude/settings.json b/.claude/settings.json index e3b13d4..5d78761 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -14,7 +14,9 @@ "Bash(bash scripts/preflight.sh*)", "Bash(python3 scripts/repo_lint.py*)", "Bash(python3 scripts/provider-bundle-check.py*)", - "Bash(bash tests/*)" + "Bash(bash tests/*)", + "Bash(OPNSENSE_API_HOST=* bash scripts/opnsense-api.sh GET *)", + "Bash(bash scripts/opnsense-plugins.sh list*)" ], "ask": [ "Bash(juju destroy-model *)", "Bash(juju remove-machine *)", @@ -28,7 +30,21 @@ "Bash(openstack * set*)", "Bash(openstack * unset*)", "Bash(* --apply*)", "Bash(git commit*)", "Bash(git push*)", - "Bash(sudo *)", "Bash(virsh *)", "Bash(rm *)" + "Bash(sudo *)", "Bash(virsh *)", "Bash(rm *)", + "Bash(*opnsense-api.sh POST *)", + "Bash(*opnsense-plugins.sh apply*)", + "Bash(*tofu apply*)", "Bash(*tofu destroy*)", + "Bash(*tofu import*)", "Bash(*tofu state rm*)", + "Bash(*--commit*)", + "Bash(git merge*)", "Bash(git revert*)", "Bash(git reset*)", + "Bash(git rebase*)", "Bash(git branch -D *)", + "Bash(bash scripts/* apply*)", "Bash(bash scripts/* install*)", + "Bash(ssh * sudo *)", + "Bash(scp *)", + "Bash(* | ssh *)", + "Bash(ssh * virsh *)", + "Skill(*)", + "Edit(.claude/settings.json)", "Edit(.claude/settings.local.json)" ], "deny": [ "Bash(vault operator init*)", "Bash(vault operator rekey*)", diff --git a/.claude/skills/openstack-cloud-ops/SKILL.md b/.claude/skills/openstack-cloud-ops/SKILL.md index 19c16de..7b4422a 100644 --- a/.claude/skills/openstack-cloud-ops/SKILL.md +++ b/.claude/skills/openstack-cloud-ops/SKILL.md @@ -6,9 +6,11 @@ # openstack-cloud-ops Operating skill for the Omega Cloud: a commercial, multi-tenant, tenant -self-administered OpenStack cloud. Current phase: single-DC virtual rehearsal -("testcloud", VR0 DC0) on four KVM hosts, rehearsing a future bare-metal -multi-datacenter deployment ("Roosevelt"). The governing design constraint is +self-administered OpenStack cloud, built as virtual rehearsals (VR0 single-DC +"testcloud"; VR1 two-DC + Office1 headend) for a future bare-metal +multi-datacenter deployment ("Roosevelt"). The CURRENT phase/stage lives in +repo `docs/CURRENT-STATE.md` ONLY (GA-R1) -- never trust a phase claim from +this file or memory. The governing design constraint is MINIMIZE DELTA TO ROOSEVELT: the runbooks and scripts are primary deliverables alongside the running cloud, so transferable answers beat quick fixes. @@ -36,14 +38,17 @@ The repo is a living draft; this skill's invariants (discipline, hardening) change slowly, its facts (IPs, versions, phase status) go stale fast. -**Long sessions get compacted.** At session start (and after any compaction), read -`docs/session-ledger.md` and run `bash scripts/ledger-scan.sh` to recover what is in flight and -reconcile it against repo ground truth (open decisions, open security rows, next-free numbers). -Update the ledger at every deliverable -- it is standing, like the changelog. See -`references/operating-discipline.md` (Session continuity). +**Session bookends (GA-R1/GA-R4).** OPEN: read `docs/CURRENT-STATE.md` in full +BEFORE any other doc (it is the only status authority), then `docs/session-ledger.md` ++ `bash scripts/ledger-scan.sh` to recover what is in flight and reconcile it against +repo ground truth (open decisions, open SEC count, next-free numbers). Re-do this +after any compaction. CLOSE: a bounded ledger summary (15-line hard cap, GA-R4 rule +1); the full session body goes to `docs/archive/` in the same close commit; commit +and push -- a session ending without its bookend is treated as NOT durable by the +next session. See `references/operating-discipline.md` (Session continuity). ## Step 1 - detect the environment -- **Live shell to the jumphost / infra** (Claude Code on `vopenstack-jesse` or +- **Live shell to the jumphost / infra** (Claude Code on `vcloud` or similar): you may RUN read-only audits directly. Every mutation remains individually human-gated - present the command, state what it changes, wait for approval. A live shell relaxes the transport, never the discipline. @@ -79,39 +84,75 @@ |---|---| | Any command block, script, or paste block you are about to write | `references/script-authoring.md` | | Deploy / redeploy / teardown (VR0, single-DC testcloud) | repo `runbooks/README.md`, then the phase-NN runbook; conventions in `references/operating-discipline.md` | -| VR1 DC-DC buildout (two-DC + Office1 headend -- the current live mission) | repo `docs/dc-dc-deployment-workflow.md` FIRST (stage status + tooling gap register), then `runbooks/README.md`'s "VR1 DC-DC track" section for the `dc-dc-phase0..6` runbooks + `dc-dc-teardown-rollback.md`. SEPARATE track from VR0's phase-NN above -- do not conflate stage numbers between the two. | +| VR1 DC-DC buildout (two-DC + Office1 headend -- the current live mission) | repo `docs/CURRENT-STATE.md` FIRST (stage/gate STATUS lives there only), then `docs/dc-dc-deployment-workflow.md` (stage identity, links, gap register), then `runbooks/README.md`'s "VR1 DC-DC track" section for the `dc-dc-phase0..6` runbooks + `dc-dc-teardown-rollback.md`. SEPARATE track from VR0's phase-NN above -- do not conflate stage numbers between the two. | | Something is broken (triage, incidents) | `references/troubleshooting.md`, then repo `runbooks/appendix-A-troubleshooting.md` | | CAPI / Magnum / mgmt-VM recovery | repo `runbooks/ops-capi-recovery.md` | | Deliver ANY repo change (script, runbook, doc) | run `bash scripts/repo-lint.sh` + the touched script's `tests//run-tests.sh` BEFORE handing it over | | Pre-deploy gate (before add-model) | `bash scripts/preflight.sh` -- THE single entry; do not run the sub-gates piecemeal | | Is the cloud actually healthy? (post-deploy, post-restart, pre-change baseline, incident) | `bash scripts/cloud-assert.sh` (add `--capture` at deploy completion for the committed BOM) | | Full-cloud restart after outage/maintenance | repo `runbooks/ops-restart-procedure.md` | +| VR1 site unreachable after a vcloud reboot (`ssh voffice1` / `office1-*` time out) | `bash scripts/site-baseleg.sh check office1` -- `office1-local` is an ISOLATED libvirt net, so the host's base L3 leg (`10.10.0.10/24` + compose route `10.10.1.0/24 via 10.10.0.20`) is dropped every reboot; the `After=libvirtd` unit re-adds it (D-126 amendment / D-128). If MISS and the unit is not yet installed: `sudo bash scripts/site-baseleg.sh apply office1`. This is the vcloud path; the workstation reaches the same over the tailnet (D-107). | | Starting any consequential live session | `bash scripts/run-logged.sh