audit-tools 0.51.11 → 0.52.1

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 (282) hide show
  1. package/dist/audit/cli/auditStep.d.ts.map +1 -1
  2. package/dist/audit/cli/auditStep.js +2 -2
  3. package/dist/audit/cli/auditStep.js.map +1 -1
  4. package/dist/audit/cli/charterClarificationPrompt.d.ts +16 -8
  5. package/dist/audit/cli/charterClarificationPrompt.d.ts.map +1 -1
  6. package/dist/audit/cli/charterClarificationPrompt.js +95 -42
  7. package/dist/audit/cli/charterClarificationPrompt.js.map +1 -1
  8. package/dist/audit/cli/charterComparisonPrompt.d.ts +16 -6
  9. package/dist/audit/cli/charterComparisonPrompt.d.ts.map +1 -1
  10. package/dist/audit/cli/charterComparisonPrompt.js +76 -29
  11. package/dist/audit/cli/charterComparisonPrompt.js.map +1 -1
  12. package/dist/audit/cli/charterExtractionPrompt.d.ts +5 -4
  13. package/dist/audit/cli/charterExtractionPrompt.d.ts.map +1 -1
  14. package/dist/audit/cli/charterExtractionPrompt.js +64 -42
  15. package/dist/audit/cli/charterExtractionPrompt.js.map +1 -1
  16. package/dist/audit/cli/charterFidelityPrompt.d.ts +17 -4
  17. package/dist/audit/cli/charterFidelityPrompt.d.ts.map +1 -1
  18. package/dist/audit/cli/charterFidelityPrompt.js +72 -21
  19. package/dist/audit/cli/charterFidelityPrompt.js.map +1 -1
  20. package/dist/audit/cli/dispatch/hostHandoff.d.ts +23 -1
  21. package/dist/audit/cli/dispatch/hostHandoff.d.ts.map +1 -1
  22. package/dist/audit/cli/dispatch/hostHandoff.js +204 -41
  23. package/dist/audit/cli/dispatch/hostHandoff.js.map +1 -1
  24. package/dist/audit/cli/dispatch/packetFilter.d.ts +8 -0
  25. package/dist/audit/cli/dispatch/packetFilter.d.ts.map +1 -1
  26. package/dist/audit/cli/fanoutLanes.d.ts.map +1 -1
  27. package/dist/audit/cli/fanoutLanes.js +20 -4
  28. package/dist/audit/cli/fanoutLanes.js.map +1 -1
  29. package/dist/audit/cli/laneValidators.d.ts +19 -7
  30. package/dist/audit/cli/laneValidators.d.ts.map +1 -1
  31. package/dist/audit/cli/laneValidators.js +73 -18
  32. package/dist/audit/cli/laneValidators.js.map +1 -1
  33. package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
  34. package/dist/audit/cli/nextStepCommand.js +13 -6
  35. package/dist/audit/cli/nextStepCommand.js.map +1 -1
  36. package/dist/audit/cli/nextStepHelpers.d.ts +25 -2
  37. package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
  38. package/dist/audit/cli/nextStepHelpers.js +105 -35
  39. package/dist/audit/cli/nextStepHelpers.js.map +1 -1
  40. package/dist/audit/cli/recoverSubmissionCommand.d.ts.map +1 -1
  41. package/dist/audit/cli/recoverSubmissionCommand.js +89 -4
  42. package/dist/audit/cli/recoverSubmissionCommand.js.map +1 -1
  43. package/dist/audit/cli/sampleRunCommand.d.ts +10 -0
  44. package/dist/audit/cli/sampleRunCommand.d.ts.map +1 -1
  45. package/dist/audit/cli/semanticReviewStep.d.ts +4 -4
  46. package/dist/audit/cli/semanticReviewStep.d.ts.map +1 -1
  47. package/dist/audit/cli/semanticReviewStep.js +35 -71
  48. package/dist/audit/cli/semanticReviewStep.js.map +1 -1
  49. package/dist/audit/contracts/findingContractPrompt.d.ts.map +1 -1
  50. package/dist/audit/contracts/findingContractPrompt.js +7 -1
  51. package/dist/audit/contracts/findingContractPrompt.js.map +1 -1
  52. package/dist/audit/contracts/workerSchemas.d.ts +280 -4
  53. package/dist/audit/contracts/workerSchemas.d.ts.map +1 -1
  54. package/dist/audit/contracts/workerSchemas.js +24 -2
  55. package/dist/audit/contracts/workerSchemas.js.map +1 -1
  56. package/dist/audit/orchestrator/charterClarificationExecutor.d.ts.map +1 -1
  57. package/dist/audit/orchestrator/charterClarificationExecutor.js +39 -0
  58. package/dist/audit/orchestrator/charterClarificationExecutor.js.map +1 -1
  59. package/dist/audit/orchestrator/charterExtractionExecutor.d.ts +12 -5
  60. package/dist/audit/orchestrator/charterExtractionExecutor.d.ts.map +1 -1
  61. package/dist/audit/orchestrator/charterExtractionExecutor.js +39 -9
  62. package/dist/audit/orchestrator/charterExtractionExecutor.js.map +1 -1
  63. package/dist/audit/orchestrator/designReviewPrompt.d.ts +7 -0
  64. package/dist/audit/orchestrator/designReviewPrompt.d.ts.map +1 -1
  65. package/dist/audit/orchestrator/designReviewPrompt.js +174 -19
  66. package/dist/audit/orchestrator/designReviewPrompt.js.map +1 -1
  67. package/dist/audit/orchestrator/executorRunners.d.ts.map +1 -1
  68. package/dist/audit/orchestrator/executorRunners.js +14 -3
  69. package/dist/audit/orchestrator/executorRunners.js.map +1 -1
  70. package/dist/audit/orchestrator/intentCheckpointGate.d.ts.map +1 -1
  71. package/dist/audit/orchestrator/intentCheckpointGate.js +1 -5
  72. package/dist/audit/orchestrator/intentCheckpointGate.js.map +1 -1
  73. package/dist/audit/orchestrator/requeueCommand.d.ts +8 -0
  74. package/dist/audit/orchestrator/requeueCommand.d.ts.map +1 -1
  75. package/dist/audit/orchestrator/selectiveDeepening/lensVerification.d.ts.map +1 -1
  76. package/dist/audit/orchestrator/selectiveDeepening/lensVerification.js +94 -71
  77. package/dist/audit/orchestrator/selectiveDeepening/lensVerification.js.map +1 -1
  78. package/dist/audit/orchestrator/selectiveDeepening/shared.d.ts +0 -2
  79. package/dist/audit/orchestrator/selectiveDeepening/shared.d.ts.map +1 -1
  80. package/dist/audit/orchestrator/selectiveDeepening/shared.js +9 -2
  81. package/dist/audit/orchestrator/selectiveDeepening/shared.js.map +1 -1
  82. package/dist/audit/orchestrator/selectiveDeepening/stewardFollowup.d.ts.map +1 -1
  83. package/dist/audit/orchestrator/selectiveDeepening/stewardFollowup.js +28 -4
  84. package/dist/audit/orchestrator/selectiveDeepening/stewardFollowup.js.map +1 -1
  85. package/dist/audit/orchestrator/synthesisExecutors.d.ts +10 -3
  86. package/dist/audit/orchestrator/synthesisExecutors.d.ts.map +1 -1
  87. package/dist/audit/orchestrator/synthesisExecutors.js +5 -4
  88. package/dist/audit/orchestrator/synthesisExecutors.js.map +1 -1
  89. package/dist/audit/reporting/synthesis.d.ts +23 -6
  90. package/dist/audit/reporting/synthesis.d.ts.map +1 -1
  91. package/dist/audit/reporting/synthesis.js +53 -13
  92. package/dist/audit/reporting/synthesis.js.map +1 -1
  93. package/dist/audit/reporting/synthesisNarrativePrompt.d.ts +26 -1
  94. package/dist/audit/reporting/synthesisNarrativePrompt.d.ts.map +1 -1
  95. package/dist/audit/reporting/synthesisNarrativePrompt.js +53 -13
  96. package/dist/audit/reporting/synthesisNarrativePrompt.js.map +1 -1
  97. package/dist/audit/systemic/secondOrderAdversaryPrompt.d.ts.map +1 -1
  98. package/dist/audit/systemic/secondOrderAdversaryPrompt.js +67 -40
  99. package/dist/audit/systemic/secondOrderAdversaryPrompt.js.map +1 -1
  100. package/dist/audit/systemic/systemicChallengeLoop.d.ts.map +1 -1
  101. package/dist/audit/systemic/systemicChallengeLoop.js +13 -1
  102. package/dist/audit/systemic/systemicChallengeLoop.js.map +1 -1
  103. package/dist/audit/types/conceptualAdjudication.d.ts +26 -2
  104. package/dist/audit/types/conceptualAdjudication.d.ts.map +1 -1
  105. package/dist/audit/types/conceptualAdjudication.js +26 -7
  106. package/dist/audit/types/conceptualAdjudication.js.map +1 -1
  107. package/dist/audit/types.d.ts +279 -0
  108. package/dist/audit/types.d.ts.map +1 -1
  109. package/dist/audit/types.js +52 -0
  110. package/dist/audit/types.js.map +1 -1
  111. package/dist/audit/validation/auditResults.d.ts.map +1 -1
  112. package/dist/audit/validation/auditResults.js +51 -6
  113. package/dist/audit/validation/auditResults.js.map +1 -1
  114. package/dist/audit/validation/ingestIssueCodes.d.ts +3 -1
  115. package/dist/audit/validation/ingestIssueCodes.d.ts.map +1 -1
  116. package/dist/audit/validation/ingestIssueCodes.js +27 -15
  117. package/dist/audit/validation/ingestIssueCodes.js.map +1 -1
  118. package/dist/remediate/contractPipeline/sketchSource.d.ts +13 -3
  119. package/dist/remediate/contractPipeline/sketchSource.d.ts.map +1 -1
  120. package/dist/remediate/contractPipeline/sketchSource.js +14 -8
  121. package/dist/remediate/contractPipeline/sketchSource.js.map +1 -1
  122. package/dist/remediate/intake.d.ts +140 -36
  123. package/dist/remediate/intake.d.ts.map +1 -1
  124. package/dist/remediate/intake.js +159 -38
  125. package/dist/remediate/intake.js.map +1 -1
  126. package/dist/remediate/intent/checkpointFilter.d.ts +1 -2
  127. package/dist/remediate/intent/checkpointFilter.d.ts.map +1 -1
  128. package/dist/remediate/intent/checkpointFilter.js +1 -5
  129. package/dist/remediate/intent/checkpointFilter.js.map +1 -1
  130. package/dist/remediate/phases/close.d.ts.map +1 -1
  131. package/dist/remediate/phases/close.js +8 -8
  132. package/dist/remediate/phases/close.js.map +1 -1
  133. package/dist/remediate/phases/closeVerifyHeadEvidence.d.ts +19 -35
  134. package/dist/remediate/phases/closeVerifyHeadEvidence.d.ts.map +1 -1
  135. package/dist/remediate/phases/closeVerifyHeadEvidence.js +38 -12
  136. package/dist/remediate/phases/closeVerifyHeadEvidence.js.map +1 -1
  137. package/dist/remediate/phases/plan.d.ts +1 -1
  138. package/dist/remediate/review/reviewGate.d.ts +68 -39
  139. package/dist/remediate/review/reviewGate.d.ts.map +1 -1
  140. package/dist/remediate/review/reviewGate.js +133 -50
  141. package/dist/remediate/review/reviewGate.js.map +1 -1
  142. package/dist/remediate/state/store.d.ts +1 -2
  143. package/dist/remediate/state/store.d.ts.map +1 -1
  144. package/dist/remediate/state/store.js +124 -3
  145. package/dist/remediate/state/store.js.map +1 -1
  146. package/dist/remediate/state/types.d.ts +59 -8
  147. package/dist/remediate/state/types.d.ts.map +1 -1
  148. package/dist/remediate/state/types.js +12 -1
  149. package/dist/remediate/state/types.js.map +1 -1
  150. package/dist/remediate/steps/contractPipeline.d.ts +40 -2
  151. package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
  152. package/dist/remediate/steps/contractPipeline.js +147 -53
  153. package/dist/remediate/steps/contractPipeline.js.map +1 -1
  154. package/dist/remediate/steps/contractPipelinePrompts.d.ts +32 -8
  155. package/dist/remediate/steps/contractPipelinePrompts.d.ts.map +1 -1
  156. package/dist/remediate/steps/contractPipelinePrompts.js +145 -131
  157. package/dist/remediate/steps/contractPipelinePrompts.js.map +1 -1
  158. package/dist/remediate/steps/dispatch/hostHandoff.d.ts +6 -4
  159. package/dist/remediate/steps/dispatch/hostHandoff.d.ts.map +1 -1
  160. package/dist/remediate/steps/dispatch/hostHandoff.js +291 -155
  161. package/dist/remediate/steps/dispatch/hostHandoff.js.map +1 -1
  162. package/dist/remediate/steps/intakeResolver.d.ts +1 -1
  163. package/dist/remediate/steps/intakeResolver.d.ts.map +1 -1
  164. package/dist/remediate/steps/intakeResolver.js +50 -49
  165. package/dist/remediate/steps/intakeResolver.js.map +1 -1
  166. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  167. package/dist/remediate/steps/nextStep.js +337 -294
  168. package/dist/remediate/steps/nextStep.js.map +1 -1
  169. package/dist/remediate/steps/prompts.d.ts +10 -3
  170. package/dist/remediate/steps/prompts.d.ts.map +1 -1
  171. package/dist/remediate/steps/prompts.js +191 -228
  172. package/dist/remediate/steps/prompts.js.map +1 -1
  173. package/dist/remediate/steps/types.d.ts +2 -2
  174. package/dist/remediate/steps/types.d.ts.map +1 -1
  175. package/dist/remediate/steps/types.js +10 -3
  176. package/dist/remediate/steps/types.js.map +1 -1
  177. package/dist/remediate/validation/artifacts.d.ts.map +1 -1
  178. package/dist/remediate/validation/artifacts.js +5 -22
  179. package/dist/remediate/validation/artifacts.js.map +1 -1
  180. package/dist/remediate/validation/contractPipeline.d.ts.map +1 -1
  181. package/dist/remediate/validation/contractPipeline.js +25 -8
  182. package/dist/remediate/validation/contractPipeline.js.map +1 -1
  183. package/dist/remediate/validation/remediationState.d.ts +0 -1
  184. package/dist/remediate/validation/remediationState.d.ts.map +1 -1
  185. package/dist/remediate/validation/remediationState.js +1 -20
  186. package/dist/remediate/validation/remediationState.js.map +1 -1
  187. package/dist/shared/decompose/charterClarification.d.ts +7 -0
  188. package/dist/shared/decompose/charterClarification.d.ts.map +1 -1
  189. package/dist/shared/decompose/charterClarification.js +8 -1
  190. package/dist/shared/decompose/charterClarification.js.map +1 -1
  191. package/dist/shared/decompose/charterExtraction.d.ts +204 -16
  192. package/dist/shared/decompose/charterExtraction.d.ts.map +1 -1
  193. package/dist/shared/decompose/charterExtraction.js +70 -13
  194. package/dist/shared/decompose/charterExtraction.js.map +1 -1
  195. package/dist/shared/decompose/systemicChallenge.d.ts +42 -1
  196. package/dist/shared/decompose/systemicChallenge.d.ts.map +1 -1
  197. package/dist/shared/decompose/systemicChallenge.js +51 -0
  198. package/dist/shared/decompose/systemicChallenge.js.map +1 -1
  199. package/dist/shared/git.d.ts +31 -0
  200. package/dist/shared/git.d.ts.map +1 -1
  201. package/dist/shared/git.js +105 -0
  202. package/dist/shared/git.js.map +1 -1
  203. package/dist/shared/index.d.ts +17 -14
  204. package/dist/shared/index.d.ts.map +1 -1
  205. package/dist/shared/index.js +18 -11
  206. package/dist/shared/index.js.map +1 -1
  207. package/dist/shared/io/stepContractWriter.d.ts.map +1 -1
  208. package/dist/shared/io/stepContractWriter.js +13 -4
  209. package/dist/shared/io/stepContractWriter.js.map +1 -1
  210. package/dist/shared/reporting/auditDeliverable.d.ts +8 -3
  211. package/dist/shared/reporting/auditDeliverable.d.ts.map +1 -1
  212. package/dist/shared/reporting/auditDeliverable.js +10 -3
  213. package/dist/shared/reporting/auditDeliverable.js.map +1 -1
  214. package/dist/shared/submission/hostHandoffCore.d.ts +7 -0
  215. package/dist/shared/submission/hostHandoffCore.d.ts.map +1 -1
  216. package/dist/shared/submission/hostHandoffCore.js +15 -2
  217. package/dist/shared/submission/hostHandoffCore.js.map +1 -1
  218. package/dist/shared/submission/hostResultOutcomes.d.ts +60 -10
  219. package/dist/shared/submission/hostResultOutcomes.d.ts.map +1 -1
  220. package/dist/shared/submission/hostResultOutcomes.js +42 -10
  221. package/dist/shared/submission/hostResultOutcomes.js.map +1 -1
  222. package/dist/shared/submission/ingestReport.d.ts +54 -0
  223. package/dist/shared/submission/ingestReport.d.ts.map +1 -0
  224. package/dist/shared/submission/ingestReport.js +44 -0
  225. package/dist/shared/submission/ingestReport.js.map +1 -0
  226. package/dist/shared/submission/ingestionChecks.d.ts +8 -13
  227. package/dist/shared/submission/ingestionChecks.d.ts.map +1 -1
  228. package/dist/shared/submission/ingestionChecks.js +9 -14
  229. package/dist/shared/submission/ingestionChecks.js.map +1 -1
  230. package/dist/shared/submission/submissionClassifier.d.ts +6 -0
  231. package/dist/shared/submission/submissionClassifier.d.ts.map +1 -1
  232. package/dist/shared/submission/submissionClassifier.js +16 -0
  233. package/dist/shared/submission/submissionClassifier.js.map +1 -1
  234. package/dist/shared/submission/workerPromptBinding.d.ts +18 -0
  235. package/dist/shared/submission/workerPromptBinding.d.ts.map +1 -0
  236. package/dist/shared/submission/workerPromptBinding.js +38 -0
  237. package/dist/shared/submission/workerPromptBinding.js.map +1 -0
  238. package/dist/shared/tooling/exec.d.ts +24 -0
  239. package/dist/shared/tooling/exec.d.ts.map +1 -1
  240. package/dist/shared/tooling/exec.js +30 -0
  241. package/dist/shared/tooling/exec.js.map +1 -1
  242. package/dist/shared/types/charter.d.ts +143 -7
  243. package/dist/shared/types/charter.d.ts.map +1 -1
  244. package/dist/shared/types/charter.js +63 -7
  245. package/dist/shared/types/charter.js.map +1 -1
  246. package/dist/shared/types/charterPacket.d.ts +13 -0
  247. package/dist/shared/types/charterPacket.d.ts.map +1 -1
  248. package/dist/shared/types/charterPacket.js.map +1 -1
  249. package/dist/shared/types/contractPipeline/obligations.d.ts +30 -11
  250. package/dist/shared/types/contractPipeline/obligations.d.ts.map +1 -1
  251. package/dist/shared/types/contractPipeline/obligations.js +6 -1
  252. package/dist/shared/types/contractPipeline/obligations.js.map +1 -1
  253. package/dist/shared/types/contractPropertyShapes.d.ts.map +1 -1
  254. package/dist/shared/types/contractPropertyShapes.js +13 -0
  255. package/dist/shared/types/contractPropertyShapes.js.map +1 -1
  256. package/dist/shared/types/finding.d.ts +210 -15
  257. package/dist/shared/types/finding.d.ts.map +1 -1
  258. package/dist/shared/types/finding.js +68 -5
  259. package/dist/shared/types/finding.js.map +1 -1
  260. package/dist/shared/types/intentCheckpoint.d.ts +28 -42
  261. package/dist/shared/types/intentCheckpoint.d.ts.map +1 -1
  262. package/dist/shared/types/intentCheckpoint.js +30 -33
  263. package/dist/shared/types/intentCheckpoint.js.map +1 -1
  264. package/dist/shared/types/remediationOutcome.d.ts +8 -8
  265. package/dist/shared/validation/citationGrounding.d.ts +29 -5
  266. package/dist/shared/validation/citationGrounding.d.ts.map +1 -1
  267. package/dist/shared/validation/citationGrounding.js +56 -9
  268. package/dist/shared/validation/citationGrounding.js.map +1 -1
  269. package/dist/shared/validation/designFindingGrounding.d.ts +30 -9
  270. package/dist/shared/validation/designFindingGrounding.d.ts.map +1 -1
  271. package/dist/shared/validation/designFindingGrounding.js +32 -12
  272. package/dist/shared/validation/designFindingGrounding.js.map +1 -1
  273. package/dist/shared/validation/findingsReport.d.ts +13 -2
  274. package/dist/shared/validation/findingsReport.d.ts.map +1 -1
  275. package/dist/shared/validation/findingsReport.js +19 -2
  276. package/dist/shared/validation/findingsReport.js.map +1 -1
  277. package/docs/audit-pkg/contracts.md +4 -5
  278. package/package.json +1 -1
  279. package/schemas/audit_result.schema.json +51 -0
  280. package/schemas/audit_results.schema.json +51 -0
  281. package/schemas/audit_task.schema.json +44 -0
  282. package/schemas/finding.schema.json +4 -0
