6.5 KiB
Phase 13.6 — Hardening Closure (FORMAL CLOSURE)
Status: CLOSED / DEPLOYED / VERIFIED Datum: 01.09.2026 Autor: Rain Ocampo (Hermes) / Red Queen Freigabe: Christian List (Owner)
1. Scope
Phase 13.6 umfasst die produktive Härtung des Historical-Service:
- Korrigierter TOCTOU-Befund (Dataset-Version)
- Dataset-Version-Repair (repository.py)
- TrustGate Defense-in-Depth
- Legacy Entry-Point Hardening
- Schema-Entscheidung (keine Migration nötig)
Phase 13.6 ist bereits erfolgreich produktiv deployed und verifiziert. Diese Mission persistiert ausschließlich die verifizierte Abschlussdokumentation in der autoritativen Git-Historie. KEINE Trading-/Runtime-Änderung.
2. Korrigierter TOCTOU-Befund
Ursprünglicher Befund (Phase 13.5, Deferred Risk #2): get_or_create_dataset_version ohne UNIQUE auf Hash → potenzielle doppelte Dataset-Version-Metadaten bei parallelen identischen Requests.
Korrigierte Analyse: dataset_version_hash hatte bereits UNIQUE-Schutz. Der tatsächliche Defekt war ein SELECT→INSERT-Concurrency-Race, das eine UniqueViolation werfen konnte (nicht doppelte Zeilen).
3. Dataset-Version-Repair (repository.py)
Repair in app/persistence/repository.py (Image-SHA 33cca6421a595c68a12bf6b25eb02b47edf868fb27501330e356de2c0c3a7bd6):
pg_advisory_xact_lock(dataset_id)— serialisiert konkurrierende Requests pro DatasetON CONFLICT(dataset_version_hash) DO NOTHING RETURNING— idempotenter Insert- kanonischer Re-SELECT nach Konflikt
- deterministische kanonische ID
- fail-closed bei ambigem/Fehlerzustand
Concurrency-Validierung:
- Baseline Gold x10: 3 OK, 7 UniqueViolation, 1 row
- Patched x10: 10/10 OK, gleiche kanonische ID, 1 row
4. TrustGate Defense-in-Depth
- Fehlender TrustGate auf produktionsfähigem Pfad: FAIL CLOSED
- UNKNOWN / UNTRUSTED / CONDITIONAL (Default) / MISSING / EXCEPTION: BLOCK
- Nur TRUSTED (oder CONDITIONAL mit expliziter Policy) persistierbar
5. Legacy Entry-Point Hardening
run_backfill.py: HARD-FAIL (non-zero exit, kein Provider/Persistence-Continuation)run_phase11_pilot.py: HARD-FAIL (non-zero exit, kein Provider/Persistence-Continuation)
6. Schema-Entscheidung
SCHEMA MIGRATION = NOT REQUIRED. Bestehendes UNIQUE(dataset_version_hash) bleibt erhalten.
7. Production DB Precheck
- UNIQUE existiert: JA
- duplicates: 0
- NULL anomalies: 0
- FK anomalies: 0
- dataset_version: 336
8. Candidate Image / Build Provenance
| Feld | Wert |
|---|---|
| Image ID | sha256:21598a3597cfd53c4bc22c01cb7f7874259878ecd7608528ccd6327305ea07fc |
| Tag | historical-v2-historical-service:candidate-phase13-6-hardening |
| Build Input SHA | f45e4885… (nur gekürzt in Evidence verfügbar) |
| Archive SHA | 92a9982a212e1f7576305aa765f3c0163812a486f0afb64cb1dd58ba5b55f0c5 |
| Pin | rq-historical-pin-phase13-6-hardening |
| Status | VERIFIED + ARCHIVED + PINNED = READY |
9. Production Deployment
| Feld | Wert |
|---|---|
| Source | Phase-13.5 Remediation sha256:f72b27e72fc6418edde5810090dad62538f2f85903424992691d79cfc69b8884 |
| Target | Phase-13.6 sha256:21598a3597cfd53c4bc22c01cb7f7874259878ecd7608528ccd6327305ea07fc |
| Real Recreate Count | 1 |
| Exit Code | 0 |
| Container (nach) | d274568ae85173b408531315e7a51aa9fd54b0587931d8c662548736b154313b |
| running / RestartCount | true / 0 |
| health / ready | 200 / 200 |
10. Target Manifest
- 58 Gold/unchanged matches
- 5 autorisierte Divergenzen:
run_backfill_year.py— bestehende Phase-13.5-Autorisierung (Runner6cca3c55bb559d75be2f58e59c231003902f124a54ada25582970524599f0752)repository.py—33cca6421a595c68a12bf6b25eb02b47edf868fb27501330e356de2c0c3a7bd6backfill.py—fb93ee1f09b3708eae155b12df1b8a1103ea7c0a4a6aea70c476fd544d58ac0erun_backfill.py—79ee38fd51cf3f92550997cab2ffd6700468d4d7b3921ca97bbc7a38d6a8f383run_phase11_pilot.py—34e345a951a92eecfa8418ae078e30d9fef24c5ef2043dc0b194b064f84cf551
- unauthorized: 0
- missing: 0
- extra: 0
11. Rollback Control Plane
- Historischer Gold-Anker
1f3ba210…ist unverfügbar (Coolify-GC, kein SHA-verifiziertes docker-save-Archiv). - Bewiesen:
1f3ba210…war ein stale/wrong-target pre-gate für den Remediation-Rollback (SOURCE-state/historische Referenz, NICHT Rollback-TARGET-Requirement). - Kein Fake/Retag/Rebuild von
1f3ba210…durchgeführt. - Primary Rollback zielt/verifiziert jetzt exakt auf den Phase-13.5-Remediation-Target.
- Direct no-op bleibt FAIL CLOSED.
- Primary Rollback dry-run: PASS
- Secondary Recovery Rollback dry-run: PASS
12. Production DB Integrity
- dataset_version: 336 → 336
- duplicates: 0 → 0
- NULL anomalies: 0 → 0
- FK anomalies: 0
- Keine produktiven DB-Writes durch den Deployment.
13. Mutation Accounting
| Mutation | Anzahl |
|---|---|
| Wrapper Target-Class Deploy | 1 |
| Rollback Control-Plane Wrapper Patch | 1 |
| Production Recreate | 1 |
| Production DB Write | 0 |
| Schema | 0 |
| Backfill | 0 |
| Provider | 0 |
| Rollback | 0 |
| Phase 14 | 0 |
14. Security Invariants
- TrustGate fail-closed auf produktionsfähigem Pfad: PASS
- Legacy Entry-Points (
run_backfill.py,run_phase11_pilot.py): HARD-FAIL - Kein Runner/Backfill aktiv
- Keine produktiven DB-Writes
15. Deferred Work (NICHT durch Phase 13.6 autorisiert/gelöst)
Phase 13.6 autorisiert oder löst NICHT:
- kein produktiver Historical Backfill ausgeführt
- kein Trusted Historical Provider ausgewählt
- kein Trusted Provider Pilot ausgeführt
- keine Provider/Provenance-Acceptance abgeschlossen
- kein Phase 14
- keine Live-Capital/Trading-Aktivierung
Der nächste große Workstream bleibt separat.
16. Final Closure Statement
PHASE 13.6 CLOSED — DEPLOYED — VERIFIED — DOCUMENTED — FAST-FORWARD PUSHED — REMOTE SOT PERSISTED — RUNTIME UNCHANGED
Phase 13.6 ist formal geschlossen. Die autoritative Closure-Evidence wurde in Red-Queen-/Rain-Ocampo-Ausführungskontext erzeugt und verifiziert:
/opt/data/rq_phase136_repair/(Primary Rollback Control-Plane Repair)/opt/data/rq_phase136_owner_verify/(Owner Candidate Verification)/opt/data/rq_phase136_deployment/(Controlled Deployment)
Git-Baseline vor dieser Closure: 51c03f7ade49db263f4908b087418ec92979e4e6 (phase13.5: formally close runner trustgate remediation).