types.py python
104 lines 2.4 KB
Raw
sha256:a78e7e5a8740e03315f325d19edeb3aa1b306b3337d04abbaa9a9e0f3bbeb7a1 docs: MuseHub-first before ISR #74 — staging solidify NEXT Human 12 hours ago
1 """Typed results for the Governance Hygiene Agent (§9A-5)."""
2
3 from __future__ import annotations
4
5 from dataclasses import dataclass, field
6 from typing import Literal
7
8 DriftState = Literal["aligned", "drifted", "unreadable"]
9
10
11 @dataclass(frozen=True)
12 class MergedPullRequest:
13 """One row from ``gh pr list --state merged`` (R4)."""
14
15 number: int
16 title: str
17 merge_commit_sha: str
18 merged_at: str
19
20
21 @dataclass(frozen=True)
22 class VerifiedReads:
23 """Snapshot of R1–R5 verified reads."""
24
25 regime: str
26 r1_github_main_sha: str | None
27 r1_command: str | None
28 r2_anchor_sha: str
29 r2_source: str
30 r3_canonical_main_sha: str | None
31 r3_command: str | None
32 r4_merged_prs: tuple[MergedPullRequest, ...]
33 r5_branch: str
34 r5_dirty: bool
35 r5_regime: str
36
37
38 @dataclass(frozen=True)
39 class DriftReport:
40 """Typed drift detection result (D1–D3)."""
41
42 d1_handover_vs_git: DriftState
43 d2_anchor_vs_canonical: DriftState
44 d3_queue_vs_merged: DriftState
45 details: dict[str, str] = field(default_factory=dict)
46
47 @property
48 def any_drifted(self) -> bool:
49 return any(
50 state == "drifted"
51 for state in (self.d1_handover_vs_git, self.d2_anchor_vs_canonical, self.d3_queue_vs_merged)
52 )
53
54 @property
55 def any_unreadable(self) -> bool:
56 return any(
57 state == "unreadable"
58 for state in (self.d1_handover_vs_git, self.d2_anchor_vs_canonical, self.d3_queue_vs_merged)
59 )
60
61 @property
62 def fully_aligned(self) -> bool:
63 return not self.any_drifted and not self.any_unreadable
64
65
66 @dataclass(frozen=True)
67 class QueueRow:
68 """One parsed roadmap build-queue row (D3 claim)."""
69
70 phase_label: str
71 model: str
72 status: str
73 deliverable: str
74 raw_line: str
75
76
77 @dataclass(frozen=True)
78 class PatchPlan:
79 """Planned doc patches before apply."""
80
81 handover_text: str
82 roadmap_text: str
83 patched_sections: tuple[str, ...]
84 realign_planned: bool
85 realign_reason: str | None
86 feature_branch: str
87 commit_message: str
88 pr_url: str | None
89
90
91 @dataclass(frozen=True)
92 class GovernanceSyncResult:
93 """Outcome of a governance-sync run."""
94
95 exit_code: int
96 dry_run: bool
97 reads: VerifiedReads | None
98 drift: DriftReport | None
99 plan: PatchPlan | None
100 committed: bool
101 commit_sha: str | None
102 messages: tuple[str, ...]
103 error_command: str | None = None
104 workspace_relay: str = "not_configured"
File History 2 commits
sha256:a78e7e5a8740e03315f325d19edeb3aa1b306b3337d04abbaa9a9e0f3bbeb7a1 docs: MuseHub-first before ISR #74 — staging solidify NEXT Human 12 hours ago
sha256:4671b7f787ddbe63ced31c895b688c77ab495653b65a730b423329f26b3c1439 feat: K1-P1 complete — agent provenance, build-verification… Sonnet 4.6 patch 52 days ago