KB-576D

O8C real-DB rollback-only proof readiness (Contabo) — 06-gap-closure-matrix

7 min read Revision 1
dieu44iu-cutterv0.6o8creal-db-rollback-proofmilestone-ratifylive-execution-wiringcontabo

O8C Report 06 — Gap closure / sharpening matrix (G5)

  • macro: v0.6-o8c-real-db-rollback-proof-readiness
  • date_utc: 2026-05-21 · host: vmi3080463 (Contabo)
  • gate covered: G5 gap closure / sharpening

Status legend: CLOSED / PARTIAL / OPEN — each carries an exact next action.

F1 — real-DB integration proof of ProductionLiveExecutionAdapter

status: PARTIAL  (substantially advanced by O8C)
done:   - connection_provider seam proven to reach the live directus DB
          as the genuine cutter_exec / cutter_verify roles (PROOF-4)
        - adapter's exact cut_leg_a SQL contract (fn_iu_create) executed
          real-DB rollback-only, status='created', 158->159->ROLLBACK (PROOF-5)
        - adapter's verify-path SQL valid on the real schema (PROOF-6)
        - kill-switch gates all 6 methods even with a real DB wired (PROOF-2)
residue: - the adapter METHOD BODIES (cut_leg_a / lifecycle_enact / leg_b_record
           / write_verify) executing end-to-end vs. the live DB — blocked by the
           kill-switch (its first line); needs the GAP-7 sovereign flip
         - host has psycopg2 only; the adapter expects psycopg v3
           (conn.execute) — a Pg3 shim or a psycopg3 install is required in
           the production connection_provider
next_action: at the first sovereign-gated run (post-GAP-7), exercise the full
             method bodies in a rollback-only transaction first; ship psycopg3
             (or the Pg3 shim) in the production connection_provider.

F2 — cutplan body/title (content) enrichment

status: OPEN  (sharpened by O8C)
finding: O8C exercised the live fn_iu_create and pinned its exact input
         contract — to return status='created' a cutplan row must supply:
           canonical_address (non-empty, unique),
           title (non-empty), body (non-null), actor (non-empty),
           unit_kind  -> must resolve via vocab.unit_kind.*   ('law_unit' OK),
           section_type -> must be an EXPLICIT vocab value (vocab.section_type.*)
             — it lands in identity_profile.primary_section_type_ref; NULL is
             rejected with "section_type: Multiple, choose: …",
           publication_type -> must resolve 'explicit' (adapter hardcodes 'law' — OK).
next_action: the orchestrator cutplan phase must emit content-enriched rows
             carrying body + title + unit_kind + an explicit vocab section_type
             + owner_ref; extend cut_leg_a's pre-flight guard (currently
             body/title only) to section_type/unit_kind, or pin the cutplan
             row contract. Non-mutating phase — Mac source work.

F3 — generalise LegB / Verify recorder off the N=60 Constitution pin

status: OPEN  (sharpened)
finding: leg_b_record / write_verify ship the txn-owning SEAM; the default
         governance_writer / verify_writer REFUSE (proven still gated, PROOF-2).
         The concrete writers wrap the Constitution-N=60-pinned v0.5
         LegBRecorder / VerifyRecorder.
next_action: author production governance_writer + verify_writer that wrap
             LegBRecorder / VerifyRecorder generalised off the N=60 pin; then
             real-DB rollback-only-prove them the way O8C proved fn_iu_create.
             Mac source work.

F4 — GPG key backup (BACKUP_GPG_FPR)

status: OPEN
finding: no BACKUP_GPG_FPR (or any *GPG* key) in /opt/incomex/docker/.env;
         `gpg --list-keys` on the host returns no keys. pre_write_backup's
         default backup_runner therefore correctly REFUSES.
next_action: provision a dedicated backup GPG keypair, publish BACKUP_GPG_FPR,
             inject a backup_runner doing the narrow pg_dump + gpg --encrypt;
             rollback-only-prove pre_write_backup. VPS provisioning + config.

GAP5 — orchestrator config + /var/lib/cutter directories

status: OPEN
finding: /var/lib/cutter does NOT exist; /opt/incomex/dot/config has only
         credentials.example.json + environment.sh — no orchestrator config.
next_action: VPS runtime command package (Report 07 §B) — create
             /var/lib/cutter/{runs,state,backups} with correct ownership +
             author the orchestrator run config. Runtime only — NOT source.
             (Deliberately NOT executed in O8C — out of rollback-proof scope.)

GAP6 — per-cut revert / compensation

status: OPEN
finding: each adapter method owns ONE atomic txn (intra-phase failure =>
         ROLLBACK, proven). Cross-phase compensation — reverting an
         already-committed cut/enact — is unaddressed.
next_action: design + author a per-cut revert/compensation path (a tested
             inverse of cut_leg_a / lifecycle_enact) before the first run.

GAP7 — sovereign SG_1 / SG_2 approval

status: OPEN  (intentionally — O8C must not flip the kill-switch)
finding: the kill-switch flip for the first production run is gated on a
         sovereign SG_1 / SG_2 ruling. O8C kept execution_enabled=False.
next_action: author the sovereign SG_1 / SG_2 approval docs (single-run-scoped
             kill-switch flip, per O8 Report 04 toggle design). This gate also
             unblocks the F1 residue.

GAP8 — safe target document

status: OPEN
finding: no harmless target document has been selected for the first
         orchestrator-managed production run.
next_action: select/author a low-stakes target document + its cutplan;
             dry-run it; pair it with GAP7 for the first authorised run.

Roll-up

Item Status Blocking the first production run?
F1 PARTIAL yes — needs GAP7 flip for the residue
F2 OPEN (sharpened) yes — cutplan content contract
F3 OPEN (sharpened) yes — leg_b / verify writers
F4 OPEN yes — backup is mandatory pre-write
GAP5 OPEN yes — runtime dirs/config
GAP6 OPEN recommended before run
GAP7 OPEN yes — the authorising gate
GAP8 OPEN yes — needs a target

O8C closed the deployed-state ratification and the real-DB rollback-only integration proof (the hardest part of F1). The first orchestrator-managed production run remains blocked on F2/F3/F4 + GAP5/6/7/8 — each now has an exact next action.

Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/v0.6-o8c-real-db-rollback-proof-readiness/06-gap-closure-matrix.md