thehood 0.1.0-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/CODE_OF_CONDUCT.md +21 -0
  2. package/CONTRIBUTING.md +58 -0
  3. package/LICENSE +21 -0
  4. package/PRIVACY.md +49 -0
  5. package/README.md +264 -0
  6. package/SECURITY.md +31 -0
  7. package/dist/bridges/chatgptWebBridge.d.ts +2 -0
  8. package/dist/bridges/chatgptWebBridge.js +981 -0
  9. package/dist/bridges/chatgptWebBridge.js.map +1 -0
  10. package/dist/cli/args.d.ts +9 -0
  11. package/dist/cli/args.js +82 -0
  12. package/dist/cli/args.js.map +1 -0
  13. package/dist/cli/format.d.ts +56 -0
  14. package/dist/cli/format.js +752 -0
  15. package/dist/cli/format.js.map +1 -0
  16. package/dist/cli/main.d.ts +2 -0
  17. package/dist/cli/main.js +996 -0
  18. package/dist/cli/main.js.map +1 -0
  19. package/dist/cli/mcpConfig.d.ts +36 -0
  20. package/dist/cli/mcpConfig.js +98 -0
  21. package/dist/cli/mcpConfig.js.map +1 -0
  22. package/dist/index.d.ts +37 -0
  23. package/dist/index.js +38 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/mcp/protocol.d.ts +44 -0
  26. package/dist/mcp/protocol.js +33 -0
  27. package/dist/mcp/protocol.js.map +1 -0
  28. package/dist/mcp/server.d.ts +1 -0
  29. package/dist/mcp/server.js +106 -0
  30. package/dist/mcp/server.js.map +1 -0
  31. package/dist/mcp/tools.d.ts +10 -0
  32. package/dist/mcp/tools.js +2200 -0
  33. package/dist/mcp/tools.js.map +1 -0
  34. package/dist/mcp/validation.d.ts +8 -0
  35. package/dist/mcp/validation.js +67 -0
  36. package/dist/mcp/validation.js.map +1 -0
  37. package/dist/providers/chatgptWeb.d.ts +2 -0
  38. package/dist/providers/chatgptWeb.js +26 -0
  39. package/dist/providers/chatgptWeb.js.map +1 -0
  40. package/dist/providers/claudeCode.d.ts +4 -0
  41. package/dist/providers/claudeCode.js +32 -0
  42. package/dist/providers/claudeCode.js.map +1 -0
  43. package/dist/providers/codexCli.d.ts +6 -0
  44. package/dist/providers/codexCli.js +25 -0
  45. package/dist/providers/codexCli.js.map +1 -0
  46. package/dist/providers/codexCliModels.d.ts +23 -0
  47. package/dist/providers/codexCliModels.js +147 -0
  48. package/dist/providers/codexCliModels.js.map +1 -0
  49. package/dist/providers/localCommand.d.ts +26 -0
  50. package/dist/providers/localCommand.js +614 -0
  51. package/dist/providers/localCommand.js.map +1 -0
  52. package/dist/providers/markdownPayload.d.ts +7 -0
  53. package/dist/providers/markdownPayload.js +29 -0
  54. package/dist/providers/markdownPayload.js.map +1 -0
  55. package/dist/providers/responseSchema.d.ts +3 -0
  56. package/dist/providers/responseSchema.js +187 -0
  57. package/dist/providers/responseSchema.js.map +1 -0
  58. package/dist/providers/router.d.ts +3 -0
  59. package/dist/providers/router.js +21 -0
  60. package/dist/providers/router.js.map +1 -0
  61. package/dist/providers/stub.d.ts +2 -0
  62. package/dist/providers/stub.js +177 -0
  63. package/dist/providers/stub.js.map +1 -0
  64. package/dist/providers/types.d.ts +37 -0
  65. package/dist/providers/types.js +2 -0
  66. package/dist/providers/types.js.map +1 -0
  67. package/dist/runtime/agentBoard.d.ts +79 -0
  68. package/dist/runtime/agentBoard.js +166 -0
  69. package/dist/runtime/agentBoard.js.map +1 -0
  70. package/dist/runtime/agentBoardArtifact.d.ts +9 -0
  71. package/dist/runtime/agentBoardArtifact.js +171 -0
  72. package/dist/runtime/agentBoardArtifact.js.map +1 -0
  73. package/dist/runtime/agentRunner.d.ts +17 -0
  74. package/dist/runtime/agentRunner.js +92 -0
  75. package/dist/runtime/agentRunner.js.map +1 -0
  76. package/dist/runtime/approvalInbox.d.ts +54 -0
  77. package/dist/runtime/approvalInbox.js +143 -0
  78. package/dist/runtime/approvalInbox.js.map +1 -0
  79. package/dist/runtime/approvalPolicy.d.ts +11 -0
  80. package/dist/runtime/approvalPolicy.js +58 -0
  81. package/dist/runtime/approvalPolicy.js.map +1 -0
  82. package/dist/runtime/artifacts.d.ts +23 -0
  83. package/dist/runtime/artifacts.js +48 -0
  84. package/dist/runtime/artifacts.js.map +1 -0
  85. package/dist/runtime/browserManager.d.ts +37 -0
  86. package/dist/runtime/browserManager.js +356 -0
  87. package/dist/runtime/browserManager.js.map +1 -0
  88. package/dist/runtime/canonicalMemory.d.ts +23 -0
  89. package/dist/runtime/canonicalMemory.js +134 -0
  90. package/dist/runtime/canonicalMemory.js.map +1 -0
  91. package/dist/runtime/chatGptPageReadiness.d.ts +16 -0
  92. package/dist/runtime/chatGptPageReadiness.js +74 -0
  93. package/dist/runtime/chatGptPageReadiness.js.map +1 -0
  94. package/dist/runtime/commandRunner.d.ts +18 -0
  95. package/dist/runtime/commandRunner.js +115 -0
  96. package/dist/runtime/commandRunner.js.map +1 -0
  97. package/dist/runtime/commandSafety.d.ts +7 -0
  98. package/dist/runtime/commandSafety.js +61 -0
  99. package/dist/runtime/commandSafety.js.map +1 -0
  100. package/dist/runtime/config.d.ts +10 -0
  101. package/dist/runtime/config.js +107 -0
  102. package/dist/runtime/config.js.map +1 -0
  103. package/dist/runtime/crewLanes.d.ts +2 -0
  104. package/dist/runtime/crewLanes.js +123 -0
  105. package/dist/runtime/crewLanes.js.map +1 -0
  106. package/dist/runtime/criticPolicy.d.ts +17 -0
  107. package/dist/runtime/criticPolicy.js +50 -0
  108. package/dist/runtime/criticPolicy.js.map +1 -0
  109. package/dist/runtime/defaults.d.ts +5 -0
  110. package/dist/runtime/defaults.js +100 -0
  111. package/dist/runtime/defaults.js.map +1 -0
  112. package/dist/runtime/directives.d.ts +3 -0
  113. package/dist/runtime/directives.js +218 -0
  114. package/dist/runtime/directives.js.map +1 -0
  115. package/dist/runtime/doctor.d.ts +36 -0
  116. package/dist/runtime/doctor.js +185 -0
  117. package/dist/runtime/doctor.js.map +1 -0
  118. package/dist/runtime/errors.d.ts +20 -0
  119. package/dist/runtime/errors.js +41 -0
  120. package/dist/runtime/errors.js.map +1 -0
  121. package/dist/runtime/externalTransfer.d.ts +20 -0
  122. package/dist/runtime/externalTransfer.js +156 -0
  123. package/dist/runtime/externalTransfer.js.map +1 -0
  124. package/dist/runtime/fanout.d.ts +64 -0
  125. package/dist/runtime/fanout.js +263 -0
  126. package/dist/runtime/fanout.js.map +1 -0
  127. package/dist/runtime/gitEvidence.d.ts +10 -0
  128. package/dist/runtime/gitEvidence.js +80 -0
  129. package/dist/runtime/gitEvidence.js.map +1 -0
  130. package/dist/runtime/handoffs.d.ts +32 -0
  131. package/dist/runtime/handoffs.js +100 -0
  132. package/dist/runtime/handoffs.js.map +1 -0
  133. package/dist/runtime/ids.d.ts +2 -0
  134. package/dist/runtime/ids.js +4 -0
  135. package/dist/runtime/ids.js.map +1 -0
  136. package/dist/runtime/localStateIgnore.d.ts +9 -0
  137. package/dist/runtime/localStateIgnore.js +98 -0
  138. package/dist/runtime/localStateIgnore.js.map +1 -0
  139. package/dist/runtime/loop.d.ts +14 -0
  140. package/dist/runtime/loop.js +1863 -0
  141. package/dist/runtime/loop.js.map +1 -0
  142. package/dist/runtime/loopRecommendation.d.ts +109 -0
  143. package/dist/runtime/loopRecommendation.js +566 -0
  144. package/dist/runtime/loopRecommendation.js.map +1 -0
  145. package/dist/runtime/loopResponsibilities.d.ts +2 -0
  146. package/dist/runtime/loopResponsibilities.js +395 -0
  147. package/dist/runtime/loopResponsibilities.js.map +1 -0
  148. package/dist/runtime/loopRunner.d.ts +28 -0
  149. package/dist/runtime/loopRunner.js +81 -0
  150. package/dist/runtime/loopRunner.js.map +1 -0
  151. package/dist/runtime/operatorNextActions.d.ts +2 -0
  152. package/dist/runtime/operatorNextActions.js +344 -0
  153. package/dist/runtime/operatorNextActions.js.map +1 -0
  154. package/dist/runtime/paths.d.ts +9 -0
  155. package/dist/runtime/paths.js +14 -0
  156. package/dist/runtime/paths.js.map +1 -0
  157. package/dist/runtime/permissions.d.ts +9 -0
  158. package/dist/runtime/permissions.js +73 -0
  159. package/dist/runtime/permissions.js.map +1 -0
  160. package/dist/runtime/progressPacket.d.ts +12 -0
  161. package/dist/runtime/progressPacket.js +512 -0
  162. package/dist/runtime/progressPacket.js.map +1 -0
  163. package/dist/runtime/protectedPaths.d.ts +6 -0
  164. package/dist/runtime/protectedPaths.js +48 -0
  165. package/dist/runtime/protectedPaths.js.map +1 -0
  166. package/dist/runtime/providers.d.ts +13 -0
  167. package/dist/runtime/providers.js +60 -0
  168. package/dist/runtime/providers.js.map +1 -0
  169. package/dist/runtime/reconciliation.d.ts +17 -0
  170. package/dist/runtime/reconciliation.js +283 -0
  171. package/dist/runtime/reconciliation.js.map +1 -0
  172. package/dist/runtime/redaction.d.ts +1 -0
  173. package/dist/runtime/redaction.js +5 -0
  174. package/dist/runtime/redaction.js.map +1 -0
  175. package/dist/runtime/remoteRepoContext.d.ts +77 -0
  176. package/dist/runtime/remoteRepoContext.js +316 -0
  177. package/dist/runtime/remoteRepoContext.js.map +1 -0
  178. package/dist/runtime/repoContext.d.ts +50 -0
  179. package/dist/runtime/repoContext.js +399 -0
  180. package/dist/runtime/repoContext.js.map +1 -0
  181. package/dist/runtime/repoGateway.d.ts +64 -0
  182. package/dist/runtime/repoGateway.js +308 -0
  183. package/dist/runtime/repoGateway.js.map +1 -0
  184. package/dist/runtime/responseContracts.d.ts +3 -0
  185. package/dist/runtime/responseContracts.js +86 -0
  186. package/dist/runtime/responseContracts.js.map +1 -0
  187. package/dist/runtime/reviewLanes.d.ts +2 -0
  188. package/dist/runtime/reviewLanes.js +343 -0
  189. package/dist/runtime/reviewLanes.js.map +1 -0
  190. package/dist/runtime/reviewRouting.d.ts +51 -0
  191. package/dist/runtime/reviewRouting.js +152 -0
  192. package/dist/runtime/reviewRouting.js.map +1 -0
  193. package/dist/runtime/revisionPacket.d.ts +38 -0
  194. package/dist/runtime/revisionPacket.js +144 -0
  195. package/dist/runtime/revisionPacket.js.map +1 -0
  196. package/dist/runtime/revisionTrail.d.ts +2 -0
  197. package/dist/runtime/revisionTrail.js +162 -0
  198. package/dist/runtime/revisionTrail.js.map +1 -0
  199. package/dist/runtime/role-assignment.d.ts +4 -0
  200. package/dist/runtime/role-assignment.js +21 -0
  201. package/dist/runtime/role-assignment.js.map +1 -0
  202. package/dist/runtime/roleRoster.d.ts +28 -0
  203. package/dist/runtime/roleRoster.js +96 -0
  204. package/dist/runtime/roleRoster.js.map +1 -0
  205. package/dist/runtime/runInsights.d.ts +121 -0
  206. package/dist/runtime/runInsights.js +305 -0
  207. package/dist/runtime/runInsights.js.map +1 -0
  208. package/dist/runtime/runMonitor.d.ts +33 -0
  209. package/dist/runtime/runMonitor.js +143 -0
  210. package/dist/runtime/runMonitor.js.map +1 -0
  211. package/dist/runtime/runtime.d.ts +15 -0
  212. package/dist/runtime/runtime.js +199 -0
  213. package/dist/runtime/runtime.js.map +1 -0
  214. package/dist/runtime/runtimeInfo.d.ts +9 -0
  215. package/dist/runtime/runtimeInfo.js +76 -0
  216. package/dist/runtime/runtimeInfo.js.map +1 -0
  217. package/dist/runtime/store.d.ts +4 -0
  218. package/dist/runtime/store.js +48 -0
  219. package/dist/runtime/store.js.map +1 -0
  220. package/dist/runtime/summons.d.ts +25 -0
  221. package/dist/runtime/summons.js +403 -0
  222. package/dist/runtime/summons.js.map +1 -0
  223. package/dist/runtime/teamPresets.d.ts +14 -0
  224. package/dist/runtime/teamPresets.js +153 -0
  225. package/dist/runtime/teamPresets.js.map +1 -0
  226. package/dist/runtime/types.d.ts +505 -0
  227. package/dist/runtime/types.js +28 -0
  228. package/dist/runtime/types.js.map +1 -0
  229. package/dist/runtime/validationCommands.d.ts +18 -0
  230. package/dist/runtime/validationCommands.js +106 -0
  231. package/dist/runtime/validationCommands.js.map +1 -0
  232. package/dist/tui/dashboard.d.ts +41 -0
  233. package/dist/tui/dashboard.js +1115 -0
  234. package/dist/tui/dashboard.js.map +1 -0
  235. package/docs/ARCHITECTURE.md +277 -0
  236. package/docs/CLI_SPEC.md +396 -0
  237. package/docs/CODEX_SETUP.md +288 -0
  238. package/docs/COMPLETION_CONTRACT.md +52 -0
  239. package/docs/CONTRIBUTOR_GUIDE.md +70 -0
  240. package/docs/DEMO.md +62 -0
  241. package/docs/GLOSSARY.md +46 -0
  242. package/docs/GOAL_LOOP_SCHEDULE.md +50 -0
  243. package/docs/KNOWN_LIMITATIONS.md +29 -0
  244. package/docs/LICENSING.md +21 -0
  245. package/docs/LOOP_RECIPES.md +290 -0
  246. package/docs/LOOP_SELECTION_UX.md +118 -0
  247. package/docs/MCP_SPEC.md +689 -0
  248. package/docs/MEMORY_AND_RECONCILIATION.md +222 -0
  249. package/docs/NPM_PUBLISHING.md +51 -0
  250. package/docs/OPEN_DECISIONS.md +81 -0
  251. package/docs/PROMPT_SCHEMAS.md +411 -0
  252. package/docs/PROVIDER_ADAPTERS.md +323 -0
  253. package/docs/PROVIDER_MATRIX.md +21 -0
  254. package/docs/PUBLIC_REPO_READINESS.md +49 -0
  255. package/docs/RESEARCH_NOTES.md +92 -0
  256. package/docs/ROADMAP.md +94 -0
  257. package/docs/ROLE_CONTRACTS.md +252 -0
  258. package/docs/RUNTIME_LOOP.md +240 -0
  259. package/docs/SECURITY_AND_PRIVACY.md +161 -0
  260. package/docs/TESTING_AND_VERIFICATION.md +180 -0
  261. package/docs/TRUST_MODEL.md +65 -0
  262. package/docs/decisions/0001-runtime-first-cli-and-mcp.md +23 -0
  263. package/docs/decisions/0002-provider-neutral-role-mapping.md +43 -0
  264. package/docs/decisions/0003-separate-implementation-and-verification.md +27 -0
  265. package/docs/product/README.md +14 -0
  266. package/docs/product/model-selection.md +88 -0
  267. package/docs/product/positioning.md +37 -0
  268. package/docs/product/pro-usage-modes.md +70 -0
  269. package/docs/product/roadmap.md +57 -0
  270. package/docs/product/role-policy.md +89 -0
  271. package/docs/product/runtime-invariants.md +44 -0
  272. package/docs/release/v0.1.0-preview.0.md +48 -0
  273. package/examples/stub-demo/README.md +25 -0
  274. package/package.json +55 -0
