audit-tools 0.32.19 → 0.32.22

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 (202) hide show
  1. package/dist/audit/clarification/blastRadius.d.ts +23 -0
  2. package/dist/audit/clarification/blastRadius.d.ts.map +1 -0
  3. package/dist/audit/clarification/blastRadius.js +65 -0
  4. package/dist/audit/clarification/blastRadius.js.map +1 -0
  5. package/dist/audit/clarification/dials.d.ts +28 -0
  6. package/dist/audit/clarification/dials.d.ts.map +1 -0
  7. package/dist/audit/clarification/dials.js +37 -0
  8. package/dist/audit/clarification/dials.js.map +1 -0
  9. package/dist/audit/clarification/partition.d.ts +25 -0
  10. package/dist/audit/clarification/partition.d.ts.map +1 -0
  11. package/dist/audit/clarification/partition.js +77 -0
  12. package/dist/audit/clarification/partition.js.map +1 -0
  13. package/dist/audit/clarification/riskGate.d.ts +24 -0
  14. package/dist/audit/clarification/riskGate.d.ts.map +1 -0
  15. package/dist/audit/clarification/riskGate.js +38 -0
  16. package/dist/audit/clarification/riskGate.js.map +1 -0
  17. package/dist/audit/clarification/voiQueue.d.ts +17 -0
  18. package/dist/audit/clarification/voiQueue.d.ts.map +1 -0
  19. package/dist/audit/clarification/voiQueue.js +37 -0
  20. package/dist/audit/clarification/voiQueue.js.map +1 -0
  21. package/dist/audit/cli/auditStep.d.ts +2 -0
  22. package/dist/audit/cli/auditStep.d.ts.map +1 -1
  23. package/dist/audit/cli/auditStep.js +9 -1
  24. package/dist/audit/cli/auditStep.js.map +1 -1
  25. package/dist/audit/cli/charterClarificationPrompt.d.ts +19 -0
  26. package/dist/audit/cli/charterClarificationPrompt.d.ts.map +1 -0
  27. package/dist/audit/cli/charterClarificationPrompt.js +60 -0
  28. package/dist/audit/cli/charterClarificationPrompt.js.map +1 -0
  29. package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
  30. package/dist/audit/cli/nextStepCommand.js +74 -0
  31. package/dist/audit/cli/nextStepCommand.js.map +1 -1
  32. package/dist/audit/cli/nextStepHelpers.d.ts +62 -0
  33. package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
  34. package/dist/audit/cli/nextStepHelpers.js +129 -0
  35. package/dist/audit/cli/nextStepHelpers.js.map +1 -1
  36. package/dist/audit/cli/steps.d.ts +4 -4
  37. package/dist/audit/cli/steps.d.ts.map +1 -1
  38. package/dist/audit/cli/steps.js +2 -0
  39. package/dist/audit/cli/steps.js.map +1 -1
  40. package/dist/audit/io/artifacts.d.ts +6 -0
  41. package/dist/audit/io/artifacts.d.ts.map +1 -1
  42. package/dist/audit/io/artifacts.js +2 -0
  43. package/dist/audit/io/artifacts.js.map +1 -1
  44. package/dist/audit/orchestrator/advance.d.ts +23 -0
  45. package/dist/audit/orchestrator/advance.d.ts.map +1 -1
  46. package/dist/audit/orchestrator/advance.js +122 -4
  47. package/dist/audit/orchestrator/advance.js.map +1 -1
  48. package/dist/audit/orchestrator/advanceTypes.d.ts +22 -1
  49. package/dist/audit/orchestrator/advanceTypes.d.ts.map +1 -1
  50. package/dist/audit/orchestrator/charterClarificationExecutor.d.ts +28 -0
  51. package/dist/audit/orchestrator/charterClarificationExecutor.d.ts.map +1 -0
  52. package/dist/audit/orchestrator/charterClarificationExecutor.js +130 -0
  53. package/dist/audit/orchestrator/charterClarificationExecutor.js.map +1 -0
  54. package/dist/audit/orchestrator/dependencyMap.d.ts +2 -0
  55. package/dist/audit/orchestrator/dependencyMap.d.ts.map +1 -1
  56. package/dist/audit/orchestrator/dependencyMap.js +24 -0
  57. package/dist/audit/orchestrator/dependencyMap.js.map +1 -1
  58. package/dist/audit/orchestrator/designReviewPrompt.d.ts +17 -0
  59. package/dist/audit/orchestrator/designReviewPrompt.d.ts.map +1 -1
  60. package/dist/audit/orchestrator/designReviewPrompt.js +50 -0
  61. package/dist/audit/orchestrator/designReviewPrompt.js.map +1 -1
  62. package/dist/audit/orchestrator/executorRunners.d.ts.map +1 -1
  63. package/dist/audit/orchestrator/executorRunners.js +4 -0
  64. package/dist/audit/orchestrator/executorRunners.js.map +1 -1
  65. package/dist/audit/orchestrator/executors.d.ts.map +1 -1
  66. package/dist/audit/orchestrator/executors.js +20 -0
  67. package/dist/audit/orchestrator/executors.js.map +1 -1
  68. package/dist/audit/orchestrator/nextStep.d.ts +11 -1
  69. package/dist/audit/orchestrator/nextStep.d.ts.map +1 -1
  70. package/dist/audit/orchestrator/nextStep.js +6 -2
  71. package/dist/audit/orchestrator/nextStep.js.map +1 -1
  72. package/dist/audit/orchestrator/staleness.d.ts +27 -1
  73. package/dist/audit/orchestrator/staleness.d.ts.map +1 -1
  74. package/dist/audit/orchestrator/staleness.js +33 -16
  75. package/dist/audit/orchestrator/staleness.js.map +1 -1
  76. package/dist/audit/orchestrator/state.d.ts +12 -1
  77. package/dist/audit/orchestrator/state.d.ts.map +1 -1
  78. package/dist/audit/orchestrator/state.js +41 -2
  79. package/dist/audit/orchestrator/state.js.map +1 -1
  80. package/dist/audit/orchestrator/synthesisExecutors.d.ts.map +1 -1
  81. package/dist/audit/orchestrator/synthesisExecutors.js +1 -0
  82. package/dist/audit/orchestrator/synthesisExecutors.js.map +1 -1
  83. package/dist/audit/orchestrator/systemicChallengeExecutor.d.ts +25 -0
  84. package/dist/audit/orchestrator/systemicChallengeExecutor.d.ts.map +1 -0
  85. package/dist/audit/orchestrator/systemicChallengeExecutor.js +107 -0
  86. package/dist/audit/orchestrator/systemicChallengeExecutor.js.map +1 -0
  87. package/dist/audit/reporting/mergeFindings.d.ts +2 -1
  88. package/dist/audit/reporting/mergeFindings.d.ts.map +1 -1
  89. package/dist/audit/reporting/mergeFindings.js +6 -1
  90. package/dist/audit/reporting/mergeFindings.js.map +1 -1
  91. package/dist/audit/reporting/synthesis.d.ts +2 -0
  92. package/dist/audit/reporting/synthesis.d.ts.map +1 -1
  93. package/dist/audit/reporting/synthesis.js +1 -1
  94. package/dist/audit/reporting/synthesis.js.map +1 -1
  95. package/dist/audit/systemic/aggregateMetricsDigest.d.ts +11 -0
  96. package/dist/audit/systemic/aggregateMetricsDigest.d.ts.map +1 -0
  97. package/dist/audit/systemic/aggregateMetricsDigest.js +84 -0
  98. package/dist/audit/systemic/aggregateMetricsDigest.js.map +1 -0
  99. package/dist/audit/systemic/metricsDigestTypes.d.ts +35 -0
  100. package/dist/audit/systemic/metricsDigestTypes.d.ts.map +1 -0
  101. package/dist/audit/systemic/metricsDigestTypes.js +10 -0
  102. package/dist/audit/systemic/metricsDigestTypes.js.map +1 -0
  103. package/dist/audit/systemic/secondOrderAdversaryPrompt.d.ts +16 -0
  104. package/dist/audit/systemic/secondOrderAdversaryPrompt.d.ts.map +1 -0
  105. package/dist/audit/systemic/secondOrderAdversaryPrompt.js +85 -0
  106. package/dist/audit/systemic/secondOrderAdversaryPrompt.js.map +1 -0
  107. package/dist/audit/systemic/systemicChallengeLoop.d.ts +48 -0
  108. package/dist/audit/systemic/systemicChallengeLoop.d.ts.map +1 -0
  109. package/dist/audit/systemic/systemicChallengeLoop.js +107 -0
  110. package/dist/audit/systemic/systemicChallengeLoop.js.map +1 -0
  111. package/dist/audit/types/charterClarification.d.ts +52 -0
  112. package/dist/audit/types/charterClarification.d.ts.map +1 -0
  113. package/dist/audit/types/charterClarification.js +2 -0
  114. package/dist/audit/types/charterClarification.js.map +1 -0
  115. package/dist/audit/types/systemicChallenge.d.ts +69 -0
  116. package/dist/audit/types/systemicChallenge.d.ts.map +1 -0
  117. package/dist/audit/types/systemicChallenge.js +2 -0
  118. package/dist/audit/types/systemicChallenge.js.map +1 -0
  119. package/dist/remediate/phases/triage.d.ts.map +1 -1
  120. package/dist/remediate/phases/triage.js +16 -1
  121. package/dist/remediate/phases/triage.js.map +1 -1
  122. package/dist/remediate/steps/dispatch/acceptNode.d.ts +178 -0
  123. package/dist/remediate/steps/dispatch/acceptNode.d.ts.map +1 -0
  124. package/dist/remediate/steps/dispatch/acceptNode.js +351 -0
  125. package/dist/remediate/steps/dispatch/acceptNode.js.map +1 -0
  126. package/dist/remediate/steps/dispatch/common.d.ts +123 -0
  127. package/dist/remediate/steps/dispatch/common.d.ts.map +1 -0
  128. package/dist/remediate/steps/dispatch/common.js +236 -0
  129. package/dist/remediate/steps/dispatch/common.js.map +1 -0
  130. package/dist/remediate/steps/dispatch/dagNodeFields.d.ts +37 -0
  131. package/dist/remediate/steps/dispatch/dagNodeFields.d.ts.map +1 -0
  132. package/dist/remediate/steps/dispatch/dagNodeFields.js +19 -0
  133. package/dist/remediate/steps/dispatch/dagNodeFields.js.map +1 -0
  134. package/dist/remediate/steps/dispatch/implementPrompt.d.ts +70 -0
  135. package/dist/remediate/steps/dispatch/implementPrompt.d.ts.map +1 -0
  136. package/dist/remediate/steps/dispatch/implementPrompt.js +577 -0
  137. package/dist/remediate/steps/dispatch/implementPrompt.js.map +1 -0
  138. package/dist/remediate/steps/dispatch/marshal.d.ts +32 -0
  139. package/dist/remediate/steps/dispatch/marshal.d.ts.map +1 -0
  140. package/dist/remediate/steps/dispatch/marshal.js +935 -0
  141. package/dist/remediate/steps/dispatch/marshal.js.map +1 -0
  142. package/dist/remediate/steps/dispatch/verifyCommands.d.ts +97 -0
  143. package/dist/remediate/steps/dispatch/verifyCommands.d.ts.map +1 -0
  144. package/dist/remediate/steps/dispatch/verifyCommands.js +204 -0
  145. package/dist/remediate/steps/dispatch/verifyCommands.js.map +1 -0
  146. package/dist/remediate/steps/dispatch/waveScheduling.d.ts +90 -0
  147. package/dist/remediate/steps/dispatch/waveScheduling.d.ts.map +1 -0
  148. package/dist/remediate/steps/dispatch/waveScheduling.js +352 -0
  149. package/dist/remediate/steps/dispatch/waveScheduling.js.map +1 -0
  150. package/dist/remediate/steps/dispatch/worktreeLifecycle.d.ts +189 -0
  151. package/dist/remediate/steps/dispatch/worktreeLifecycle.d.ts.map +1 -0
  152. package/dist/remediate/steps/dispatch/worktreeLifecycle.js +643 -0
  153. package/dist/remediate/steps/dispatch/worktreeLifecycle.js.map +1 -0
  154. package/dist/remediate/steps/dispatch/writeScope.d.ts +151 -0
  155. package/dist/remediate/steps/dispatch/writeScope.d.ts.map +1 -0
  156. package/dist/remediate/steps/dispatch/writeScope.js +376 -0
  157. package/dist/remediate/steps/dispatch/writeScope.js.map +1 -0
  158. package/dist/remediate/steps/dispatch.d.ts +16 -863
  159. package/dist/remediate/steps/dispatch.d.ts.map +1 -1
  160. package/dist/remediate/steps/dispatch.js +18 -3613
  161. package/dist/remediate/steps/dispatch.js.map +1 -1
  162. package/dist/shared/decompose/charterClarification.d.ts +80 -0
  163. package/dist/shared/decompose/charterClarification.d.ts.map +1 -0
  164. package/dist/shared/decompose/charterClarification.js +105 -0
  165. package/dist/shared/decompose/charterClarification.js.map +1 -0
  166. package/dist/shared/decompose/systemicChallenge.d.ts +326 -0
  167. package/dist/shared/decompose/systemicChallenge.d.ts.map +1 -0
  168. package/dist/shared/decompose/systemicChallenge.js +30 -0
  169. package/dist/shared/decompose/systemicChallenge.js.map +1 -0
  170. package/dist/shared/index.d.ts +10 -5
  171. package/dist/shared/index.d.ts.map +1 -1
  172. package/dist/shared/index.js +6 -4
  173. package/dist/shared/index.js.map +1 -1
  174. package/dist/shared/opencodePermissions.d.ts +73 -0
  175. package/dist/shared/opencodePermissions.d.ts.map +1 -1
  176. package/dist/shared/opencodePermissions.js +172 -0
  177. package/dist/shared/opencodePermissions.js.map +1 -1
  178. package/dist/shared/tooling/exec.d.ts +10 -1
  179. package/dist/shared/tooling/exec.d.ts.map +1 -1
  180. package/dist/shared/tooling/exec.js +13 -1
  181. package/dist/shared/tooling/exec.js.map +1 -1
  182. package/dist/shared/types/charter.d.ts +89 -0
  183. package/dist/shared/types/charter.d.ts.map +1 -1
  184. package/dist/shared/types/charter.js +68 -0
  185. package/dist/shared/types/charter.js.map +1 -1
  186. package/dist/shared/types/intentCheckpoint.d.ts +15 -0
  187. package/dist/shared/types/intentCheckpoint.d.ts.map +1 -1
  188. package/dist/shared/types/intentCheckpoint.js +11 -0
  189. package/dist/shared/types/intentCheckpoint.js.map +1 -1
  190. package/dist/shared/validation/charterGate.d.ts +20 -1
  191. package/dist/shared/validation/charterGate.d.ts.map +1 -1
  192. package/dist/shared/validation/charterGate.js +23 -0
  193. package/dist/shared/validation/charterGate.js.map +1 -1
  194. package/docs/audit-pkg/contracts.md +1 -1
  195. package/docs/audit-pkg/development.md +8 -7
  196. package/docs/audit-pkg/product.md +7 -4
  197. package/docs/audit-pkg/release.md +4 -2
  198. package/opencode.json +36 -20
  199. package/package.json +1 -1
  200. package/scripts/postinstall.mjs +2 -1
  201. package/wrapper/audit-code-wrapper-opencode.mjs +38 -12
  202. package/wrapper/remediate-code-wrapper-opencode.mjs +38 -12