@@ -1,3 +1,7 @@
1
+ // sites-pinned: tests/audit/semantic-review-step.test.ts, tests/audit/host-handoff.test.ts
2
+ // (the remedy map decides which section a refusal renders under, so inverting
3
+ // any entry moves a work item to the wrong heading in the semantic-review
4
+ // prompt)
1
5
  /**
2
6
  * Shared recording and trailing-state diagnostics for host-result ingestion.
3
7
  *
@@ -35,23 +39,51 @@ export async function readTrailingSubmissionRefusals(artifactsDir, submissionIds
35
39
  }
36
40
  return last;
37
41
  }
42
+ /**
43
+ * The remedy of every SHARED submission code. A draw that adds its own codes
44
+ * builds its own `Record<ItsCodeUnion, IssueRemedy>` by spreading this one — the
45
+ * record type is what makes a new code state its remedy to compile, rather than
46
+ * defaulting into whichever section a filter happens to leave it in (the audit
47
+ * draw's is `AUDIT_INGEST_ISSUE_REMEDY`).
48
+ */
49
+ export const SUBMISSION_ISSUE_REMEDY = {
50
+ submission_missing: "wait",
51
+ submission_malformed: "repair",
52
+ submission_contract_invalid: "repair",
53
+ submission_rejected: "repair",
54
+ // The work item was ALREADY ACCEPTED by a concurrent ingest of this run, so
55
+ // it is not pending, it is not republished, and there is nothing to write.
56
+ duplicate_submission_id: "none",
57
+ };
58
+ /**
59
+ * The remedy of every shared WORKLOAD code — spread beside
60
+ * {@link SUBMISSION_ISSUE_REMEDY} by each draw.
61
+ */
62
+ export const WORKLOAD_ISSUE_REMEDY = {
63
+ // Not about any one result: the run's own persisted workload carries a
64
+ // contract version this build no longer mints. The ingest returns it so the
65
+ // same call walks on to the re-prepare, which rewrites the document. Nothing
66
+ // is asked of the host.
67
+ workload_stale: "none",
68
+ };
38
69
  /**
39
70
  * Is this issue an OBSERVATION that nothing has been written yet, rather than a
40
71
  * refusal of something that WAS written?
41
72
  *
42
- * The distinction is the whole point of the split. "The host has not finished"
43
- * and "the host's work was refused" are different facts with different remedies
44
- * — the first asks for patience, the second for a repair — and a rendering that
45
- * gives them one shape forces every reader (a host parser, an operator, a
46
- * retry loop) to special-case the message text to tell them apart. That is
47
- * exactly what the measured friction was: a host parser special-casing the
48
- * string "no result file exists".
73
+ * Kept as its own name because four call sites read exactly this question, and
74
+ * derived from {@link SUBMISSION_ISSUE_REMEDY} so the "wait" answer has ONE
75
+ * home. A draw-specific code is absent from the shared record and so is not a
76
+ * missing observation — which is what every caller already assumed.
49
77
  *
50
- * The code is authoritative, never the message: a draw's prose may be reworded
51
- * at any time and the answer must not move with it.
78
+ * The distinction was the whole point of the original two-way split. "The host
79
+ * has not finished" and "the host's work was refused" are different facts with
80
+ * different remedies, and a rendering that gives them one shape forces every
81
+ * reader (a host parser, an operator, a retry loop) to special-case the message
82
+ * text to tell them apart. That is exactly what the measured friction was: a
83
+ * host parser special-casing the string "no result file exists".
52
84
  */
