Purpose. Long ops sessions on this cloud routinely exceed a single context window and get COMPACTED (sometimes several times). Anything living only in the chat scrollback is lost at compaction. This ledger is the durable, committed record of what is IN FLIGHT, so any session -- after a compaction, or a fresh one -- can resume without losing pending work.
How to use it (standing practice).
bash scripts/ledger-scan.sh. Reconcile.ledger-scan.sh is the DRIFT CHECK -- it derives the open-work it reliably can (PROPOSED/OPEN decisions, OPEN security rows, next-free numbers) straight from the repo. This narrative must not claim CLOSED anything the scan shows OPEN, nor omit what it surfaces.SINGLE STREAM (collapsed 2026-07-13). This ledger previously carried three parallel, separately-owned stream sections (main-chat, jumphost, shared) plus ~30 append-only session narratives. Those streams are CLOSED and reconciled into the one list below. There is now ONE stream. Do not re-introduce per-stream sections.
Where the history went. The 2,189-line session-by-session narrative is NOT lost -- it is in git history (the parent of the collapse commit) and, in durable form, in the 65 docs/changelog-*.md files, docs/design-decisions.md, and the incident reports. This ledger deliberately carries only what is still OPEN, plus the facts that would otherwise be lost because they live nowhere else.
scripts/ledger-scan.sh; do not hand-edit)RE-SEEDED 2026-08-02 from bash scripts/ledger-scan.sh. The prior seed was the 2026-07-27 STAGE 4 CLOSE (confirmed unchanged 2026-07-29) and had gone STALE by seven SEC rows and three D numbers -- the per-session summaries below carried the current figures while this block did not, which is the one thing this block exists to prevent. Re-run the scan to refresh.
docs/design-decisions.md are the only ruling authority.bash scripts/ledger-scan.sh (was 21 at the last seed). The seven added since, verified against the register: SEC-026..-029 all 2026-07-30 (a MAAS admin-scoped key going DC-resident under D-138; the per-DC region credential class; the per-DC juju service credential, which made the RACK credential-bearing for the first time; and the Octavia PKI overlay's residency on the dc0 rack), SEC-030 2026-07-31 (local permission rules bypassing the committed ask-gating -- an ACCEPTED, recorded posture), then SEC-031 and SEC-032 on 2026-08-02 -- SEC-031 is the live one: the dc1 edge lost its FreeBSD user database to fsck and runs with NO pf ruleset, i.e. an open router serving its GUI. The SEC register of record is docs/security-ledger.md; row-level dispositions live THERE only (GA-R4/F3) -- this block carries pointer + count, never rows.ledger-scan's derived next-free of 207 is superseded by 208 until the next scan. 204 remains 2026-07-27's stale "NTP from edge" Stage-4 gate bullet.docs/CURRENT-STATE.md is the authority).docs/ or runbooks/ prose -- historically a decoy token in prose inflated the next-free counter (hardened in DOCFIX-174).ledger-scan D-115 false-positive: RESOLVED. The scan keys on the LAST **Status:** line per ## D-NNN: block, not arbitrary body prose. The general hygiene -- trust the Status line over body text -- still holds.The pre-rotation bodies (~1080 lines: Live state, OPEN WORK VR1/VR0, NetBox write-path bugs, PINNED rulings, standing lessons, state facts, project- completion, NetBox import narrative) moved VERBATIM to docs/archive/session-ledger-rotated-20260719.md. Standing lessons + VR0 state facts were ROUTED to durable homes first (platform-traps already carried most; juju format=line -> appendix-A; guard discipline -> operating-discipline; VR0 cloud facts -> maas-as-built-reference.md). Open work is machine-derived above + CURRENT-STATE.md; do not re-grow bodies here -- sessions append BOUNDED summaries only (15-line cap).
Retained compact blocks (still-live obligations without another home yet):
docs/netbox-write-path-findings.md (the durable home; the rotated-body section is history). Open residue: dumper blind spot + duplicate-CIDR collapse unfixed, hardened fidelity re-run + fix re-verification owed -- ALL gated on the next NetBox WRITE campaign, none current.--public -f json, never the deprecated --long -- archive R9); (2) appendix-A entry for tenant-net-cannot-reach-public-keystone -> nodes register but stall uninitialized (auth_url in the per-cluster clouds secret is hardcoded PUBLIC at capi-helm 1.4.0; as-built carries no interface key), pointing at the phase-08 D-011.3 probe, plus a per-DC precondition line in dc-dc-phase6 Step 12; (3) tenant contract hardening list: PROPOSED -svc-only password neutralization (admin-rotate to discarded value; keystone lock_password blocks password CHANGE, not auth; NEVER lock -cluster -- it keeps PASSWORD auth permanently per D-066); (4) flavor catalog marking = commercial catalog policy, operator prioritization only. RE-VERIFY every citation at review time -- the full verdict lives in the 2026-07-21 disconnected-session transcript, not in a repo surface.The eight oldest closed-session summaries (2026-07-18 through the fifth 2026-07-21 session) moved VERBATIM to docs/archive/session-ledger-rotated-20260726.md. The live ledger was 413 lines against the 300-line cap -- a breach the 2026-07-25 close recorded as OWED. Each rotated summary still points at its own archived full body; only the summaries moved. Sessions from 2026-07-22 onward remain live below.
The three oldest live summaries (all 2026-07-23: G12 dc1 edge->commission+merge, Stage 4 OPEN+carve+mirrors, queue pass + D-068 rulings) moved VERBATIM to docs/archive/session-ledger-rotated-20260727.md. The live ledger was 317 lines against the 300-line cap. Sessions from 2026-07-24 onward remain live below.
The oldest remaining live summary (2026-07-24, caveman guardrails + DC1 proxy-build start) moved VERBATIM to docs/archive/session-ledger-rotated-20260727.md. The live ledger was 305 lines against the 300-line cap. Sessions from 2026-07-25 onward remain live below.
The TWO oldest remaining live summaries -- 2026-07-25 handoff-pack execution + recon + Chat D-136 coupling, and 2026-07-25 MAAS admin-account recovery (SEC-020) -- moved VERBATIM to docs/archive/session-ledger-rotated-20260727.md. The live ledger was 321 lines against the 300-line cap; one pass left it under. (This paragraph was left MANGLED by an earlier edit -- a sentence broke off mid-number and ran into a stray fragment of the 2026-07-25 MAAS-admin-recovery summary. Found by a 2026-07-29 sweep and repaired here; that summary's full body is at docs/archive/changelogs/changelog-20260725-maas-admin-recovery.md.)
The oldest remaining live summary ("POST-CLOSE ADDENDUM 2026-07-26 -- D-137 ADOPTED (GA-R4; 07-18/07-21 addendum precedent)") moved VERBATIM to docs/archive/session-ledger-rotated-20260727.md. The live ledger was 316 lines against the 300-line cap.
The TWO oldest live summaries -- 2026-07-26 (D-137 build + committee audit + remediation) and 2026-07-27 (creds consolidation + the STAGE 4 CLOSE-OUT) -- moved VERBATIM to docs/archive/session-ledger-rotated-20260729.md. The live ledger would otherwise have been 321 lines against the 300-line cap once this session's bookend was appended. Sessions from the 2026-07-27 grounding audit onward remain live below.
The TWO oldest live summaries -- the 2026-07-27 STAGE-5 GROUNDING AUDIT close and its 14-RULINGS post-close addendum -- moved VERBATIM to docs/archive/session-ledger-rotated-20260730.md. The live ledger stood at exactly 300 lines, so the next append would have breached the cap. Rotated HERE rather than leaving it owed, because the next session is directed straight at the juju deployment. Sessions from the 2026-07-27 Phase-0 close onward remain live below.
The TWO oldest live summaries (2026-07-30 part 3 -- Stage 5 opened, three bootstraps, D-138 + D-132 ruled; and part 4 -- dc0 region topology built, cutover blocked on a permission wall) moved VERBATIM to docs/archive/session-ledger-rotated-20260802b.md. The live ledger stood at 294 lines and this close's summary would have breached the cap.
The oldest live summary (2026-07-30 part 5 -- dc0 migrated to its own MAAS region, 10/10 Ready, four named gates green) moved VERBATIM to docs/archive/session-ledger-rotated-20260803.md. The live ledger would have breached the 300-line cap with this close's summary.
dc-dc-stage5-preconditions, 11 commits pushed (a859352..80510f4). NO stage opened/closed. Scan: 3 decisions, SEC 25 (SEC-028, -029 opened), D 139 / DOCFIX 207 / BUNDLEFIX 053.scripts/dc-node-carve.sh SHIPPED (harness 48/48) -- the last no-tool gap. dc0 v4 carve COMPLETE 10/10, named gate 134/0, and the diff against the pre-migration capture is EMPTY: every node's six legs match Office1 address for address. v6 carve 54/54; the controller's own v6 restored separately (the tool walks only the nine tagged role nodes).vr1-dc0-controller, active/idle. <<< FOURTH attempt, first success; the three failures were each a real defect one layer deeper, closed by D-138, the under-carve fix, and D-132 q1 respectively. Agent binaries resolved on attempt 1.vr1-dc0 created, spaces gate PASS (6/6), apt-mirror set to the DC mirror -- key VERIFIED against the live client, not guessed; URL asserted on dists/jammy/Release content.vm-secret-locations gained its first rack rows) and SEC-029 (PKI overlay residency). Key proven to AUTHENTICATE before bootstrap, never printed, sha256-verified at every hop.unknown option "prefer-ipv6" on barbican. The dry-run PASSED and the deploy did not -- --dry-run does not validate config option NAMES. Measured plan is 56 apps / 108 relations, not the 50/97 preflight still quotes.prefer-ipv6, 6 do not, and barbican never had it at ANY channel -- so R2's uniform application was never valid. RULED: "Research what those 6 charms do with v6 VIPs first (Recommended)" -- overlay NOT edited, R2 NOT amended. STAGE 5 IS BLOCKED ON THAT RESEARCH.preflight.sh is REGION-BLIND -- 19 false negatives for dc0 ("not enrolled in MAAS") because it defaults to the Office1 profile. MAAS_PROFILE=vr1-dc0-region drops them to zero. A blanket refusal would be WRONG: dc1's nodes still live in Office1.br-ex static compare could not fail. Added a fixture, re-proved the kill.systemctl poll racing an async start, and a charmhub query with a wrong field name returning a uniform "no config" across 13 charms. The last two were caught by the SHAPE of the answer being implausible, not by discipline; that detector is now in auto-memory.docs/changelog-20260730-dc0-node-carve.md (11 items). Status ONLY in CURRENT-STATE.md.The oldest closed-session summary moved VERBATIM to docs/archive/session-ledger-rotated-20260731.md. The live ledger stood at 295 lines and this close's summary would have breached the 300-line cap.
dc-dc-stage5-preconditions, 45 commits pushed. NO stage opened/closed. Scan: 3 decisions, SEC 26, D 139 / DOCFIX 207 / BUNDLEFIX 053.prefer-ipv6 is NOT what makes HAProxy bind :::port -- that is gated on the kernel disable_ipv6 sysctl, and pacemaker picks IPv6addr by family detection. Neither consults the option. vault ships no haproxy at all ([::]:8200 hardcoded).Deploy of bundle completed.) <<< after three failures each one layer deeper: unknown option; a missing policies/overrides.zip on the client host; and a bundle relying on default-base being deployable exactly ONCE.apt-get update --error-on=any fails on the first bad source): backports 404, upstream UCA unreachable, prefer-ipv6 fatal on containers with only link-local v6, and snaps with no path. Units tracked 22 -> 17 -> 4 -> 7-in-one-class.stopped, so no hook could run -- a fixed point, not backoff. --force cleared it; NOTHING was stranded. All nine nodes renamed to their ruled vr1-dc0-<role>-NN by pinned boot MAC and back to Ready..4:3129, allowlisted, 53/53 mutations killed; review says the ruled design is HONOURED on all four counts and logs FOUR real bugs. Nothing proven end to end.| tail masked the exit code); a git add -A that swept an agent's files into an unrelated commit; two instrument misreads (a juju models summary read as progress, and stale unit logs read as current); and a wrong "immutable system_id" claim the operator corrected.add-model + spaces + deploy. Sweep: docs/audit/queued-findings-20260731-stage5-deploy.txt (11 FIRST SURFACE). Bodies: docs/changelog-20260731-prefer-ipv6-research.md. Status ONLY in CURRENT-STATE.md.The oldest closed-session summary/summaries moved VERBATIM to docs/archive/session-ledger-rotated-20260801.md. The live ledger stood at 296 lines and this close's summary would have breached the 300-line cap.
dc-dc-stage5-preconditions, 8 commits pushed (d555b90..844b2e4). NO stage opened or closed. Scan: 3 open decisions, SEC 26 (none opened this session), D 140 / DOCFIX 207 / BUNDLEFIX 053.check dc0 PASS exit 0, 16 assertions, re-verified independently of the agent that installed it -- and a real snap payload fetched through it (HTTP 206, first bytes hsqs). No longer fixture-green. BUG-3 confirmed by measurement (no assertion changed); BUG-4 fixed at BOTH sites where the review had named one.ceph-osd fails a v6-only plane in BOTH directions, hacluster still ships ip_version: ipv4, OVN documents encap as IPv4-only. Narrowed by ruling ("B plus C") to a storage+replication experiment plus the upstream fix; LP draft written, operator files it.fd50:840e:74e2:220::6, stratum 3./64 available; the real limit is juju taking addrs[0] from an unsorted query, family-blind, with no knob (LP #1723240, open since 2017). Corrected per GA-R1 C2.dc-node-v6-carve.py pivots on IPv4 existing, so run after v4 removal it would carve four fewer planes per node and exit clean./tmp and needed rescuing; and one commit went red on ASCII-only em-dashes.d139-gua-carve 71/71, dc-node-v6-verify 55/55. voffice1's clone is 36 commits BEHIND -- no loss, but a live hazard on the Plane-2 host.autostart=disable. Bodies: changelog items 21-22.network-get on a v6-only bound space is still unmeasured and gates the v4-removal experiment. Sweep: docs/audit/queued-findings-20260801-stage5-ipv6-d139.txt (6 FIRST SURFACE). Body: docs/changelog-20260731-snap-proxy-apply-ipv6.md. Status ONLY in CURRENT-STATE.md.The oldest closed-session summary moved VERBATIM to docs/archive/session-ledger-rotated-20260802.md. The live ledger stood at 283 lines and this close's summary would have breached the 300-line cap.
dc-dc-stage5-preconditions, 24 commits pushed (f79c9e8..). NO stage opened or closed. Scan: 3 open decisions, SEC 28 (SEC-031, -032 opened), D 141 / DOCFIX 207 / BUNDLEFIX 053.apt-mirror verified.libcrypto/libpython did not survive.dc-egress-check dc0 PASS 8/8 exit 0. Plan asserted on tofu show -json including the POSITIVE half; pfctl -s nat verified rather than assumed. SEC-032 minted.dc-egress-check.sh (F9): layered route -> edge answers -> traffic leaves -> upstreams, first failure reported as the cause. Proven live on TWO different failure modes. Wired into restart Stage 0 and phase-4 Step 3.9. Two of its own defects found and fixed the same day.docs/runbook-fold-register.md, 12 rows). D-138 and D-139 appear in no runbook; the chain as written would rebuild the pre-D-132/D-138/D-139 shape. Both Class-A rows closed -- incl. SKILL.md, which every session reads BEFORE any runbook.10.12.40.0/22/10.12.88.0/22 superseding 10.12.60.0/22; VPN deferred to Roosevelt; D-135 amended (dc0 converges on the proxy at rebuild); D-140 PINNED (tofu manages juju AFTER a hardened, tested dc0 deploy)./srv/mirror/ubuntu and a systemd unit name the repo already defines; two harness cases I wrote never ran while the suite said ALL PASS; one assertion passed on its own comment; and I pushed a red lint once by masking the exit code.pg_dump maasdb (F6), then fold F2-F11 and the dc1 Phase-2 exercise. Sweep: docs/audit/queued-findings-20260802-stage5-edge-fold.txt (6 FIRST SURFACE). Status ONLY in CURRENT-STATE.md.dc-dc-stage5-preconditions, 9 commits pushed (1cdd607..56b37f8). NO stage opened or closed. Scan: 3 open decisions, SEC 28 (none opened this session), D 141 / DOCFIX 208 / BUNDLEFIX 053 -- DOCFIX moved 207->208, reconciling with the one number assigned.maasdb (23,878,796 bytes / 37,199 lines / exit 0 / completion marker). F6's own stated blocker was WRONG -- the discriminators are ROLE and TRANSPORT, not snap confinement; over the unix socket the maas role needs no credential at all.archive.ubuntu.com backends (91.189.92.23) hangs on ONE dep11 object while serving its directory siblings in 0.5s; the resolver rotates, and 11 of 12 fetches succeed. "Not transient" WITHDRAWN. apt is unaffected -- it fetches the .xz, which is present; apt-get update against the mirror returns rc=0.934a1f0, 53aae78) and correctly classed OPS, not new D-numbers.fd50:840e:74e2:220::/64 carries the juju controller (::5) and the MAAS region VM (::6), neither with a GUA counterpart -- deleting it would strip the deploy client's only recorded v6.netbox/d139-step6-vip-rehome.py (harness 20 cases) and dc-plane-ipam.sh retire-v6-ula (harness 25->32). An adversarial review returned FIX FIRST on four defects, two CRITICAL (a dc1 orphan-create; a dropped apex-identity guard) -- all fixed and verified live.sid="'$id'" comparison that returned a clean ZERO, on which four deletes proceeded. None was caught by re-reading my own work -- two by an adversarial reviewer, one by the live run.status=active into a ruling by inference (measured: reserved); and inflated the DOCFIX counter with a decoy token TWICE, the second time inside the sentence correcting the first.~/repo-stage all 13 tracked files MATCH the repo. Gates: gauntlet ALL GREEN (98), repo-lint 0 fail / 1 legacy warn.docs/audit/queued-findings-20260802-step6-queued-items.txt (6 FIRST SURFACE, incl. a broad Bash(ssh vr1-dc0-maas *) allow rule, and four destructive MAAS deletes that matched NO ask rule -- the rule-fails-to-MATCH class, now recurring). Body: docs/changelog-20260802-queued-items.md. Status ONLY in CURRENT-STATE.md.dc-dc-stage5-preconditions, ~23 commits pushed. NO stage opened/closed. Scan: 3 decisions, SEC 28, D 142 / DOCFIX 209 / BUNDLEFIX 053 (D-141 + DOCFIX-208 assigned this session).Invalid vips.--force model destroy orphaned the model (missing status doc) and took the controller API down; rebuilt fresh from MAAS end to end. New runbook Paths M + C (juju model + controller teardown/rebuild), plus the measured kill-controller-fails-when-API-down + --no-wait guidance.active / v6 reserved-until-capable); D-052 AMENDED (ovn-central "" default -> metal-internal, architecturally correct -- OVN NB/SB DB is a metal-internal service).common_name -> vault issues no server cert -> OVN NB/SB cluster not formed. Three remedies exhausted (reissue-certificates / rebind / relation bounce). Only OVN/tenant-networking is gated. <<<Invalid vips block on all 11 API charms (the charm hard-errors on an unplaceable VIP) -- so v4-only-deploy + v6-reserved-in-apex (D-141) is the correct split until the container-v6 gate clears.~/repo-stage matches HEAD.os-*-network avenue; reconcile provider-bundle-check to D-141; then continue Stage-5 (phase-03 core verify). Sweep: docs/audit/queued-findings-20260803-stage5-deploy-ovn.txt (4 FIRST SURFACE). Status ONLY in CURRENT-STATE.md.