@@ -132,6 +132,17 @@ export const IntentCheckpointSchema = z
132
132
  goal_graph: GoalGraphSchema.optional(),
133
133
  charters: z.array(CharterSchema).optional(),
134
134
  ceiling: CeilingSchema.optional(),
135
+ /**
136
+ * The ATTENTION dial (Phase D control surface, currency #3) — how much the
137
+ * user will converse to align the charters: how many VOI-ranked
138
+ * charter-clarification questions they answer this round. `0` is the
139
+ * autonomous mode (every charter-delta becomes a written finding, nothing
140
+ * interactive); a finite N takes the top-N of the VOI queue; `"all"` takes
141
+ * every interactive question. Attended and unattended are two settings of
142
+ * ONE dial, not a forked path. Optional + additive; defaults to `0`
143
+ * (conversation-first: no human loop unless the user opts in).
144
+ */
145
+ attention: z.union([z.number().int().min(0), z.literal("all")]).optional(),
135
146
  })
136
147
  .strict()
137
148
  .optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"intentCheckpoint.js","sourceRoot":"","sources":["../../../src/shared/types/intentCheckpoint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"intentCheckpoint.js","sourceRoot":"","sources":["../../../src/shared/types/intentCheckpoint.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Charter, CharterDelta } from "../types/charter.js";