@@ -0,0 +1,343 @@
1
+ import { roleLaneLabel } from "./handoffs.js";
2
+ const eventSource = (run, event) => ({
3
+ kind: "run_event",
4
+ runId: run.runId,
5
+ id: event.id,
6
+ eventType: event.type
7
+ });
8
+ const artifactSource = (run, artifact) => ({
9
+ kind: "run_artifact",
10
+ runId: run.runId,
11
+ ref: artifact.ref
12
+ });
13
+ const toolSource = (run, event) => ({
14
+ kind: "tool_event",
15
+ runId: run.runId,
16
+ id: event.id
17
+ });
18
+ const runSource = (run) => ({
19
+ kind: "run_record",
20
+ runId: run.runId
21
+ });
22
+ const isJsonObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
23
+ const stringField = (value) => typeof value === "string" && value.trim().length > 0 ? value : undefined;
24
+ const numberField = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
25
+ const providerResponseEvents = (run, role) => run.events.filter((event) => {
26
+ if (event.type !== "agent_response" || !event.data) {
27
+ return false;
28
+ }
29
+ return event.data.role === role;
30
+ });
31
+ const latestProviderResponseEvent = (run, role) => providerResponseEvents(run, role).at(-1);
32
+ const latestRevisionPacketEvent = (run) => run.events.filter((event) => event.type === "revision_packet_written").at(-1);
33
+ const eventIndex = (run, event) => event ? run.events.findIndex((candidate) => candidate.id === event.id) : -1;
34
+ const eventIsAfter = (run, left, right) => eventIndex(run, left) > eventIndex(run, right);
35
+ const summonResponseEvents = (run, role) => run.events.filter((event) => event.type === "summon_response" && event.data?.role === role);
36
+ const latestSummonResponseEvent = (run, role) => summonResponseEvents(run, role).at(-1);
37
+ const artifactForEvent = (run, event) => {
38
+ const artifactRef = stringField(event?.data?.artifactRef);
39
+ return artifactRef ? run.artifacts.find((artifact) => artifact.ref === artifactRef) : undefined;
40
+ };
41
+ const readOnlyOwnerRoles = new Set(["verifier", "qa", "critic", "planner", "researcher", "citation"]);
42
+ const roleOwner = (run, role) => {
43
+ const assignment = run.roleMapping[role];
44
+ const label = roleLaneLabel(role);
45
+ if (!assignment) {
46
+ return {
47
+ kind: "role",
48
+ label,
49
+ role,
50
+ readOnly: readOnlyOwnerRoles.has(role)
51
+ };
52
+ }
53
+ return {
54
+ kind: "role",
55
+ label,
56
+ role,
57
+ readOnly: readOnlyOwnerRoles.has(role),
58
+ provider: assignment.provider,
59
+ model: assignment.model,
60
+ assignment: `${assignment.provider}:${assignment.model}`
61
+ };
62
+ };
63
+ const roleOwnerFromEvent = (run, role, event) => {
64
+ const owner = roleOwner(run, role);
65
+ const provider = stringField(event?.data?.provider);
66
+ const model = stringField(event?.data?.model);
67
+ return provider && model
68
+ ? {
69
+ ...owner,
70
+ provider,
71
+ model,
72
+ assignment: `${provider}:${model}`
73
+ }
74
+ : owner;
75
+ };
76
+ const runtimeOwner = (label) => ({
77
+ kind: "runtime",
78
+ label,
79
+ readOnly: true
80
+ });
81
+ const implementationReviewRequired = (run) => run.mode === "implement" ||
82
+ ["implementing", "verifying", "integrating"].includes(run.state) ||
83
+ providerResponseEvents(run, "implementer").length > 0 ||
84
+ providerResponseEvents(run, "verifier").length > 0 ||
85
+ run.events.some((event) => event.type === "git_evidence_captured" || event.type === "validation_evidence_captured");
86
+ const verifierLaneState = (run, event) => {
87
+ if (!event) {
88
+ return "pending";
89
+ }
90
+ const status = stringField(event.data?.status);
91
+ if (status === "failed") {
92
+ return "failed";
93
+ }
94
+ if (status === "blocked") {
95
+ return "blocked";
96
+ }
97
+ if (run.approvalRequired && run.approvalReason?.startsWith("Verifier returned")) {
98
+ return "needs_revision";
99
+ }
100
+ return "satisfied";
101
+ };
102
+ const providerLaneState = (event) => {
103
+ const status = stringField(event.data?.status);
104
+ if (status === "failed") {
105
+ return "failed";
106
+ }
107
+ if (status === "blocked") {
108
+ return "blocked";
109
+ }
110
+ return "satisfied";
111
+ };
112
+ const providerLaneSourceRefs = (run, event, artifact) => [
113
+ eventSource(run, event),
114
+ ...(artifact ? [artifactSource(run, artifact)] : [])
115
+ ];
116
+ const providerLaneSummary = (event, artifact, fallback) => artifact?.summary ?? event.message ?? fallback;
117
+ const summonEvidence = (run, role) => summonResponseEvents(run, role).slice(-3).map((event) => {
118
+ const artifact = artifactForEvent(run, event);
119
+ return {
120
+ sourceKind: "summon_evidence",
121
+ summary: providerLaneSummary(event, artifact, `Read-only ${role} summon evidence is recorded.`),
122
+ sourceRefs: providerLaneSourceRefs(run, event, artifact),
123
+ artifactRefs: artifact ? [artifact.ref] : [],
124
+ eventRefs: [event.id],
125
+ canSatisfyRequired: false
126
+ };
127
+ });
128
+ const verifierLane = (run) => {
129
+ const event = latestProviderResponseEvent(run, "verifier");
130
+ const sidecarEvidence = summonEvidence(run, "verifier");
131
+ const revisionEvent = latestRevisionPacketEvent(run);
132
+ const revisionAfterVerifier = eventIsAfter(run, revisionEvent, event);
133
+ const revisionArtifact = artifactForEvent(run, revisionEvent);
134
+ if (!event && !implementationReviewRequired(run) && sidecarEvidence.length === 0) {
135
+ return undefined;
136
+ }
137
+ const artifact = artifactForEvent(run, event);
138
+ const latestSummon = latestSummonResponseEvent(run, "verifier");
139
+ const required = implementationReviewRequired(run);
140
+ const owner = roleOwnerFromEvent(run, "verifier", event ?? (!required ? latestSummon : undefined));
141
+ const state = event && !revisionAfterVerifier
142
+ ? verifierLaneState(run, event)
143
+ : latestSummon && sidecarEvidence.length > 0 && !required
144
+ ? providerLaneState(latestSummon)
145
+ : "pending";
146
+ const sourceKind = event && !revisionAfterVerifier
147
+ ? "verifier_response"
148
+ : sidecarEvidence.length > 0 && !required
149
+ ? "summon_evidence"
150
+ : "required_gate";
151
+ return {
152
+ id: "review-lane-verifier",
153
+ label: owner.assignment ? `${owner.label} (${owner.assignment})` : owner.label,
154
+ kind: "reviewer",
155
+ role: "verifier",
156
+ state,
157
+ required,
158
+ sourceKind,
159
+ summary: revisionAfterVerifier
160
+ ? "A revision packet is active; verifier review must run again after the repair."
161
+ : event
162
+ ? providerLaneSummary(event, artifact, "Verifier review is recorded.")
163
+ : sidecarEvidence.length > 0 && !required
164
+ ? "Read-only verifier summon evidence is recorded; it does not replace required verification."
165
+ : "Verifier review is required before implementation work can be accepted.",
166
+ sourceRefs: revisionAfterVerifier && revisionEvent
167
+ ? [eventSource(run, revisionEvent), ...(revisionArtifact ? [artifactSource(run, revisionArtifact)] : [])]
168
+ : event
169
+ ? providerLaneSourceRefs(run, event, artifact)
170
+ : sidecarEvidence.length > 0 && !required
171
+ ? sidecarEvidence.flatMap((evidence) => evidence.sourceRefs)
172
+ : [runSource(run)],
173
+ artifactRefs: revisionAfterVerifier
174
+ ? revisionArtifact ? [revisionArtifact.ref] : []
175
+ : event
176
+ ? artifact ? [artifact.ref] : []
177
+ : sidecarEvidence.flatMap((evidence) => evidence.artifactRefs),
178
+ eventRefs: revisionAfterVerifier && revisionEvent
179
+ ? [revisionEvent.id]
180
+ : event
181
+ ? [event.id]
182
+ : sidecarEvidence.flatMap((evidence) => evidence.eventRefs),
183
+ owner,
184
+ canSatisfyRequired: Boolean(event && !revisionAfterVerifier),
185
+ satisfiesRequired: required && state === "satisfied" && Boolean(event && !revisionAfterVerifier),
186
+ sidecarEvidence
187
+ };
188
+ };
189
+ const criticLane = (run) => {
190
+ const event = latestProviderResponseEvent(run, "critic");
191
+ const sidecarEvidence = summonEvidence(run, "critic");
192
+ if (!event && sidecarEvidence.length === 0) {
193
+ return undefined;
194
+ }
195
+ const artifact = artifactForEvent(run, event);
196
+ const latestSummon = latestSummonResponseEvent(run, "critic");
197
+ const owner = roleOwnerFromEvent(run, "critic", event ?? latestSummon);
198
+ const state = event
199
+ ? providerLaneState(event)
200
+ : latestSummon
201
+ ? providerLaneState(latestSummon)
202
+ : "pending";
203
+ return {
204
+ id: "review-lane-critic",
205
+ label: owner.assignment ? `${owner.label} (${owner.assignment})` : owner.label,
206
+ kind: "critic",
207
+ role: "critic",
208
+ state,
209
+ required: false,
210
+ sourceKind: event ? "critic_response" : "summon_evidence",
211
+ summary: event
212
+ ? providerLaneSummary(event, artifact, "Critic review is recorded.")
213
+ : "Read-only critic summon evidence is recorded.",
214
+ sourceRefs: event
215
+ ? providerLaneSourceRefs(run, event, artifact)
216
+ : sidecarEvidence.flatMap((evidence) => evidence.sourceRefs),
217
+ artifactRefs: event
218
+ ? artifact ? [artifact.ref] : []
219
+ : sidecarEvidence.flatMap((evidence) => evidence.artifactRefs),
220
+ eventRefs: event
221
+ ? [event.id]
222
+ : sidecarEvidence.flatMap((evidence) => evidence.eventRefs),
223
+ owner,
224
+ canSatisfyRequired: false,
225
+ satisfiesRequired: false,
226
+ sidecarEvidence
227
+ };
228
+ };
229
+ const validationArtifacts = (run) => run.artifacts.filter((artifact) => artifact.summary.includes("Validation summary"));
230
+ const validationEvents = (run) => run.events.filter((event) => event.type === "validation_evidence_captured");
231
+ const validationToolEvents = (run) => run.toolEvents.filter((event) => event.tool.startsWith("validation_"));
232
+ const validationFailureCount = (events, toolEvents) => {
233
+ const latestEventData = events.at(-1)?.data;
234
+ const recordedFailureCount = isJsonObject(latestEventData)
235
+ ? numberField(latestEventData.failedCommandCount)
236
+ : undefined;
237
+ return recordedFailureCount ?? toolEvents.filter((event) => event.exitCode !== 0).length;
238
+ };
239
+ const qaLane = (run) => {
240
+ const artifacts = validationArtifacts(run);
241
+ const events = validationEvents(run);
242
+ const toolEvents = validationToolEvents(run);
243
+ const sidecarEvidence = summonEvidence(run, "qa");
244
+ const required = implementationReviewRequired(run);
245
+ const hasValidationEvidence = artifacts.length > 0 || events.length > 0 || toolEvents.length > 0;
246
+ if (!required && !hasValidationEvidence) {
247
+ return undefined;
248
+ }
249
+ const failures = validationFailureCount(events, toolEvents);
250
+ const state = hasValidationEvidence
251
+ ? failures > 0 ? "needs_revision" : "satisfied"
252
+ : "pending";
253
+ const latestArtifact = artifacts.at(-1);
254
+ const latestEvent = events.at(-1);
255
+ const revisionEvent = latestRevisionPacketEvent(run);
256
+ const revisionAfterValidation = eventIsAfter(run, revisionEvent, latestEvent);
257
+ const revisionArtifact = artifactForEvent(run, revisionEvent);
258
+ const latestToolEvents = toolEvents.slice(-3);
259
+ const hasCurrentValidationEvidence = hasValidationEvidence && !revisionAfterValidation;
260
+ const sourceRefs = [
261
+ ...(hasCurrentValidationEvidence && latestArtifact ? [artifactSource(run, latestArtifact)] : []),
262
+ ...(hasCurrentValidationEvidence && latestEvent ? [eventSource(run, latestEvent)] : []),
263
+ ...(hasCurrentValidationEvidence ? latestToolEvents.map((event) => toolSource(run, event)) : []),
264
+ ...(revisionAfterValidation && revisionEvent ? [eventSource(run, revisionEvent)] : []),
265
+ ...(revisionAfterValidation && revisionArtifact ? [artifactSource(run, revisionArtifact)] : []),
266
+ ...(!hasCurrentValidationEvidence ? sidecarEvidence.flatMap((evidence) => evidence.sourceRefs) : [])
267
+ ];
268
+ const executedCount = latestEvent && isJsonObject(latestEvent.data)
269
+ ? numberField(latestEvent.data.executedCommandCount) ?? toolEvents.length
270
+ : toolEvents.length;
271
+ const summary = hasCurrentValidationEvidence
272
+ ? `Runtime validation captured ${executedCount} command(s), ${failures} failed.`
273
+ : revisionAfterValidation
274
+ ? "A revision packet is active; runtime validation must rerun after the repair."
275
+ : sidecarEvidence.length > 0
276
+ ? "Runtime validation evidence is still missing; QA tester sidecar evidence is advisory."
277
+ : "Runtime validation evidence is required for QA ownership.";
278
+ return {
279
+ id: "review-lane-qa",
280
+ label: "Runtime QA / Validation",
281
+ kind: "qa",
282
+ state: hasCurrentValidationEvidence ? state : "pending",
283
+ required,
284
+ sourceKind: hasCurrentValidationEvidence ? "validation_evidence" : "required_gate",
285
+ summary,
286
+ sourceRefs,
287
+ artifactRefs: hasCurrentValidationEvidence
288
+ ? latestArtifact ? [latestArtifact.ref] : []
289
+ : revisionArtifact ? [revisionArtifact.ref] : [],
290
+ eventRefs: [
291
+ ...(hasCurrentValidationEvidence && latestEvent ? [latestEvent.id] : []),
292
+ ...(hasCurrentValidationEvidence ? latestToolEvents.map((event) => event.id) : []),
293
+ ...(revisionAfterValidation && revisionEvent ? [revisionEvent.id] : []),
294
+ ...(!hasCurrentValidationEvidence ? sidecarEvidence.flatMap((evidence) => evidence.eventRefs) : [])
295
+ ],
296
+ owner: runtimeOwner("Runtime QA / Validation"),
297
+ canSatisfyRequired: hasCurrentValidationEvidence,
298
+ satisfiesRequired: required && hasCurrentValidationEvidence && state === "satisfied",
299
+ sidecarEvidence
300
+ };
301
+ };
302
+ const qaTesterLane = (run) => {
303
+ const event = latestProviderResponseEvent(run, "qa");
304
+ const sidecarEvidence = summonEvidence(run, "qa");
305
+ if (!event && sidecarEvidence.length === 0) {
306
+ return undefined;
307
+ }
308
+ const artifact = artifactForEvent(run, event);
309
+ const latestSummon = latestSummonResponseEvent(run, "qa");
310
+ const owner = roleOwnerFromEvent(run, "qa", event ?? latestSummon);
311
+ const state = event
312
+ ? providerLaneState(event)
313
+ : latestSummon
314
+ ? providerLaneState(latestSummon)
315
+ : "pending";
316
+ return {
317
+ id: "review-lane-qa-tester",
318
+ label: owner.assignment ? `${owner.label} (${owner.assignment})` : owner.label,
319
+ kind: "tester",
320
+ role: "qa",
321
+ state,
322
+ required: false,
323
+ sourceKind: event ? "qa_response" : "summon_evidence",
324
+ summary: event
325
+ ? providerLaneSummary(event, artifact, "QA tester response is recorded.")
326
+ : "Read-only QA tester summon evidence is recorded; runtime validation remains the proof.",
327
+ sourceRefs: event
328
+ ? providerLaneSourceRefs(run, event, artifact)
329
+ : sidecarEvidence.flatMap((evidence) => evidence.sourceRefs),
330
+ artifactRefs: event
331
+ ? artifact ? [artifact.ref] : []
332
+ : sidecarEvidence.flatMap((evidence) => evidence.artifactRefs),
333
+ eventRefs: event
334
+ ? [event.id]
335
+ : sidecarEvidence.flatMap((evidence) => evidence.eventRefs),
336
+ owner,
337
+ canSatisfyRequired: false,
338
+ satisfiesRequired: false,
339
+ sidecarEvidence
340
+ };
341
+ };
342
+ export const deriveReviewLanes = (run) => [verifierLane(run), qaLane(run), qaTesterLane(run), criticLane(run)].filter((lane) => Boolean(lane));
343
+ //# sourceMappingURL=reviewLanes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewLanes.js","sourceRoot":"","sources":["../../src/runtime/reviewLanes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { JsonObject, RuntimeRole } from "./types.js";
2
+ export type ReviewRiskTier = "low" | "medium" | "high";
3
+ export type ReviewRoutingAction = "run_qa" | "run_verifier" | "complete" | "ask_user";
4
+ export interface ReviewRoutingInput {
5
+ changedPaths: string[];
6
+ protectedChangeCount: number;
7
+ validationCommandCount: number;
8
+ validationFailureCount: number;
9
+ hasQaAssignment: boolean;
10
+ hasVerifierAssignment: boolean;
11
+ hasQaResponse: boolean;
12
+ hasVerifierResponse: boolean;
13
+ }
14
+ export interface ReviewRoutingDecision {
15
+ schemaVersion: 1;
16
+ kind: "review_routing";
17
+ riskTier: ReviewRiskTier;
18
+ action: ReviewRoutingAction;
19
+ required: {
20
+ validation: true;
21
+ qa: boolean;
22
+ verifier: boolean;
23
+ critic: false;
24
+ };
25
+ skippedRoles: ReviewRoutingSkippedRole[];
26
+ reasons: string[];
27
+ signals: ReviewRoutingSignals;
28
+ policy: {
29
+ qa: "risk_gated";
30
+ verifier: "conservative_required";
31
+ critic: "escalation_only";
32
+ };
33
+ }
34
+ export interface ReviewRoutingSignals {
35
+ changedPathCount: number;
36
+ protectedChangeCount: number;
37
+ validationCommandCount: number;
38
+ validationFailureCount: number;
39
+ hasQaAssignment: boolean;
40
+ hasVerifierAssignment: boolean;
41
+ hasQaResponse: boolean;
42
+ hasVerifierResponse: boolean;
43
+ changedPathClasses: string[];
44
+ }
45
+ export interface ReviewRoutingSkippedRole {
46
+ role: Extract<RuntimeRole, "qa" | "verifier" | "critic">;
47
+ reason: string;
48
+ }
49
+ export declare const decideReviewRouting: (input: ReviewRoutingInput) => ReviewRoutingDecision;
50
+ export declare const reviewRoutingSummary: (decision: ReviewRoutingDecision) => string;
51
+ export declare const reviewRoutingJson: (decision: ReviewRoutingDecision) => JsonObject;
@@ -0,0 +1,152 @@
1
+ const docsPathPatterns = [
2
+ /^README(?:\.[A-Za-z0-9_-]+)?$/i,
3
+ /^CHANGELOG(?:\.[A-Za-z0-9_-]+)?$/i,
4
+ /^CONTRIBUTING(?:\.[A-Za-z0-9_-]+)?$/i,
5
+ /^SECURITY(?:\.[A-Za-z0-9_-]+)?$/i,
6
+ /^LICENSE(?:\.[A-Za-z0-9_-]+)?$/i,
7
+ /^docs\//,
8
+ /\.md$/i,
9
+ /\.mdx$/i,
10
+ /\.txt$/i
11
+ ];
12
+ const highRiskPathPatterns = [
13
+ /^package-lock\.json$/,
14
+ /^pnpm-lock\.yaml$/,
15
+ /^yarn\.lock$/,
16
+ /^bun\.lockb$/,
17
+ /^src\/providers\//,
18
+ /^src\/runtime\/(approvalPolicy|commandSafety|externalTransfer|loop|permissions|protectedPaths|responseContracts|revisionPacket|criticPolicy|validationCommands|types)\.ts$/,
19
+ /^src\/runtime\/(agentRunner|directives|store|runtime|summons|fanout)\.ts$/,
20
+ /^src\/mcp\//,
21
+ /^scripts\/smoke-/,
22
+ /(^|\/)(__snapshots__|fixtures|evals)(\/|$)/,
23
+ /\.(spec|test)\.[A-Za-z0-9]+$/
24
+ ];
25
+ const mediumRiskPathPatterns = [
26
+ /^package\.json$/,
27
+ /^src\/cli\//,
28
+ /^src\/tui\//,
29
+ /^src\/runtime\//,
30
+ /^scripts\//,
31
+ /^docs\/(CLI_SPEC|MCP_SPEC|PROVIDER_ADAPTERS|PROMPT_SCHEMAS|MEMORY_AND_RECONCILIATION)\.md$/
32
+ ];
33
+ const matchesAny = (path, patterns) => patterns.some((pattern) => pattern.test(path));
34
+ const pathClass = (path) => {
35
+ if (matchesAny(path, highRiskPathPatterns)) {
36
+ return "high";
37
+ }
38
+ if (matchesAny(path, mediumRiskPathPatterns)) {
39
+ return "medium";
40
+ }
41
+ if (matchesAny(path, docsPathPatterns)) {
42
+ return "docs";
43
+ }
44
+ return "unknown";
45
+ };
46
+ const unique = (values) => Array.from(new Set(values));
47
+ const allChangedPathsAreDocs = (changedPaths) => changedPaths.length > 0 && changedPaths.every((path) => pathClass(path) === "docs");
48
+ const riskTier = (input, classes) => {
49
+ const reasons = [];
50
+ if (input.protectedChangeCount > 0) {
51
+ reasons.push("protected test, fixture, snapshot, or eval path changed");
52
+ }
53
+ if (input.validationFailureCount > 0) {
54
+ reasons.push("deterministic validation captured failing command evidence");
55
+ }
56
+ if (classes.includes("high")) {
57
+ reasons.push("high-risk runtime, provider, policy, MCP, validation, or test path changed");
58
+ }
59
+ if (reasons.length > 0) {
60
+ return {
61
+ tier: "high",
62
+ reasons
63
+ };
64
+ }
65
+ if (allChangedPathsAreDocs(input.changedPaths)) {
66
+ return {
67
+ tier: "low",
68
+ reasons: ["all changed paths are docs, copy, or text surfaces"]
69
+ };
70
+ }
71
+ if (input.changedPaths.length === 0) {
72
+ return {
73
+ tier: "medium",
74
+ reasons: ["no changed paths were captured; semantic acceptance still needs independent review"]
75
+ };
76
+ }
77
+ return {
78
+ tier: "medium",
79
+ reasons: classes.includes("medium")
80
+ ? ["behavior, CLI/TUI, docs-spec, script, or runtime-adjacent path changed"]
81
+ : ["changed paths are not docs-only and need standard review routing"]
82
+ };
83
+ };
84
+ const skippedRoles = (input, requiredQa, requiredVerifier) => [
85
+ ...(!input.hasQaAssignment
86
+ ? [{ role: "qa", reason: "QA role is not assigned for this run." }]
87
+ : input.hasQaResponse
88
+ ? [{ role: "qa", reason: "QA already responded after the latest implementer pass." }]
89
+ : !requiredQa
90
+ ? [{ role: "qa", reason: "Risk-gated policy does not require model QA for low-risk docs/copy changes." }]
91
+ : []),
92
+ ...(!input.hasVerifierAssignment
93
+ ? [{ role: "verifier", reason: "Verifier role is not assigned for this run." }]
94
+ : input.hasVerifierResponse
95
+ ? [{ role: "verifier", reason: "Verifier already responded after the latest implementer pass." }]
96
+ : !requiredVerifier
97
+ ? [{ role: "verifier", reason: "Verifier is not required by this routing decision." }]
98
+ : []),
99
+ { role: "critic", reason: "Critic is escalation-only and is triggered by critic policy after QA/verifier evidence." }
100
+ ];
101
+ export const decideReviewRouting = (input) => {
102
+ const changedPathClasses = unique(input.changedPaths.map(pathClass));
103
+ const risk = riskTier(input, changedPathClasses);
104
+ const qaRequiredByRisk = risk.tier !== "low";
105
+ const requiredQa = input.hasQaAssignment && qaRequiredByRisk;
106
+ const requiredVerifier = input.hasVerifierAssignment;
107
+ const action = requiredQa && !input.hasQaResponse
108
+ ? "run_qa"
109
+ : requiredVerifier && !input.hasVerifierResponse
110
+ ? "run_verifier"
111
+ : input.hasVerifierAssignment
112
+ ? "complete"
113
+ : "ask_user";
114
+ return {
115
+ schemaVersion: 1,
116
+ kind: "review_routing",
117
+ riskTier: risk.tier,
118
+ action,
119
+ required: {
120
+ validation: true,
121
+ qa: requiredQa,
122
+ verifier: requiredVerifier,
123
+ critic: false
124
+ },
125
+ skippedRoles: skippedRoles(input, requiredQa, requiredVerifier),
126
+ reasons: [
127
+ ...risk.reasons,
128
+ "deterministic validation is always required before subjective review routing",
129
+ "verifier remains required in this conservative routing slice",
130
+ "critic remains escalation-only and cannot satisfy validation or verifier gates"
131
+ ],
132
+ signals: {
133
+ changedPathCount: input.changedPaths.length,
134
+ protectedChangeCount: input.protectedChangeCount,
135
+ validationCommandCount: input.validationCommandCount,
136
+ validationFailureCount: input.validationFailureCount,
137
+ hasQaAssignment: input.hasQaAssignment,
138
+ hasVerifierAssignment: input.hasVerifierAssignment,
139
+ hasQaResponse: input.hasQaResponse,
140
+ hasVerifierResponse: input.hasVerifierResponse,
141
+ changedPathClasses
142
+ },
143
+ policy: {
144
+ qa: "risk_gated",
145
+ verifier: "conservative_required",
146
+ critic: "escalation_only"
147
+ }
148
+ };
149
+ };
150
+ export const reviewRoutingSummary = (decision) => `Review routing: ${decision.riskTier} risk -> ${decision.action}.`;
151
+ export const reviewRoutingJson = (decision) => decision;
152
+ //# sourceMappingURL=reviewRouting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reviewRouting.js","sourceRoot":"","sources":["../../src/runtime/reviewRouting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { AgentResponse } from "../providers/types.js";
2
+ import type { RunArtifact, RunRecord, RuntimeRole } from "./types.js";
3
+ export type RevisionPacketSourceRole = Extract<RuntimeRole, "qa" | "verifier" | "critic">;
4
+ export type RevisionPacketReasonCode = "qa_needs_revision" | "verifier_revise" | "critic_needs_revision" | "critic_blocking_concerns";
5
+ export interface RevisionPacketDecision {
6
+ shouldRevise: boolean;
7
+ sourceRole?: RevisionPacketSourceRole;
8
+ reasonCode?: RevisionPacketReasonCode;
9
+ reason?: string;
10
+ repairObjective?: string;
11
+ acceptanceCriteria: string[];
12
+ }
13
+ export interface RevisionPacket {
14
+ schemaVersion: 1;
15
+ kind: "revision_packet";
16
+ runId: string;
17
+ createdAt: string;
18
+ sourceRole: RevisionPacketSourceRole;
19
+ reasonCode: RevisionPacketReasonCode;
20
+ reason: string;
21
+ repairObjective: string;
22
+ acceptanceCriteria: string[];
23
+ evidenceRefs: string[];
24
+ sourceResponseRef?: string;
25
+ criticTriggerRef?: string;
26
+ }
27
+ export interface WriteRevisionPacketInput {
28
+ decision: RevisionPacketDecision;
29
+ evidenceRefs: string[];
30
+ sourceResponseRef?: string;
31
+ criticTriggerRef?: string;
32
+ }
33
+ export declare const decideRevisionPacket: (sourceRole: RevisionPacketSourceRole, response: AgentResponse) => RevisionPacketDecision;
34
+ export declare const buildRevisionPacket: (run: RunRecord, input: WriteRevisionPacketInput) => RevisionPacket;
35
+ export declare const writeRevisionPacketArtifact: (run: RunRecord, input: WriteRevisionPacketInput) => Promise<{
36
+ artifact: RunArtifact;
37
+ packet: RevisionPacket;
38
+ }>;