53
85
  export function isMissingObservation(issue) {
54
- return issue.code === "submission_missing";
86
+ return SUBMISSION_ISSUE_REMEDY[issue.code] === "wait";
55
87
  }
56
88
  /**
57
89
  * WHAT ONE WORK ITEM'S OUTCOME LOOKS LIKE to the host that has to finish it.
@@ -1 +1 @@
1
- {"version":3,"file":"hostResultOutcomes.js","sourceRoot":"","sources":["../../../src/shared/submission/hostResultOutcomes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hostResultOutcomes.js","sourceRoot":"","sources":["../../../src/shared/submission/hostResultOutcomes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * THE renderer for an ingest report — the sections a host reads to learn what
3
+ * the last ingest did with its results, and what it must do next.
4
+ *
5
+ * ONE renderer, both draws (owner review of prompt 20, 2026-09-18). The audit
6
+ * draw renders it in the semantic-review step and on a step of another kind
7
+ * that carries the same report; the remediate draw renders it in the
8
+ * implement-dispatch step. Each draw supplies its own REMEDY map — the answer to
9
+ * "what must the reader do about this code" — and nothing else. The sections,
10
+ * their order, the bullet format and the paragraphs have one home, here: the
11
+ * two hand copies this replaced had already drifted apart (the remediate copy
12
+ * rendered a duplicate result as a repair beside every other refusal, the audit
13
+ * copy as settled; the remediate copy had no settled section at all).
14
+ *
15
+ * The section a work item lands in is chosen by the draw's remedy for its CODE,
16
+ * never by the message text. A message may be reworded at any time and the
17
+ * section must not move with it.
18
+ */
19
+ import type { IssueRemedy } from "./hostResultOutcomes.js";
20
+ import type { SubmissionIssue } from "./submissionClassifier.js";
21
+ /**
22
+ * Where the workload that binds every `result_path` sits relative to the
23
+ * report, which decides how the repair paragraph points at it.
24
+ *
25
+ * - `follows` — the same prompt publishes the workload BELOW the report.
26
+ * - `named_above` — the same prompt names the workload file ABOVE the report.
27
+ * - `next_call` — the report rides a step of another kind; the next workload
28
+ * comes on a later call.
29
+ */
30
+ type IngestReportWorkload = "follows" | "named_above" | "next_call";
31
+ /** An advisory the ingest recorded on a result it ACCEPTED. */
32
+ interface IngestAdvisory {
33
+ readonly work_item_id: string;
34
+ readonly message: string;
35
+ }
36
+ /**
37
+ * The ingest report as prompt lines. An empty section is omitted, so a clean
38
+ * ingest renders nothing at all.
39
+ *
40
+ * `landedWithoutResult` names the items whose edits LANDED (the run holds a
41
+ * corroborated commit for each) with no result file at the bound path. Each is
42
+ * listed once, under its own section: the remedy is not "write the result when
43
+ * the work is done" but "write the result for the commit that is already
44
+ * there", so the same id is left out of the not-yet-written section.
45
+ */
46
+ export declare function renderIngestReportLines<TCode extends string>(input: {
47
+ readonly issues: readonly SubmissionIssue<TCode>[];
48
+ readonly remedy: (issue: SubmissionIssue<TCode>) => IssueRemedy;
49
+ readonly workload: IngestReportWorkload;
50
+ readonly landedWithoutResult?: readonly string[];
51
+ readonly advisories?: readonly IngestAdvisory[];
52
+ }): string[];
53
+ export {};
54
+ //# sourceMappingURL=ingestReport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingestReport.d.ts","sourceRoot":"","sources":["../../../src/shared/submission/ingestReport.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE;;;;;;;;GAQG;AACH,KAAK,oBAAoB,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;AAEpE,+DAA+D;AAC/D,UAAU,cAAc;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA0BD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,SAAS,MAAM,EAAE,KAAK,EAAE;IACnE,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC;IAChE,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACjD,GAAG,MAAM,EAAE,CAiCX"}
@@ -0,0 +1,44 @@
1
+ const OPERATOR_SECTION_HEADING = "## Problems the worker cannot fix — stop and report them to the operator";
2
+ const REPAIR_PARAGRAPH = {
3
+ follows: "Each item above is still pending and is republished in the workload below. Write its result at the `result_path` the workload binds — the workload is the authority for every path.",
4
+ named_above: "Each item above is still pending and is republished in the workload file named above. Write its result at the `result_path` the workload binds — the workload is the authority for every path.",
5
+ next_call: "Each item above is still pending. Write its result at the `result_path` the next published workload binds — the workload is the authority for every path.",
6
+ };
7
+ /** One issue as a bullet, with its locators. */
8
+ function describeIssue(issue) {
9
+ return (`- ${issue.work_item_id ? `\`${issue.work_item_id}\` (${issue.code}): ` : `${issue.code}: `}` +
10
+ `${issue.message}${issue.result_path ? ` (\`${issue.result_path}\`)` : ""}`);
11
+ }
12
+ function section(heading, lines) {
13
+ return lines.length === 0 ? [] : [heading, "", ...lines, ""];
14
+ }
15
+ /**
16
+ * The ingest report as prompt lines. An empty section is omitted, so a clean
17
+ * ingest renders nothing at all.
18
+ *
19
+ * `landedWithoutResult` names the items whose edits LANDED (the run holds a
20
+ * corroborated commit for each) with no result file at the bound path. Each is
21
+ * listed once, under its own section: the remedy is not "write the result when
22
+ * the work is done" but "write the result for the commit that is already
23
+ * there", so the same id is left out of the not-yet-written section.
24
+ */
25
+ export function renderIngestReportLines(input) {
26
+ const landed = [...new Set(input.landedWithoutResult ?? [])];
27
+ const landedSet = new Set(landed);
28
+ const byRemedy = (remedy) => input.issues.filter((issue) => input.remedy(issue) === remedy);
29
+ const waiting = byRemedy("wait").filter((issue) => issue.work_item_id === undefined || !landedSet.has(issue.work_item_id));
30
+ const repairable = byRemedy("repair").map(describeIssue);
31
+ return [
32
+ ...section("## Results not yet written", waiting.map(describeIssue)),
33
+ ...section("## Results to repair and write again", repairable),
34
+ // The repair paragraph belongs to the repair section and renders with it.
35
+ // A report holding only settled refusals must not tell the reader to write a
36
+ // repaired result for an item no workload binds a path for.
37
+ ...(repairable.length === 0 ? [] : [REPAIR_PARAGRAPH[input.workload], ""]),
38
+ ...section("## Commits that landed without a result file", landed.map((id) => `- \`${id}\`: write the result for the commit that is already on HEAD. Do not do the edit again.`)),
39
+ ...section(OPERATOR_SECTION_HEADING, byRemedy("operator").map(describeIssue)),
40
+ ...section("## Settled — no action needed", byRemedy("none").map(describeIssue)),
41
+ ...section("## Advisory notes on accepted results", (input.advisories ?? []).map((advisory) => `- \`${advisory.work_item_id}\` was ACCEPTED; advisory: ${advisory.message}`)),
42
+ ];
43
+ }
44
+ //# sourceMappingURL=ingestReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingestReport.js","sourceRoot":"","sources":["../../../src/shared/submission/ingestReport.ts"],"names":[],"mappings":"AAyCA,MAAM,wBAAwB,GAC5B,0EAA0E,CAAC;AAE7E,MAAM,gBAAgB,GAAmD;IACvE,OAAO,EACL,qLAAqL;IACvL,WAAW,EACT,gMAAgM;IAClM,SAAS,EACP,2JAA2J;CAC9J,CAAC;AAEF,gDAAgD;AAChD,SAAS,aAAa,CAAuB,KAA6B;IACxE,OAAO,CACL,KAAK,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,YAAY,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE;QAC7F,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5E,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,OAAe,EAAE,KAAwB;IACxD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAuB,KAM7D;IACC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,CAAC,MAAmB,EAA4B,EAAE,CACjE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CACrC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAClF,CAAC;IACF,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACzD,OAAO;QACL,GAAG,OAAO,CAAC,4BAA4B,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACpE,GAAG,OAAO,CAAC,sCAAsC,EAAE,UAAU,CAAC;QAC9D,0EAA0E;QAC1E,6EAA6E;QAC7E,4DAA4D;QAC5D,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1E,GAAG,OAAO,CACR,8CAA8C,EAC9C,MAAM,CAAC,GAAG,CACR,CAAC,EAAE,EAAE,EAAE,CACL,OAAO,EAAE,wFAAwF,CACpG,CACF;QACD,GAAG,OAAO,CAAC,wBAAwB,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7E,GAAG,OAAO,CAAC,+BAA+B,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAChF,GAAG,OAAO,CACR,uCAAuC,EACvC,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAC1B,CAAC,QAAQ,EAAE,EAAE,CACX,OAAO,QAAQ,CAAC,YAAY,8BAA8B,QAAQ,CAAC,OAAO,EAAE,CAC/E,CACF;KACF,CAAC;AACJ,CAAC"}
@@ -98,18 +98,18 @@ export declare const INGESTION_CHECKS: readonly [{
98
98
  readonly draws: readonly ["remediate"];
99
99
  readonly cited_by: "draw";
100
100
  }, {
101
- readonly id: "write_scope";
102
- readonly verifies: "`changed_files` is non-empty, sorted, unique and normalized, lies within the prompt-bound `allowed_files`, and equals the files the landed commit actually changed.";
101
+ readonly id: "landed_commit";
102
+ readonly verifies: "`landed_commit` is a full commit id that exists, is not the workload baseline, changes at least one file, descends from the baseline (waived only under a genuinely orphaned baseline in recovery), and is reachable from HEAD.";
103
103
  readonly draws: readonly ["remediate"];
104
104
  readonly cited_by: "draw";
105
105
  }, {
106
- readonly id: "commit_evidence";
107
- readonly verifies: "`commit_evidence` binds the workload baseline to a distinct landed commit; both exist, the baseline is an ancestor of the landed commit (waived only under a genuinely orphaned baseline in recovery), and the landed commit is reachable from HEAD.";
106
+ readonly id: "write_scope";
107
+ readonly verifies: "Every file the landed commit changed, as git reports it, lies within the prompt-bound `allowed_files`.";
108
108
  readonly draws: readonly ["remediate"];
109
109
  readonly cited_by: "draw";
110
110
  }, {
111
- readonly id: "test_evidence";
112
- readonly verifies: "`test_evidence` carries exactly one passed entry per required test echoing the bound command, and the tool's own mechanical rerun of those tests passes.";
111
+ readonly id: "required_tests";
112
+ readonly verifies: "The tool's own rerun of every prompt-bound required test passes on the tree that holds the landed commit.";
113
113
  readonly draws: readonly ["remediate"];
114
114
  readonly cited_by: "draw";
115
115
  }, {
@@ -118,13 +118,8 @@ export declare const INGESTION_CHECKS: readonly [{
118
118
  readonly draws: readonly ["remediate"];
119
119
  readonly cited_by: "draw";
120
120
  }, {
121
- readonly id: "worktree_evidence";
122
- readonly verifies: "`worktree_evidence` binds the workload baseline and the same changed-file list, and no landed file overlaps dirt that pre-dated the run.";
123
- readonly draws: readonly ["remediate"];
124
- readonly cited_by: "draw";
125
- }, {
126
- readonly id: "landing_attestation";
127
- readonly verifies: "`acceptance` and `merge` both attest a completed landing.";
121
+ readonly id: "run_start_dirt";
122
+ readonly verifies: "No file the landed commit changed overlaps dirt that pre-dated the run.";
128
123
  readonly draws: readonly ["remediate"];
129
124
  readonly cited_by: "draw";
130
125
  }, {
@@ -1 +1 @@
1
- {"version":3,"file":"ingestionChecks.d.ts","sourceRoot":"","sources":["../../../src/shared/submission/ingestionChecks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,eAAO,MAAM,eAAe;;;;;;EAGlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAEnE,0CAA0C;AAC1C,eAAO,MAAM,uBAAuB,4CAA4C,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4HiB,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAEvE,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,gBAAgB,EAAE,CAIrF;AAED,0EAA0E;AAC1E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,cAAc,CAAC,UAAU,CAAC,EACnC,IAAI,CAAC,EAAE,aAAa,GACnB,SAAS,gBAAgB,EAAE,CAM7B"}
1
+ {"version":3,"file":"ingestionChecks.d.ts","sourceRoot":"","sources":["../../../src/shared/submission/ingestionChecks.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,eAAO,MAAM,eAAe;;;;;;EAGlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAEnE,0CAA0C;AAC1C,eAAO,MAAM,uBAAuB,4CAA4C,CAAC;AAEjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqHiB,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAEvE,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,gBAAgB,EAAE,CAIrF;AAED,0EAA0E;AAC1E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,cAAc,CAAC,UAAU,CAAC,EACnC,IAAI,CAAC,EAAE,aAAa,GACnB,SAAS,gBAAgB,EAAE,CAM7B"}
@@ -1,3 +1,4 @@
1
+ // sites-pinned: tests/shared/ingestion-checks-drift.test.ts, tests/remediate/host-handoff-corroboration.test.ts
1
2
  /**
2
3
  * The ONE declared list of checks result ingestion performs before it accepts a
3
4
  * host result — the source `docs/audit-pkg/contracts.md`'s check block is
@@ -97,20 +98,20 @@ export const INGESTION_CHECKS = [
97
98
  cited_by: "draw",
98
99
  },
99
100
  {
100
- id: "write_scope",
101
- verifies: "`changed_files` is non-empty, sorted, unique and normalized, lies within the prompt-bound `allowed_files`, and equals the files the landed commit actually changed.",
101
+ id: "landed_commit",
102
+ verifies: "`landed_commit` is a full commit id that exists, is not the workload baseline, changes at least one file, descends from the baseline (waived only under a genuinely orphaned baseline in recovery), and is reachable from HEAD.",
102
103
  draws: ["remediate"],
103
104
  cited_by: "draw",
104
105
  },
105
106
  {
106
- id: "commit_evidence",
107
- verifies: "`commit_evidence` binds the workload baseline to a distinct landed commit; both exist, the baseline is an ancestor of the landed commit (waived only under a genuinely orphaned baseline in recovery), and the landed commit is reachable from HEAD.",
107
+ id: "write_scope",
108
+ verifies: "Every file the landed commit changed, as git reports it, lies within the prompt-bound `allowed_files`.",
108
109
  draws: ["remediate"],
109
110
  cited_by: "draw",
110
111
  },
111
112
  {
112
- id: "test_evidence",
113
- verifies: "`test_evidence` carries exactly one passed entry per required test echoing the bound command, and the tool's own mechanical rerun of those tests passes.",
113
+ id: "required_tests",
114
+ verifies: "The tool's own rerun of every prompt-bound required test passes on the tree that holds the landed commit.",
114
115
  draws: ["remediate"],
115
116
  cited_by: "draw",
116
117
  },
@@ -121,14 +122,8 @@ export const INGESTION_CHECKS = [
121
122
  cited_by: "draw",
122
123
  },
123
124
  {
124
- id: "worktree_evidence",
125
- verifies: "`worktree_evidence` binds the workload baseline and the same changed-file list, and no landed file overlaps dirt that pre-dated the run.",
126
- draws: ["remediate"],
127
- cited_by: "draw",
128
- },
129
- {
130
- id: "landing_attestation",
131
- verifies: "`acceptance` and `merge` both attest a completed landing.",
125
+ id: "run_start_dirt",
126
+ verifies: "No file the landed commit changed overlaps dirt that pre-dated the run.",
132
127
  draws: ["remediate"],
133
128
  cited_by: "draw",
134
129
  },
@@ -1 +1 @@
1
- {"version":3,"file":"ingestionChecks.js","sourceRoot":"","sources":["../../../src/shared/submission/ingestionChecks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ingestionChecks.js","sourceRoot":"","sources":["../../../src/shared/submission/ingestionChecks.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
1
  import type { IngestionCheckId } from "./ingestionChecks.js";
2
2
  export declare const SUBMISSION_ISSUE_CODES: readonly ["submission_missing", "submission_malformed", "submission_contract_invalid", "submission_rejected", "duplicate_submission_id"];
3
3
  export type SubmissionIssueCode = (typeof SUBMISSION_ISSUE_CODES)[number];
4
+ /**
5
+ * The workload codes both draws share. Not a submission code — it names no
6
+ * result — so it is a separate tuple each draw spreads into its own vocabulary.
7
+ */
8
+ export declare const WORKLOAD_ISSUE_CODES: readonly ["workload_stale"];
9
+ export type WorkloadIssueCode = (typeof WORKLOAD_ISSUE_CODES)[number];
4
10
  /**
5
11
  * One classified failure. `TCode` widens for a draw that adds its own domain
6
12
  * codes; the base parameterization is the shared vocabulary above — see
@@ -1 +1 @@
1
- {"version":3,"file":"submissionClassifier.d.ts","sourceRoot":"","sources":["../../../src/shared/submission/submissionClassifier.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,eAAO,MAAM,sBAAsB,0IAWzB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,SAAS,MAAM,GAAG,mBAAmB;IACzE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,gFAAgF;AAChF,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAExD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC,CA0BhC;AAED,+EAA+E;AAC/E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,qBAAqB,GAC7B,eAAe,GAAG,IAAI,CAkBxB"}
1
+ {"version":3,"file":"submissionClassifier.d.ts","sourceRoot":"","sources":["../../../src/shared/submission/submissionClassifier.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,eAAO,MAAM,sBAAsB,0IAWzB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,oBAAoB,6BAUvB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,SAAS,MAAM,GAAG,mBAAmB;IACzE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,gFAAgF;AAChF,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAExD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,CAAC,CA0BhC;AAED,+EAA+E;AAC/E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,qBAAqB,GAC7B,eAAe,GAAG,IAAI,CAkBxB"}
@@ -1,3 +1,4 @@
1
+ // sites-pinned: tests/shared/ingest-report.test.ts, tests/remediate/host-handoff.test.ts
1
2
  /**
2
3
  * The ONE failure vocabulary for a host submission both orchestrators read.
3
4
  *
@@ -26,6 +27,21 @@ export const SUBMISSION_ISSUE_CODES = [
26
27
  /** A second submission re-uses an identity already accepted this run. */
27
28
  "duplicate_submission_id",
28
29
  ];
30
+ /**
31
+ * The workload codes both draws share. Not a submission code — it names no
32
+ * result — so it is a separate tuple each draw spreads into its own vocabulary.
33
+ */
34
+ export const WORKLOAD_ISSUE_CODES = [
35
+ /**
36
+ * The persisted host workload was issued under a contract version this build
37
+ * no longer mints, so no submission can be accepted against it. RECOVERABLE
38
+ * BY EXACTLY ONE ACTION — re-prepare, which publishes a current workload — and
39
+ * the tool takes that action itself in the same call, so the code is
40
+ * distinct from a workload whose bytes are wrong. The trigger is a
41
+ * contract-version bump that changed the work item's shape or its prompt.
42
+ */
43
+ "workload_stale",
44
+ ];
29
45
  /**
30
46
  * Read the bytes at a bound path and classify the outcome. A file that is not
31
47
  * there and a file that will not parse are DIFFERENT answers; every other IO
@@ -1 +1 @@
1
- {"version":3,"file":"submissionClassifier.js","sourceRoot":"","sources":["../../../src/shared/submission/submissionClassifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,wCAAwC;IACxC,oBAAoB;IACpB,0DAA0D;IAC1D,sBAAsB;IACtB,kEAAkE;IAClE,6BAA6B;IAC7B,8DAA8D;IAC9D,qBAAqB;IACrB,yEAAyE;IACzE,yBAAyB;CACjB,CAAC;AAsCX;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,YAAoB;IAEpB,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,yEAAyE;QACzE,0EAA0E;QAC1E,wEAAwE;QACxE,0CAA0C;QAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAY,EAAE,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC;AASD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,OAA8B,EAC9B,OAA8B;IAE9B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,QAAQ,GAAG;QACf,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,eAAe,EAAE,OAAO,CAAC,cAAc;KAC/B,CAAC;IACX,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,SAAS,OAAO,CAAC,IAAI,uCAAuC;YACrE,GAAG,QAAQ;SACZ,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,SAAS,OAAO,CAAC,IAAI,wCAAwC,OAAO,CAAC,MAAM,EAAE;QACtF,GAAG,QAAQ;KACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"submissionClassifier.js","sourceRoot":"","sources":["../../../src/shared/submission/submissionClassifier.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,wCAAwC;IACxC,oBAAoB;IACpB,0DAA0D;IAC1D,sBAAsB;IACtB,kEAAkE;IAClE,6BAA6B;IAC7B,8DAA8D;IAC9D,qBAAqB;IACrB,yEAAyE;IACzE,yBAAyB;CACjB,CAAC;AAIX;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC;;;;;;;OAOG;IACH,gBAAgB;CACR,CAAC;AAsCX;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,YAAoB;IAEpB,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,yEAAyE;QACzE,0EAA0E;QAC1E,wEAAwE;QACxE,0CAA0C;QAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAY,EAAE,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC;AASD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,OAA8B,EAC9B,OAA8B;IAE9B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,QAAQ,GAAG;QACf,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,eAAe,EAAE,OAAO,CAAC,cAAc;KAC/B,CAAC;IACX,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,SAAS,OAAO,CAAC,IAAI,uCAAuC;YACrE,GAAG,QAAQ;SACZ,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,SAAS,OAAO,CAAC,IAAI,wCAAwC,OAAO,CAAC,MAAM,EAAE;QACtF,GAAG,QAAQ;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /** A worker prompt as both draws persist it on a work item. */
2
+ interface BoundWorkerPrompt {
3
+ readonly text: string;
4
+ readonly sha256: string;
5
+ }
6
+ /**
7
+ * Bind a prompt body to its result template. `renderTail` receives the body
8
+ * digest and returns the template text — the caller derives the result id from
9
+ * the same digest with `deriveResultId`.
10
+ */
11
+ export declare function bindWorkerPrompt(body: string, renderTail: (promptDigest: string) => string): BoundWorkerPrompt;
12
+ /**
13
+ * Does a persisted prompt hold its binding: the text ends with the template the
14
+ * digest renders, and the digest is the digest of the text above it?
15
+ */
16
+ export declare function workerPromptBindingHolds(prompt: BoundWorkerPrompt, renderTail: (promptDigest: string) => string): boolean;
17
+ export {};
18
+ //# sourceMappingURL=workerPromptBinding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerPromptBinding.d.ts","sourceRoot":"","sources":["../../../src/shared/submission/workerPromptBinding.ts"],"names":[],"mappings":"AAiBA,+DAA+D;AAC/D,UAAU,iBAAiB;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAKD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAC3C,iBAAiB,CAGnB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAC3C,OAAO,CAIT"}
@@ -0,0 +1,38 @@
1
+ // sites-pinned: tests/remediate/host-handoff.test.ts, tests/audit/host-handoff.test.ts
2
+ // (both draws bind their worker prompts here, so a change to where the digest
3
+ // stops moves every `prompt_sha256` the tests re-derive from the prompt text)
4
+ /**
5
+ * THE worker-prompt binding both draws share (owner review of prompt 20,
6
+ * 2026-09-18).
7
+ *
8
+ * A worker prompt ENDS with the result the tool expects, as a JSON template
9
+ * whose identity values — run id, work item id, result id, prompt digest — the
10
+ * tool fills in. The worker copies them; it never derives, chooses or looks
11
+ * them up. A text cannot carry its own digest, so the digest covers the BODY:
12
+ * the text above the template. The template is then a pure function of the
13
+ * digest, so the whole text is still re-derivable from the digest and the
14
+ * body, and a parse can check both halves.
15
+ */
16
+ import { promptSha256 } from "./hostHandoffCore.js";
17
+ /** The separator between the body and the template. */
18
+ const BODY_TAIL_SEPARATOR = "\n\n";
19
+ /**
20
+ * Bind a prompt body to its result template. `renderTail` receives the body
21
+ * digest and returns the template text — the caller derives the result id from
22
+ * the same digest with `deriveResultId`.
23
+ */
24
+ export function bindWorkerPrompt(body, renderTail) {
25
+ const digest = promptSha256(body);
26
+ return { text: `${body}${BODY_TAIL_SEPARATOR}${renderTail(digest)}`, sha256: digest };
27
+ }
28
+ /**
29
+ * Does a persisted prompt hold its binding: the text ends with the template the
30
+ * digest renders, and the digest is the digest of the text above it?
31
+ */
32
+ export function workerPromptBindingHolds(prompt, renderTail) {
33
+ const tail = `${BODY_TAIL_SEPARATOR}${renderTail(prompt.sha256)}`;
34
+ if (!prompt.text.endsWith(tail))
35
+ return false;
36
+ return promptSha256(prompt.text.slice(0, prompt.text.length - tail.length)) === prompt.sha256;
37
+ }
38
+ //# sourceMappingURL=workerPromptBinding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerPromptBinding.js","sourceRoot":"","sources":["../../../src/shared/submission/workerPromptBinding.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,8EAA8E;AAC9E,8EAA8E;AAC9E;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAQpD,uDAAuD;AACvD,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,UAA4C;IAE5C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACxF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAyB,EACzB,UAA4C;IAE5C,MAAM,IAAI,GAAG,GAAG,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC;AAChG,CAAC"}
@@ -150,6 +150,30 @@ export declare function quoteForCmd(arg: string): string;
150
150
  */
151
151
  export declare function shellQuote(arg: string, platform?: NodeJS.Platform): string;
152
152
  export declare function toPromptPathToken(value: string): string;
153
+ /**
154
+ * Every win32 ABSOLUTE path inside a free-text prompt body, forward-slashed.
155
+ *
156
+ * {@link toPromptPathToken} normalizes one whole token, which is what a step
157
+ * contract's path FIELDS are. A prompt body is a free string: a renderer
158
+ * interpolates a path into a sentence, so the same file reaches the reader
159
+ * backslashed in the prose and forward-slashed in the field beside it. A
160
+ * backslashed path breaks in every bash-like shell the reader may paste it
161
+ * into, and the disagreement itself makes the reader guess which form the tool
162
+ * means.
163
+ *
164
+ * ANCHORED ON A DRIVE LETTER OR A UNC ROOT, deliberately. The relative forms
165
+ * `toPromptPathToken` also accepts (`.\x`, `a\b.json`) are not recognized here:
166
+ * inside free text they are indistinguishable from a regular expression, an
167
+ * escape sequence, or a code sample, and rewriting one of those would corrupt
168
+ * prompt content. An absolute path has no such collision.
169
+ *
170
+ * A match ends at whitespace, so a path holding a SPACE is normalized up to
171
+ * that space. The result still agrees with what {@link toPromptPathToken} puts
172
+ * in the path field beside it, because the remainder of such a path holds no
173
+ * further separator to convert. Quoting a path with a space is the reader's
174
+ * problem either way, and free text cannot solve it.
175
+ */
176
+ export declare function normalizePromptBodyPaths(body: string): string;
153
177
  /**
154
178
  * Quote a single argv token for a *rendered command line* that this tool
155
179
  * hands a host agent to run verbatim — the host may paste it into posix sh,
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/shared/tooling/exec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/shared/tooling/exec.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
+ // sites-pinned: tests/shared/step-contract-writer.test.ts, tests/audit/semantic-review-step.test.ts
2
+ // (the prompt-path helpers decide how every written prompt states a path;
3
+ // broadening the match corrupts non-path text, narrowing it leaves a
4
+ // backslashed path in the body)
1
5
  import { spawn, spawnSync } from "node:child_process";
2
6
  import { win32 } from "node:path";
3
7
  const SHELL_SHIM_COMMANDS = new Set(["npm", "npx", "pnpm", "yarn"]);
@@ -224,6 +228,32 @@ function isPromptPathToken(value) {
224
228
  export function toPromptPathToken(value) {
225
229
  return isPromptPathToken(value) ? value.replace(/\\/g, "/") : value;
226
230
  }
231
+ /**
232
+ * Every win32 ABSOLUTE path inside a free-text prompt body, forward-slashed.
233
+ *
234
+ * {@link toPromptPathToken} normalizes one whole token, which is what a step
235
+ * contract's path FIELDS are. A prompt body is a free string: a renderer
236
+ * interpolates a path into a sentence, so the same file reaches the reader
237
+ * backslashed in the prose and forward-slashed in the field beside it. A
238
+ * backslashed path breaks in every bash-like shell the reader may paste it
239
+ * into, and the disagreement itself makes the reader guess which form the tool
240
+ * means.
241
+ *
242
+ * ANCHORED ON A DRIVE LETTER OR A UNC ROOT, deliberately. The relative forms
243
+ * `toPromptPathToken` also accepts (`.\x`, `a\b.json`) are not recognized here:
244
+ * inside free text they are indistinguishable from a regular expression, an
245
+ * escape sequence, or a code sample, and rewriting one of those would corrupt
246
+ * prompt content. An absolute path has no such collision.
247
+ *
248
+ * A match ends at whitespace, so a path holding a SPACE is normalized up to
249
+ * that space. The result still agrees with what {@link toPromptPathToken} puts
250
+ * in the path field beside it, because the remainder of such a path holds no
251
+ * further separator to convert. Quoting a path with a space is the reader's
252
+ * problem either way, and free text cannot solve it.
253
+ */
254
+ export function normalizePromptBodyPaths(body) {
255
+ return body.replace(/(?:[A-Za-z]:\\|\\\\[^\\\s"'`]+\\)[^\s"'`<>|]*/gu, (match) => match.replace(/\\/g, "/"));
256
+ }
227
257
  // Tokens matching this charset need no quoting in any of the three dialects
228
258
  // `renderPromptCommand` targets (posix sh, PowerShell, cmd.exe). Anything
229
259
  // outside it — spaces, quotes, and shell metacharacters such as `& | < > ^ %