1
+ import type { Charter, CharterDelta, CharterClarificationRequest } from "../types/charter.js";
2
2
  /**
3
3
  * The True-charter gate: a `true` charter is nominatable-never-assertable and
4
4
  * falsifiable-or-drop. It survives ONLY if it names BOTH a concrete alternative and
@@ -35,4 +35,23 @@ export declare function charterReviewDisposition(charter: Charter): "opine" | "f
35
35
  * of those kinds; a low-confidence charter of a referenced kind trips the downgrade.
36
36
  */
37
37
  export declare function gateCharterDelta(delta: CharterDelta, charters: Charter[]): CharterDelta;
38
+ /**
39
+ * The blast-radius RISK GATE (Phase D; design §"Blast radius — the ranking and the
40
+ * risk gate"). Blast radius is simultaneously priority (high-blast = high-value)
41
+ * AND risk: acting on a WRONG high-blast finding is catastrophic, so it must clear
42
+ * a MUCH higher bar of independent adversarial refutation before it is actionable.
43
+ * This gate is the deterministic side of that bar: a question whose blast radius is
44
+ * at/above `highBlastThreshold` may only reach the interactive human channel if it
45
+ * has cleared `requiredRefutations` rounds of independent refutation; otherwise it
46
+ * is downgraded to `finding_only` (written as a lead, never asked interactively).
47
+ * Below the threshold, a question is interactive without the extra bar.
48
+ *
49
+ * Pure + deterministic: same request + same observed refutation count always
50
+ * yields the same disposition. `observedRefutations` is supplied by the caller (the
51
+ * intensity dial's adversarial rounds); the gate never runs the refutation itself.
52
+ */
53
+ export declare function riskGateClarification(request: CharterClarificationRequest, observedRefutations: number, opts: {
54
+ highBlastThreshold: number;
55
+ requiredRefutations: number;
56
+ }): CharterClarificationRequest["disposition"];
38
57
  //# sourceMappingURL=charterGate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"charterGate.d.ts","sourceRoot":"","sources":["../../../src/shared/validation/charterGate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEjE;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG;IACzD,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD,CA0BA;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,GACf,OAAO,GAAG,gBAAgB,CAE5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,OAAO,EAAE,GAClB,YAAY,CAWd"}
