format.py python
42 lines 1.5 KB
Raw
sha256:a78e7e5a8740e03315f325d19edeb3aa1b306b3337d04abbaa9a9e0f3bbeb7a1 docs: MuseHub-first before ISR #74 — staging solidify NEXT Human 3 days ago
1 """Format pending governance gates for CLI surfaces (§KH1.9)."""
2
3 from __future__ import annotations
4
5 from tools.governance_gates.types import GateScanResult, PendingGate
6
7
8 def format_pending_gate_lines(result: GateScanResult) -> tuple[str, ...]:
9 """Human-readable lines for status and governance-sync footers."""
10 if result.suppressed:
11 return ("governance-gates: reminders suppressed (Tier 2)",)
12 if not result.pending:
13 return ("governance-gates: none pending in active slice",)
14 lines = ["Pending governance gates:"]
15 for gate in result.pending:
16 lines.append(_format_gate(gate))
17 lines.append("Reminders only — acknowledge or invoke; silence is not pass.")
18 return tuple(lines)
19
20
21 def pending_gates_payload(result: GateScanResult) -> dict:
22 """JSON-serializable pending gates for ``overseer status --json``."""
23 return {
24 "enabled": result.enabled,
25 "suppressed": result.suppressed,
26 "active_phases": list(result.active_phases),
27 "pending": [
28 {
29 "gate_id": gate.gate_id,
30 "phase_id": gate.phase_id,
31 "artifact": gate.artifact,
32 "message": gate.message,
33 "invoke": gate.invoke,
34 }
35 for gate in result.pending
36 ],
37 }
38
39
40 def _format_gate(gate: PendingGate) -> str:
41 artifact = f" ({gate.artifact})" if gate.artifact else ""
42 return f"- {gate.gate_id}: {gate.phase_id}{artifact} — {gate.message}; invoke: {gate.invoke}"
File History 2 commits
sha256:a78e7e5a8740e03315f325d19edeb3aa1b306b3337d04abbaa9a9e0f3bbeb7a1 docs: MuseHub-first before ISR #74 — staging solidify NEXT Human 3 days ago
sha256:4671b7f787ddbe63ced31c895b688c77ab495653b65a730b423329f26b3c1439 feat: K1-P1 complete — agent provenance, build-verification… Sonnet 4.6 patch 54 days ago