local-review.yml (push) Invalid workflow file
Auto-version and Release / release (push) Successful in 11s
CI Pipeline / lint (push) Failing after 30s
CI Pipeline / go-surface (push) Failing after 18s
CI Pipeline / rust-surface (push) Successful in 4m22s
CI Pipeline / unit-tests (push) Failing after 5m36s
CI Pipeline / best-practices (push) Successful in 6s
CI Pipeline / documentation (push) Successful in 6s
CI Pipeline / canary (push) Failing after 1m1s
CI Pipeline / type-check (push) Failing after 33s
CI Pipeline / gitea-offline (push) Successful in 17s
deploy / deploy (push) Failing after 15m11s
CI Pipeline / required-checks (push) Failing after 1s
CI Pipeline / CI Pipeline / notify-event-bridge (push) Successful in 8s
- test_route_acceptance.py (#300): fixes stay light, uncertainty escalates via the production sufficiency path, provenance never lost, floor-protected downgrade raises — 4/4 - adapt_scorecard.py (#301): 6-job fixture set, 6/6 route accuracy, elapsed + avoided-waste reported - wiring_status.py (#315): 202 modules mapped to wiring + authority-map coverage, unwired list, largest-first 10/10 green. #300/#301/#315 closed with evidence.
78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
#!/usr/bin/env python3
|
|
"""wiring_status.py — #315: wiring-status / architecture-truth report (v2).
|
|
|
|
A deterministic generator mapping which modules exist, where they're
|
|
wired, and what the authority map covers. Architecture honesty generated
|
|
from the code, not asserted in docs.
|
|
|
|
Usage: python3 scripts/wiring_status.py [--json]
|
|
"""
|
|
|
|
import argparse
|
|
import json
|
|
import re
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
REPO = Path(__file__).resolve().parent.parent
|
|
|
|
|
|
def modules():
|
|
"""Every src/rune module + its wiring (imports of sibling modules)."""
|
|
out = {}
|
|
for f in sorted((REPO / "src" / "rune").glob("*.py")):
|
|
src = f.read_text()
|
|
wired = sorted(set(re.findall(
|
|
r"from rune import (\w+)|from \. import (\w+)|import (\w+)",
|
|
src)))
|
|
# flatten the tuple groups
|
|
names = sorted({n for grp in wired for n in grp if n})
|
|
# sibling-only (modules that exist in src/rune)
|
|
siblings = {n for n in names
|
|
if (REPO / "src" / "rune" / f"{n}.py").exists()}
|
|
out[f.stem] = {"wired_to": sorted(siblings),
|
|
"lines": len(src.splitlines())}
|
|
return out
|
|
|
|
|
|
def authority_coverage():
|
|
"""What the authority map covers (config/v1_authority_map.json)."""
|
|
p = REPO / "config" / "v1_authority_map.json"
|
|
if not p.exists():
|
|
return {"present": False, "domains": []}
|
|
try:
|
|
d = json.loads(p.read_text())
|
|
domains = list(d.keys()) if isinstance(d, dict) else []
|
|
return {"present": True, "domains": domains}
|
|
except ValueError:
|
|
return {"present": False, "domains": []}
|
|
|
|
|
|
def report():
|
|
mods = modules()
|
|
auth = authority_coverage()
|
|
unwired = [m for m, v in mods.items() if not v["wired_to"]]
|
|
return {"modules": len(mods), "authority": auth,
|
|
"unwired_modules": unwired,
|
|
"largest": sorted(((m, v["lines"]) for m, v in mods.items()),
|
|
key=lambda x: -x[1])[:5]}
|
|
|
|
|
|
def main():
|
|
ap = argparse.ArgumentParser()
|
|
ap.add_argument("--json", action="store_true")
|
|
args = ap.parse_args()
|
|
rep = report()
|
|
if args.json:
|
|
print(json.dumps(rep, indent=1))
|
|
else:
|
|
print(f"modules: {rep['modules']}, authority domains: "
|
|
f"{rep['authority'].get('domains', [])[:5]}")
|
|
print(f"unwired: {rep['unwired_modules'][:8]}")
|
|
print(f"largest: {rep['largest']}")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|