1
+ {"version":3,"file":"charterGate.d.ts","sourceRoot":"","sources":["../../../src/shared/validation/charterGate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,2BAA2B,EAC5B,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG;IACzD,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD,CA0BA;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,GACf,OAAO,GAAG,gBAAgB,CAE5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,OAAO,EAAE,GAClB,YAAY,CAWd;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,2BAA2B,EACpC,mBAAmB,EAAE,MAAM,EAC3B,IAAI,EAAE;IAAE,kBAAkB,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,GAChE,2BAA2B,CAAC,aAAa,CAAC,CAM5C"}
@@ -70,4 +70,27 @@ export function gateCharterDelta(delta, charters) {
70
70
  }
71
71
  return delta;
72
72
  }
73
+ /**
74
+ * The blast-radius RISK GATE (Phase D; design §"Blast radius — the ranking and the
75
+ * risk gate"). Blast radius is simultaneously priority (high-blast = high-value)
76
+ * AND risk: acting on a WRONG high-blast finding is catastrophic, so it must clear
77
+ * a MUCH higher bar of independent adversarial refutation before it is actionable.
78
+ * This gate is the deterministic side of that bar: a question whose blast radius is
79
+ * at/above `highBlastThreshold` may only reach the interactive human channel if it
80
+ * has cleared `requiredRefutations` rounds of independent refutation; otherwise it
81
+ * is downgraded to `finding_only` (written as a lead, never asked interactively).
82
+ * Below the threshold, a question is interactive without the extra bar.
83
+ *
84
+ * Pure + deterministic: same request + same observed refutation count always
85
+ * yields the same disposition. `observedRefutations` is supplied by the caller (the
86
+ * intensity dial's adversarial rounds); the gate never runs the refutation itself.
87
+ */
88
+ export function riskGateClarification(request, observedRefutations, opts) {
89
+ const isHighBlast = request.value.blast_radius >= opts.highBlastThreshold;
90
+ if (!isHighBlast)
91
+ return "interactive";
92
+ return observedRefutations >= opts.requiredRefutations
93
+ ? "interactive"
94
+ : "finding_only";
95
+ }
73
96
  //# sourceMappingURL=charterGate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"charterGate.js","sourceRoot":"","sources":["../../../src/shared/validation/charterGate.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mFAAmF;AACnF,mFAAmF;AACnF,oFAAoF;AACpF,gFAAgF;AAIhF;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAmB;IAItD,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAkD,EAAE,CAAC;IAClE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QACD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG;gBACd,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,uBAAuB;gBAC/C,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB;aAClC;iBACE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;iBACtC,IAAI,CAAC,KAAK,CAAC,CAAC;YACf,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,MAAM,EAAE,6CAA6C,OAAO,yDAAyD;aACtH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAgB;IAEhB,OAAO,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;AACnE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAmB,EACnB,QAAmB;IAEnB,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CACpC,CAAC,OAAO,EAAE,EAAE,CACV,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,wBAAwB,CAAC,OAAO,CAAC,KAAK,gBAAgB,CACzD,CAAC;IACF,IAAI,gBAAgB,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACpD,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"charterGate.js","sourceRoot":"","sources":["../../../src/shared/validation/charterGate.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mFAAmF;AACnF,mFAAmF;AACnF,oFAAoF;AACpF,gFAAgF;AAQhF;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAmB;IAItD,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAkD,EAAE,CAAC;IAClE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QACD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG;gBACd,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,uBAAuB;gBAC/C,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB;aAClC;iBACE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;iBACtC,IAAI,CAAC,KAAK,CAAC,CAAC;YACf,OAAO,CAAC,IAAI,CAAC;gBACX,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,MAAM,EAAE,6CAA6C,OAAO,yDAAyD;aACtH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAAgB;IAEhB,OAAO,OAAO,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;AACnE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAmB,EACnB,QAAmB;IAEnB,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CACpC,CAAC,OAAO,EAAE,EAAE,CACV,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,wBAAwB,CAAC,OAAO,CAAC,KAAK,gBAAgB,CACzD,CAAC;IACF,IAAI,gBAAgB,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACpD,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAoC,EACpC,mBAA2B,EAC3B,IAAiE;IAEjE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,kBAAkB,CAAC;IAC1E,IAAI,CAAC,WAAW;QAAE,OAAO,aAAa,CAAC;IACvC,OAAO,mBAAmB,IAAI,IAAI,CAAC,mBAAmB;QACpD,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,cAAc,CAAC;AACrB,CAAC"}
