Files
rune/scripts/wr_root_reconcile.py
T
Nick f64ee95aad
Auto-label / priority-gate (pull_request) Skipped
CI Pipeline / best-practices (push) Successful in 27s
Auto-label / auto-label (pull_request) Successful in 7s
CI Pipeline / documentation (push) Successful in 9s
CI Pipeline / canary (push) Successful in 54s
CI Pipeline / lint (push) Successful in 1m9s
CI Pipeline / type-check (push) Failing after 38s
CI Pipeline / gitea-offline (push) Successful in 28s
CI Pipeline / best-practices (pull_request) Successful in 17s
CI Pipeline / documentation (pull_request) Successful in 12s
CI Pipeline / canary (pull_request) Successful in 47s
CI Pipeline / gitea-offline (pull_request) Successful in 33s
CI Pipeline / type-check (pull_request) Failing after 55s
deploy / deploy (push) Skipped
Spec gate (headless) / spec-gate (pull_request) Successful in 23s
CI Pipeline / unit-tests (push) Failing after 3m40s
CI Pipeline / required-checks (push) Failing after 9s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 19s
CI Pipeline / lint (pull_request) Successful in 1m4s
CI Pipeline / unit-tests (pull_request) Failing after 3m38s
CI Pipeline / required-checks (pull_request) Failing after 8s
CI Pipeline / CI Pipeline / notify-event-bridge (pull_request) Successful in 13s
feat(t21.5): root-cause continuation + guard retirement + V1 parity
- ci_event_wait: OPERATION_SPECS (op-specific completion authority:
  branch_ci/pull_request_checks -> own runs; master_ci/deploy/release ->
  deploy qualification); SINGLE LOGICAL AWAIT (all nonterminal conditions
  re-arm internally; model sees only terminal verdicts or real deadline)
- await-operation tool: op_type parameter
- runtime wait guard + cwd guard RETIRED (canonical hook = documented
  no-op; prevention lives in tests, not interception)
- wr_root_resolver.py: ONE wait/resume root authority; split-brain fails
  loudly; start_wr_daemon.py resolves root once; governed reconciliation
- construction_activation._auto_structural_awareness: PROJECT_BUILD
  bootstrap auto-registers Registry + spine manages edge (no manual
  bookkeeping); fixed latent dispatch_from_decision mode-object bug
- research_memory_port.py: future-facing Memory port inside existing
  INWARD (provider contract, zero-result fast path, teachable-moment
  candidate seam; APPLICABILITY governs transfer)
- v1_parity_manifest.py: 56 rows, 0 blocking mandatory-V1 items
- G1-G12 gate evidence in store/scaffold/t21.5_gates.json
2026-09-17 12:56:52 +01:00

48 lines
1.4 KiB
Python

#!/usr/bin/env python3
"""wr_root_reconcile.py — T21.5 §7: governed split-brain reconciliation.
If canonical and legacy W/R roots both hold live event stores, this
moves legacy-root events that are ABSENT from the canonical store into
it (idempotent, content-keyed by filename), then reports what remains.
Never deletes; the legacy store stays as a moved-marker record.
"""
from __future__ import annotations
import json
import shutil
import sys
from pathlib import Path
_SCRIPT_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(_SCRIPT_DIR))
import wr_root_resolver as resolver # noqa: E402
def main() -> int:
canonical = resolver.CANONICAL_WR_ROOT
legacy = resolver.LEGACY_WR_ROOT
(canonical / "events").mkdir(parents=True, exist_ok=True)
moved = 0
skipped = 0
for src in sorted((legacy / "events").glob("*.json")):
dst = canonical / "events" / src.name
if dst.exists():
skipped += 1
continue
shutil.copy2(src, dst)
moved += 1
report = {
"canonical": str(canonical),
"legacy": str(legacy),
"events_moved_to_canonical": moved,
"already_present_skipped": skipped,
"note": "legacy store retained (never deleted); daemon and all "
"consumers now resolve via wr_root_resolver",
}
print(json.dumps(report, indent=2))
return 0
if __name__ == "__main__":
sys.exit(main())