feat: publish authoritative fabric cutover export
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s

Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a053ff-1d6f-7fe2-ac1c-a6eb40a42a0c
This commit is contained in:
codex 2026-08-31 22:18:26 +02:00
parent 7745a965f6
commit 113445def9
5 changed files with 112 additions and 6 deletions

View file

@ -348,14 +348,15 @@ def main(argv: list[str] | None = None) -> int:
if args.command == "export":
graph = _load_graph_or_exit(args.paths)
export_payload = _export_with_provenance(graph.to_export(), args.paths)
if args.format == "mermaid":
print(graph.to_mermaid())
elif args.format == "graph-explorer":
print(json.dumps(fabric_graph_explorer_payload(graph.to_export()), indent=2, sort_keys=True))
print(json.dumps(fabric_graph_explorer_payload(export_payload), indent=2, sort_keys=True))
elif args.format == "financial":
print(json.dumps(financial_export_from_legacy(graph.to_export()), indent=2, sort_keys=True))
print(json.dumps(financial_export_from_legacy(export_payload), indent=2, sort_keys=True))
else:
print(graph.to_json())
print(json.dumps(export_payload, indent=2, sort_keys=True))
return 0
if args.command == "scan":
@ -1648,6 +1649,20 @@ def _primary_repo_path(paths: list[Path]) -> Path:
return path.parent if path.is_file() else path
def _export_with_provenance(graph: dict[str, Any], paths: list[Path]) -> dict[str, Any]:
"""Attach stable producer provenance to an operator export."""
repo_path = _primary_repo_path(paths)
payload = json.loads(json.dumps(graph))
payload["generated_at"] = _utc_now()
payload["source"] = {
"producer": "railiance-fabric",
"repo": "railiance-fabric",
"commit": _git_value(repo_path, "rev-parse", "HEAD") or "working-tree",
"path": ",".join(path.as_posix() for path in paths) or ".",
}
return payload
def _slugify(value: str) -> str:
return re.sub(r"-+", "-", re.sub(r"[^a-z0-9]", "-", value.lower())).strip("-") or "repo"