@@ -57,7 +57,7 @@ audit-code validate-results --results /path/to/results.json
57
57
  ## Artifact bundle
58
58
 
59
59
  The backend stores resumable artifacts under `.audit-tools/audit/`. A
60
- non-exhaustive sample; the complete registry-backed list (all 32 entries) lives
60
+ non-exhaustive sample; the complete registry-backed list lives
61
61
  in [`spec/audit/artifact-contract.md`](../../spec/audit/artifact-contract.md):
62
62
 
63
63
  - `repo_manifest.json`
@@ -40,13 +40,14 @@ workflow semantics.
40
40
 
41
41
  The system separates deterministic extraction from bounded LLM judgment:
42
42
 
43
- 1. intake and file disposition
44
- 2. surface, flow, graph, unit, risk, and coverage artifacts
45
- 3. audit task planning
46
- 4. review packet construction
47
- 5. semantic review through the active conversation or fallback provider bridge
48
- 6. result ingestion, selective deepening, runtime validation, and synthesis
49
- 7. final `audit-report.md`
43
+ 1. a one-time provider-confirmation gate (discover, cost-order, and confirm the provider pool)
44
+ 2. intake and file disposition
45
+ 3. surface, flow, graph, unit, risk, and coverage artifacts
46
+ 4. audit task planning
47
+ 5. review packet construction
48
+ 6. semantic review through the active conversation or fallback provider bridge
49
+ 7. result ingestion, selective deepening, runtime validation, and synthesis
50
+ 8. final `audit-report.md`
50
51
 
51
52
  Portability rules:
52
53
 
@@ -38,12 +38,15 @@ The intended workflow is:
38
38
 
39
39
  1. The user invokes `/audit-code`.
40
40
  2. The prompt runs `audit-code ensure --quiet`.
41
- 3. Deterministic backend steps build or refresh artifacts.
42
- 4. The active conversation dispatches bounded review packets when semantic
41
+ 3. The conversation confirms (or accepts by default) the discovered provider
42
+ pool and cost ordering (`provider_confirmation`) the pipeline's first
43
+ gated step.
44
+ 4. Deterministic backend steps build or refresh artifacts.
45
+ 5. The active conversation dispatches bounded review packets when semantic
43
46
  judgment is required.
44
- 5. Packet workers submit validated `AuditResult` objects through backend-owned
47
+ 6. Packet workers submit validated `AuditResult` objects through backend-owned
45
48
  commands.
46
- 6. The backend ingests results, performs selective deepening and runtime
49
+ 7. The backend ingests results, performs selective deepening and runtime
47
50
  validation when needed, and writes the final `audit-report.md`.
48
51
 
49
52
  Semantic review belongs to the active host conversation by default. Backend
@@ -42,11 +42,13 @@ Workflow:
42
42
  .github/workflows/publish-package.yml
43
43
  ```
44
44
 
45
- The workflow:
45
+ The release gate is split into two parallel jobs — `gate` (`npm run verify:checks`) and `test` (the
46
+ vitest suite, sharded 4 ways) — so publish latency is bounded by the slowest gate job rather than their
47
+ sum. The `publish` job needs both, then:
46
48
 
47
49
  - requests `id-token: write` for npm OIDC exchange
48
50
  - pins the Node and npm versions declared in `.github/workflows/publish-package.yml`
49
- - runs `npm run verify:release`
51
+ - rebuilds `dist/` for packing (the `gate`/`test` jobs already ran the full verify chain)
50
52
  - previews the packed tarball with `npm pack --dry-run`
51
53
  - publishes with public access and provenance
52
54
  - defaults semver prerelease versions to the `next` dist-tag unless overridden
package/opencode.json CHANGED
@@ -25,37 +25,53 @@
25
25
  },
26
26
  "bash": {
27
27
  "*": "allow",
28
- "audit-code synthesize*": "deny",
29
- "*dist*index.js* synthesize*": "deny",
30
- "*audit-code.mjs* synthesize*": "deny",
31
- "audit-code cleanup*": "deny",
32
- "*dist*index.js* cleanup*": "deny",
28
+ "*audit-code.mjs": "allow",
33
29
  "*audit-code.mjs* cleanup*": "deny",
34
- "audit-code requeue*": "deny",
35
- "*dist*index.js* requeue*": "deny",
30
+ "*audit-code.mjs* ensure*": "allow",
31
+ "*audit-code.mjs* ingest-results*": "deny",
32
+ "*audit-code.mjs* merge-and-ingest*": "allow",
33
+ "*audit-code.mjs* next-step*": "allow",
34
+ "*audit-code.mjs* prepare-dispatch*": "allow",
36
35
  "*audit-code.mjs* requeue*": "deny",
37
- "audit-code ingest-results*": "deny",
36
+ "*audit-code.mjs* submit-packet*": "allow",
37
+ "*audit-code.mjs* synthesize*": "deny",
38
+ "*audit-code.mjs* validate*": "allow",
39
+ "*audit-code.mjs* worker-run*": "allow",
40
+ "*dist*index.js* cleanup*": "deny",
38
41
  "*dist*index.js* ingest-results*": "deny",
39
- "*audit-code.mjs* ingest-results*": "deny",
42
+ "*dist*index.js* requeue*": "deny",
43
+ "*dist*index.js* synthesize*": "deny",
44
+ "*remediate-code.mjs": "allow",
45
+ "*remediate-code.mjs* ensure*": "allow",
46
+ "*remediate-code.mjs* merge-document-results*": "allow",
47
+ "*remediate-code.mjs* merge-implement-results*": "allow",
48
+ "*remediate-code.mjs* next-step*": "allow",
49
+ "*remediate-code.mjs* prepare-document-dispatch*": "allow",
50
+ "*remediate-code.mjs* prepare-implement-dispatch*": "allow",
51
+ "*remediate-code.mjs* validate-artifacts*": "allow",
52
+ "Select-String *": "allow",
40
53
  "audit-code": "allow",
54
+ "audit-code cleanup*": "deny",
41
55
  "audit-code ensure*": "allow",
42
- "*audit-code.mjs* ensure*": "allow",
56
+ "audit-code ingest-results*": "deny",
57
+ "audit-code merge-and-ingest*": "allow",
43
58
  "audit-code next-step*": "allow",
44
- "*audit-code.mjs* next-step*": "allow",
45
59
  "audit-code prepare-dispatch*": "allow",
46
- "*audit-code.mjs* prepare-dispatch*": "allow",
60
+ "audit-code requeue*": "deny",
47
61
  "audit-code submit-packet*": "allow",
48
- "*audit-code.mjs* submit-packet*": "allow",
49
- "audit-code merge-and-ingest*": "allow",
50
- "*audit-code.mjs* merge-and-ingest*": "allow",
62
+ "audit-code synthesize*": "deny",
51
63
  "audit-code validate*": "allow",
52
- "*audit-code.mjs* validate*": "allow",
53
- "*audit-code.mjs": "allow",
54
- "*audit-code.mjs* worker-run*": "allow",
55
- "git status*": "allow",
56
64
  "git diff*": "allow",
65
+ "git status*": "allow",
57
66
  "grep *": "allow",
58
- "Select-String *": "allow",
67
+ "remediate-code": "allow",
68
+ "remediate-code ensure*": "allow",
69
+ "remediate-code merge-document-results*": "allow",
70
+ "remediate-code merge-implement-results*": "allow",
71
+ "remediate-code next-step*": "allow",
72
+ "remediate-code prepare-document-dispatch*": "allow",
73
+ "remediate-code prepare-implement-dispatch*": "allow",
74
+ "remediate-code validate-artifacts*": "allow",
59
75
  "rm *": "deny"
60
76
  }
61
77
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "audit-tools",
3
- "version": "0.32.19",
3
+ "version": "0.32.22",
4
4
  "private": false,
5
5
  "license": "ISC",
6
6
  "description": "Portable hybrid code auditing + remediation orchestrators for arbitrary repositories.",
@@ -13,7 +13,7 @@ import { fileURLToPath } from "node:url";
13
13
  let failed = false;
14
14
  for (const script of ["./audit/postinstall.mjs", "./remediate/postinstall.mjs"]) {
15
15
  const scriptPath = fileURLToPath(new URL(script, import.meta.url));
16
- const result = spawnSync(process.execPath, [scriptPath], { stdio: "inherit" });
16
+ const result = spawnSync(process.execPath, [scriptPath], { stdio: "inherit", windowsHide: true });
17
17
  if (result.error) {
18
18
  console.warn(`[audit-tools] postinstall: ${script} could not run (${result.error.message}).`);
19
19
  failed = true;
@@ -85,6 +85,7 @@ function runGhRepoVisibility(repoRoot) {
85
85
  cwd: repoRoot,
86
86
  encoding: "utf8",
87
87
  shell: process.platform === "win32",
88
+ windowsHide: true,
88
89
  });
89
90
  if (result.error || (result.status ?? 0) !== 0) return null;
90
91
  return typeof result.stdout === "string" ? result.stdout : null;
@@ -4,6 +4,7 @@
4
4
  let mergeOpenCodeAgentPermissionRule;
5
5
  let withoutOpenCodeWildcard;
6
6
  let migrateOpenCodeGlobalExternalDirectory;
7
+ let composeOpenCodeBashCeiling;
7
8
  export let sharedOpenCodePermissions = false;
8
9
 
9
10
  try {
@@ -11,6 +12,7 @@ try {
11
12
  mergeOpenCodeAgentPermissionRule = shared.mergeOpenCodeAgentPermissionRule;
12
13
  withoutOpenCodeWildcard = shared.withoutOpenCodeWildcard;
13
14
  migrateOpenCodeGlobalExternalDirectory = shared.migrateOpenCodeGlobalExternalDirectory;
15
+ composeOpenCodeBashCeiling = shared.composeOpenCodeBashCeiling;
14
16
  sharedOpenCodePermissions = true;
15
17
  } catch {
16
18
  // shared not yet built — callers that need merge logic will throw below
@@ -208,6 +210,19 @@ function mergePermissionBlock(existingPermission, generatedPermission) {
208
210
  };
209
211
  }
210
212
 
213
+ // Collect every agent's bash rule set from a merged agent map (in stable,
214
+ // key-sorted order) so the top-level ceiling is a deterministic union over all
215
+ // present agents — auditor, remediator, or any future agent — not just the one
216
+ // this installer owns. This is what makes the two installers mutually
217
+ // key-aware: whichever one runs unions the block the other already wrote.
218
+ function collectAgentBashRuleSets(agentMap) {
219
+ const agents = objectValue(agentMap);
220
+ return Object.keys(agents)
221
+ .sort()
222
+ .map((name) => objectValue(objectValue(agents[name]).permission).bash)
223
+ .filter((bash) => bash && typeof bash === 'object' && !Array.isArray(bash));
224
+ }
225
+
211
226
  export function buildMergedOpenCodeProjectConfig(existing, root) {
212
227
  if (!sharedOpenCodePermissions) {
213
228
  throw new Error(
@@ -218,22 +233,33 @@ export function buildMergedOpenCodeProjectConfig(existing, root) {
218
233
  const mergedMcp = objectValue(existing.mcp);
219
234
  delete mergedMcp.auditor;
220
235
  const existingAuditor = objectValue(objectValue(existing.agent).auditor);
236
+ const mergedAgent = {
237
+ ...objectValue(existing.agent),
238
+ auditor: {
239
+ ...existingAuditor,
240
+ ...generated.agent.auditor,
241
+ permission: mergePermissionBlock(
242
+ existingAuditor.permission,
243
+ generated.agent.auditor.permission,
244
+ ),
245
+ },
246
+ };
247
+ // Top-level permission: non-bash rules keep the agent-scope merge. The
248
+ // top-level bash is the union ceiling of EVERY final agent's bash block — a
249
+ // true global privilege ceiling, order-stable and idempotent regardless of
250
+ // which installer regenerates the file. User-authored top-level bash keys the
251
+ // union does not manage are preserved (non-clobber).
252
+ const topPermission = mergePermissionBlock(existing.permission, generated.permission);
253
+ topPermission.bash = composeOpenCodeBashCeiling(
254
+ objectValue(existing.permission).bash,
255
+ collectAgentBashRuleSets(mergedAgent),
256
+ );
221
257
  return {
222
258
  ...existing,
223
259
  $schema: existing.$schema ?? generated.$schema,
224
260
  command: removeManagedOpenCodeCommand(existing.command),
225
261
  mcp: mergedMcp,
226
- permission: mergePermissionBlock(existing.permission, generated.permission),
227
- agent: {
228
- ...objectValue(existing.agent),
229
- auditor: {
230
- ...existingAuditor,
231
- ...generated.agent.auditor,
232
- permission: mergePermissionBlock(
233
- existingAuditor.permission,
234
- generated.agent.auditor.permission,
235
- ),
236
- },
237
- },
262
+ permission: topPermission,
263
+ agent: mergedAgent,
238
264
  };
239
265
  }
@@ -3,12 +3,14 @@
3
3
  // buildMergedOpenCodeProjectConfig throws a clear error in that case.
4
4
  let mergeOpenCodeAgentPermissionRule;
5
5
  let withoutOpenCodeWildcard;
6
+ let composeOpenCodeBashCeiling;
6
7
  export let sharedOpenCodePermissions = false;
7
8
 
8
9
  try {
9
10
  const shared = await import('audit-tools/shared');
10
11
  mergeOpenCodeAgentPermissionRule = shared.mergeOpenCodeAgentPermissionRule;
11
12
  withoutOpenCodeWildcard = shared.withoutOpenCodeWildcard;
13
+ composeOpenCodeBashCeiling = shared.composeOpenCodeBashCeiling;
12
14
  sharedOpenCodePermissions = true;
13
15
  } catch {
14
16
  // shared not yet built — callers that need merge logic will throw below
@@ -170,6 +172,19 @@ function mergePermissionBlock(existingPermission, generatedPermission) {
170
172
  };
171
173
  }
172
174
 
175
+ // Collect every agent's bash rule set from a merged agent map (in stable,
176
+ // key-sorted order) so the top-level ceiling is a deterministic union over all
177
+ // present agents — auditor, remediator, or any future agent — not just the one
178
+ // this installer owns. This is what makes the two installers mutually
179
+ // key-aware: whichever one runs unions the block the other already wrote.
180
+ function collectAgentBashRuleSets(agentMap) {
181
+ const agents = objectValue(agentMap);
182
+ return Object.keys(agents)
183
+ .sort()
184
+ .map((name) => objectValue(objectValue(agents[name]).permission).bash)
185
+ .filter((bash) => bash && typeof bash === 'object' && !Array.isArray(bash));
186
+ }
187
+
173
188
  export function buildMergedOpenCodeProjectConfig(existing, root) {
174
189
  if (!sharedOpenCodePermissions) {
175
190
  throw new Error(
@@ -180,22 +195,33 @@ export function buildMergedOpenCodeProjectConfig(existing, root) {
180
195
  const mergedMcp = objectValue(existing.mcp);
181
196
  delete mergedMcp.remediator;
182
197
  const existingRemediator = objectValue(objectValue(existing.agent).remediator);
198
+ const mergedAgent = {
199
+ ...objectValue(existing.agent),
200
+ remediator: {
201
+ ...existingRemediator,
202
+ ...generated.agent.remediator,
203
+ permission: mergePermissionBlock(
204
+ existingRemediator.permission,
205
+ generated.agent.remediator.permission,
206
+ ),
207
+ },
208
+ };
209
+ // Top-level permission: non-bash rules keep the agent-scope merge. The
210
+ // top-level bash is the union ceiling of EVERY final agent's bash block — a
211
+ // true global privilege ceiling, order-stable and idempotent regardless of
212
+ // which installer regenerates the file. User-authored top-level bash keys the
213
+ // union does not manage are preserved (non-clobber).
214
+ const topPermission = mergePermissionBlock(existing.permission, generated.permission);
215
+ topPermission.bash = composeOpenCodeBashCeiling(
216
+ objectValue(existing.permission).bash,
217
+ collectAgentBashRuleSets(mergedAgent),
218
+ );
183
219
  return {
184
220
  ...existing,
185
221
  $schema: existing.$schema ?? generated.$schema,
186
222
  command: removeManagedOpenCodeCommand(existing.command),
187
223
  mcp: mergedMcp,
188
- permission: mergePermissionBlock(existing.permission, generated.permission),
189
- agent: {
190
- ...objectValue(existing.agent),
191
- remediator: {
192
- ...existingRemediator,
193
- ...generated.agent.remediator,
194
- permission: mergePermissionBlock(
195
- existingRemediator.permission,
196
- generated.agent.remediator.permission,
197
- ),
198
- },
199
- },
224
+ permission: topPermission,
225
+ agent: mergedAgent,
200
226
  };
201
227
  }