@dewtech/dare-cli 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/README.md +2 -0
  2. package/dist/__tests__/dag-runner/ralph-loop.test.js +107 -45
  3. package/dist/__tests__/dag-runner/ralph-loop.test.js.map +1 -1
  4. package/dist/__tests__/dag-runner/state-store.test.d.ts +2 -0
  5. package/dist/__tests__/dag-runner/state-store.test.d.ts.map +1 -0
  6. package/dist/__tests__/dag-runner/state-store.test.js +74 -0
  7. package/dist/__tests__/dag-runner/state-store.test.js.map +1 -0
  8. package/dist/__tests__/ide-command-parity.test.js +1 -0
  9. package/dist/__tests__/ide-command-parity.test.js.map +1 -1
  10. package/dist/__tests__/project-generator.test.d.ts +2 -0
  11. package/dist/__tests__/project-generator.test.d.ts.map +1 -0
  12. package/dist/__tests__/project-generator.test.js +56 -0
  13. package/dist/__tests__/project-generator.test.js.map +1 -0
  14. package/dist/bin/dare.js +2 -0
  15. package/dist/bin/dare.js.map +1 -1
  16. package/dist/commands/__tests__/bench.spec.d.ts +2 -0
  17. package/dist/commands/__tests__/bench.spec.d.ts.map +1 -0
  18. package/dist/commands/__tests__/bench.spec.js +106 -0
  19. package/dist/commands/__tests__/bench.spec.js.map +1 -0
  20. package/dist/commands/__tests__/execute.best-of.spec.d.ts +2 -0
  21. package/dist/commands/__tests__/execute.best-of.spec.d.ts.map +1 -0
  22. package/dist/commands/__tests__/execute.best-of.spec.js +24 -0
  23. package/dist/commands/__tests__/execute.best-of.spec.js.map +1 -0
  24. package/dist/commands/__tests__/execute.telemetry.spec.d.ts +2 -0
  25. package/dist/commands/__tests__/execute.telemetry.spec.d.ts.map +1 -0
  26. package/dist/commands/__tests__/execute.telemetry.spec.js +93 -0
  27. package/dist/commands/__tests__/execute.telemetry.spec.js.map +1 -0
  28. package/dist/commands/__tests__/execute.verify.spec.d.ts +2 -0
  29. package/dist/commands/__tests__/execute.verify.spec.d.ts.map +1 -0
  30. package/dist/commands/__tests__/execute.verify.spec.js +150 -0
  31. package/dist/commands/__tests__/execute.verify.spec.js.map +1 -0
  32. package/dist/commands/bench.d.ts +10 -0
  33. package/dist/commands/bench.d.ts.map +1 -0
  34. package/dist/commands/bench.js +64 -0
  35. package/dist/commands/bench.js.map +1 -0
  36. package/dist/commands/execute-verification.d.ts +51 -0
  37. package/dist/commands/execute-verification.d.ts.map +1 -0
  38. package/dist/commands/execute-verification.js +201 -0
  39. package/dist/commands/execute-verification.js.map +1 -0
  40. package/dist/commands/execute.d.ts.map +1 -1
  41. package/dist/commands/execute.js +139 -2
  42. package/dist/commands/execute.js.map +1 -1
  43. package/dist/dag-runner/ralph-loop.d.ts +9 -9
  44. package/dist/dag-runner/ralph-loop.d.ts.map +1 -1
  45. package/dist/dag-runner/ralph-loop.js +89 -113
  46. package/dist/dag-runner/ralph-loop.js.map +1 -1
  47. package/dist/dag-runner/state-store.d.ts +14 -1
  48. package/dist/dag-runner/state-store.d.ts.map +1 -1
  49. package/dist/dag-runner/state-store.js +39 -8
  50. package/dist/dag-runner/state-store.js.map +1 -1
  51. package/dist/exec/npm-invoke.d.ts +8 -0
  52. package/dist/exec/npm-invoke.d.ts.map +1 -0
  53. package/dist/exec/npm-invoke.js +45 -0
  54. package/dist/exec/npm-invoke.js.map +1 -0
  55. package/dist/exec/safe-spawn.d.ts +21 -0
  56. package/dist/exec/safe-spawn.d.ts.map +1 -0
  57. package/dist/exec/safe-spawn.js +108 -0
  58. package/dist/exec/safe-spawn.js.map +1 -0
  59. package/dist/graphrag/types.d.ts +2 -2
  60. package/dist/graphrag/types.d.ts.map +1 -1
  61. package/dist/stacks/dna-emitter.d.ts.map +1 -1
  62. package/dist/stacks/dna-emitter.js +1 -10
  63. package/dist/stacks/dna-emitter.js.map +1 -1
  64. package/dist/utils/UpdateApplier.d.ts.map +1 -1
  65. package/dist/utils/UpdateApplier.js +8 -0
  66. package/dist/utils/UpdateApplier.js.map +1 -1
  67. package/dist/utils/logger.d.ts +7 -0
  68. package/dist/utils/logger.d.ts.map +1 -0
  69. package/dist/utils/logger.js +23 -0
  70. package/dist/utils/logger.js.map +1 -0
  71. package/dist/utils/path-safety.d.ts +22 -0
  72. package/dist/utils/path-safety.d.ts.map +1 -0
  73. package/dist/utils/path-safety.js +83 -0
  74. package/dist/utils/path-safety.js.map +1 -0
  75. package/dist/utils/project-generator.d.ts.map +1 -1
  76. package/dist/utils/project-generator.js +2 -0
  77. package/dist/utils/project-generator.js.map +1 -1
  78. package/dist/utils/stack-bootstrap.js +2 -2
  79. package/dist/utils/stack-bootstrap.js.map +1 -1
  80. package/dist/verification/__tests__/anti-tamper.test.d.ts +2 -0
  81. package/dist/verification/__tests__/anti-tamper.test.d.ts.map +1 -0
  82. package/dist/verification/__tests__/anti-tamper.test.js +73 -0
  83. package/dist/verification/__tests__/anti-tamper.test.js.map +1 -0
  84. package/dist/verification/__tests__/bench-fixtures.test.d.ts +2 -0
  85. package/dist/verification/__tests__/bench-fixtures.test.d.ts.map +1 -0
  86. package/dist/verification/__tests__/bench-fixtures.test.js +35 -0
  87. package/dist/verification/__tests__/bench-fixtures.test.js.map +1 -0
  88. package/dist/verification/__tests__/bench-harness.test.d.ts +2 -0
  89. package/dist/verification/__tests__/bench-harness.test.d.ts.map +1 -0
  90. package/dist/verification/__tests__/bench-harness.test.js +75 -0
  91. package/dist/verification/__tests__/bench-harness.test.js.map +1 -0
  92. package/dist/verification/__tests__/bench-report.test.d.ts +2 -0
  93. package/dist/verification/__tests__/bench-report.test.d.ts.map +1 -0
  94. package/dist/verification/__tests__/bench-report.test.js +73 -0
  95. package/dist/verification/__tests__/bench-report.test.js.map +1 -0
  96. package/dist/verification/__tests__/best-of-n-runner.test.d.ts +2 -0
  97. package/dist/verification/__tests__/best-of-n-runner.test.d.ts.map +1 -0
  98. package/dist/verification/__tests__/best-of-n-runner.test.js +94 -0
  99. package/dist/verification/__tests__/best-of-n-runner.test.js.map +1 -0
  100. package/dist/verification/__tests__/config.test.d.ts +2 -0
  101. package/dist/verification/__tests__/config.test.d.ts.map +1 -0
  102. package/dist/verification/__tests__/config.test.js +50 -0
  103. package/dist/verification/__tests__/config.test.js.map +1 -0
  104. package/dist/verification/__tests__/decay-policy.test.d.ts +2 -0
  105. package/dist/verification/__tests__/decay-policy.test.d.ts.map +1 -0
  106. package/dist/verification/__tests__/decay-policy.test.js +130 -0
  107. package/dist/verification/__tests__/decay-policy.test.js.map +1 -0
  108. package/dist/verification/__tests__/fail-to-pass.test.d.ts +2 -0
  109. package/dist/verification/__tests__/fail-to-pass.test.d.ts.map +1 -0
  110. package/dist/verification/__tests__/fail-to-pass.test.js +107 -0
  111. package/dist/verification/__tests__/fail-to-pass.test.js.map +1 -0
  112. package/dist/verification/__tests__/failure-signature.test.d.ts +2 -0
  113. package/dist/verification/__tests__/failure-signature.test.d.ts.map +1 -0
  114. package/dist/verification/__tests__/failure-signature.test.js +40 -0
  115. package/dist/verification/__tests__/failure-signature.test.js.map +1 -0
  116. package/dist/verification/__tests__/logger.test.d.ts +2 -0
  117. package/dist/verification/__tests__/logger.test.d.ts.map +1 -0
  118. package/dist/verification/__tests__/logger.test.js +23 -0
  119. package/dist/verification/__tests__/logger.test.js.map +1 -0
  120. package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts +2 -0
  121. package/dist/verification/__tests__/mutation-cargo-mutants.test.d.ts.map +1 -0
  122. package/dist/verification/__tests__/mutation-cargo-mutants.test.js +96 -0
  123. package/dist/verification/__tests__/mutation-cargo-mutants.test.js.map +1 -0
  124. package/dist/verification/__tests__/mutation-infection.test.d.ts +2 -0
  125. package/dist/verification/__tests__/mutation-infection.test.d.ts.map +1 -0
  126. package/dist/verification/__tests__/mutation-infection.test.js +101 -0
  127. package/dist/verification/__tests__/mutation-infection.test.js.map +1 -0
  128. package/dist/verification/__tests__/mutation-mutmut.test.d.ts +2 -0
  129. package/dist/verification/__tests__/mutation-mutmut.test.d.ts.map +1 -0
  130. package/dist/verification/__tests__/mutation-mutmut.test.js +102 -0
  131. package/dist/verification/__tests__/mutation-mutmut.test.js.map +1 -0
  132. package/dist/verification/__tests__/mutation-registry.test.d.ts +2 -0
  133. package/dist/verification/__tests__/mutation-registry.test.d.ts.map +1 -0
  134. package/dist/verification/__tests__/mutation-registry.test.js +28 -0
  135. package/dist/verification/__tests__/mutation-registry.test.js.map +1 -0
  136. package/dist/verification/__tests__/mutation-stryker.test.d.ts +2 -0
  137. package/dist/verification/__tests__/mutation-stryker.test.d.ts.map +1 -0
  138. package/dist/verification/__tests__/mutation-stryker.test.js +88 -0
  139. package/dist/verification/__tests__/mutation-stryker.test.js.map +1 -0
  140. package/dist/verification/__tests__/no-shell-true.test.d.ts +2 -0
  141. package/dist/verification/__tests__/no-shell-true.test.d.ts.map +1 -0
  142. package/dist/verification/__tests__/no-shell-true.test.js +43 -0
  143. package/dist/verification/__tests__/no-shell-true.test.js.map +1 -0
  144. package/dist/verification/__tests__/path-safety.test.d.ts +2 -0
  145. package/dist/verification/__tests__/path-safety.test.d.ts.map +1 -0
  146. package/dist/verification/__tests__/path-safety.test.js +59 -0
  147. package/dist/verification/__tests__/path-safety.test.js.map +1 -0
  148. package/dist/verification/__tests__/prerank.test.d.ts +2 -0
  149. package/dist/verification/__tests__/prerank.test.d.ts.map +1 -0
  150. package/dist/verification/__tests__/prerank.test.js +44 -0
  151. package/dist/verification/__tests__/prerank.test.js.map +1 -0
  152. package/dist/verification/__tests__/runner.test.d.ts +2 -0
  153. package/dist/verification/__tests__/runner.test.d.ts.map +1 -0
  154. package/dist/verification/__tests__/runner.test.js +200 -0
  155. package/dist/verification/__tests__/runner.test.js.map +1 -0
  156. package/dist/verification/__tests__/safe-spawn.test.d.ts +2 -0
  157. package/dist/verification/__tests__/safe-spawn.test.d.ts.map +1 -0
  158. package/dist/verification/__tests__/safe-spawn.test.js +36 -0
  159. package/dist/verification/__tests__/safe-spawn.test.js.map +1 -0
  160. package/dist/verification/__tests__/security.test.d.ts +2 -0
  161. package/dist/verification/__tests__/security.test.d.ts.map +1 -0
  162. package/dist/verification/__tests__/security.test.js +79 -0
  163. package/dist/verification/__tests__/security.test.js.map +1 -0
  164. package/dist/verification/__tests__/selector-pareto.test.d.ts +2 -0
  165. package/dist/verification/__tests__/selector-pareto.test.d.ts.map +1 -0
  166. package/dist/verification/__tests__/selector-pareto.test.js +77 -0
  167. package/dist/verification/__tests__/selector-pareto.test.js.map +1 -0
  168. package/dist/verification/__tests__/telemetry.test.d.ts +2 -0
  169. package/dist/verification/__tests__/telemetry.test.d.ts.map +1 -0
  170. package/dist/verification/__tests__/telemetry.test.js +116 -0
  171. package/dist/verification/__tests__/telemetry.test.js.map +1 -0
  172. package/dist/verification/__tests__/type-check.test.d.ts +2 -0
  173. package/dist/verification/__tests__/type-check.test.d.ts.map +1 -0
  174. package/dist/verification/__tests__/type-check.test.js +52 -0
  175. package/dist/verification/__tests__/type-check.test.js.map +1 -0
  176. package/dist/verification/__tests__/worktree.test.d.ts +2 -0
  177. package/dist/verification/__tests__/worktree.test.d.ts.map +1 -0
  178. package/dist/verification/__tests__/worktree.test.js +41 -0
  179. package/dist/verification/__tests__/worktree.test.js.map +1 -0
  180. package/dist/verification/bench/fixtures.d.ts +11 -0
  181. package/dist/verification/bench/fixtures.d.ts.map +1 -0
  182. package/dist/verification/bench/fixtures.js +66 -0
  183. package/dist/verification/bench/fixtures.js.map +1 -0
  184. package/dist/verification/bench/harness.d.ts +19 -0
  185. package/dist/verification/bench/harness.d.ts.map +1 -0
  186. package/dist/verification/bench/harness.js +138 -0
  187. package/dist/verification/bench/harness.js.map +1 -0
  188. package/dist/verification/bench/report.d.ts +53 -0
  189. package/dist/verification/bench/report.d.ts.map +1 -0
  190. package/dist/verification/bench/report.js +47 -0
  191. package/dist/verification/bench/report.js.map +1 -0
  192. package/dist/verification/best-of-n/runner.d.ts +29 -0
  193. package/dist/verification/best-of-n/runner.d.ts.map +1 -0
  194. package/dist/verification/best-of-n/runner.js +76 -0
  195. package/dist/verification/best-of-n/runner.js.map +1 -0
  196. package/dist/verification/best-of-n/selector/pareto.d.ts +10 -0
  197. package/dist/verification/best-of-n/selector/pareto.d.ts.map +1 -0
  198. package/dist/verification/best-of-n/selector/pareto.js +65 -0
  199. package/dist/verification/best-of-n/selector/pareto.js.map +1 -0
  200. package/dist/verification/best-of-n/selector/prerank.d.ts +23 -0
  201. package/dist/verification/best-of-n/selector/prerank.d.ts.map +1 -0
  202. package/dist/verification/best-of-n/selector/prerank.js +32 -0
  203. package/dist/verification/best-of-n/selector/prerank.js.map +1 -0
  204. package/dist/verification/best-of-n/worktree.d.ts +9 -0
  205. package/dist/verification/best-of-n/worktree.d.ts.map +1 -0
  206. package/dist/verification/best-of-n/worktree.js +100 -0
  207. package/dist/verification/best-of-n/worktree.js.map +1 -0
  208. package/dist/verification/config.d.ts +24 -0
  209. package/dist/verification/config.d.ts.map +1 -0
  210. package/dist/verification/config.js +168 -0
  211. package/dist/verification/config.js.map +1 -0
  212. package/dist/verification/decay/policy.d.ts +16 -0
  213. package/dist/verification/decay/policy.d.ts.map +1 -0
  214. package/dist/verification/decay/policy.js +64 -0
  215. package/dist/verification/decay/policy.js.map +1 -0
  216. package/dist/verification/decay/signature.d.ts +6 -0
  217. package/dist/verification/decay/signature.d.ts.map +1 -0
  218. package/dist/verification/decay/signature.js +18 -0
  219. package/dist/verification/decay/signature.js.map +1 -0
  220. package/dist/verification/gates/anti-tamper.d.ts +16 -0
  221. package/dist/verification/gates/anti-tamper.d.ts.map +1 -0
  222. package/dist/verification/gates/anti-tamper.js +142 -0
  223. package/dist/verification/gates/anti-tamper.js.map +1 -0
  224. package/dist/verification/gates/fail-to-pass.d.ts +39 -0
  225. package/dist/verification/gates/fail-to-pass.d.ts.map +1 -0
  226. package/dist/verification/gates/fail-to-pass.js +173 -0
  227. package/dist/verification/gates/fail-to-pass.js.map +1 -0
  228. package/dist/verification/gates/mutation/adapter.d.ts +34 -0
  229. package/dist/verification/gates/mutation/adapter.d.ts.map +1 -0
  230. package/dist/verification/gates/mutation/adapter.js +22 -0
  231. package/dist/verification/gates/mutation/adapter.js.map +1 -0
  232. package/dist/verification/gates/mutation/cargo-mutants.d.ts +28 -0
  233. package/dist/verification/gates/mutation/cargo-mutants.d.ts.map +1 -0
  234. package/dist/verification/gates/mutation/cargo-mutants.js +170 -0
  235. package/dist/verification/gates/mutation/cargo-mutants.js.map +1 -0
  236. package/dist/verification/gates/mutation/infection.d.ts +28 -0
  237. package/dist/verification/gates/mutation/infection.d.ts.map +1 -0
  238. package/dist/verification/gates/mutation/infection.js +149 -0
  239. package/dist/verification/gates/mutation/infection.js.map +1 -0
  240. package/dist/verification/gates/mutation/mutmut.d.ts +23 -0
  241. package/dist/verification/gates/mutation/mutmut.d.ts.map +1 -0
  242. package/dist/verification/gates/mutation/mutmut.js +148 -0
  243. package/dist/verification/gates/mutation/mutmut.js.map +1 -0
  244. package/dist/verification/gates/mutation/stryker.d.ts +19 -0
  245. package/dist/verification/gates/mutation/stryker.d.ts.map +1 -0
  246. package/dist/verification/gates/mutation/stryker.js +103 -0
  247. package/dist/verification/gates/mutation/stryker.js.map +1 -0
  248. package/dist/verification/gates/type-check.d.ts +11 -0
  249. package/dist/verification/gates/type-check.d.ts.map +1 -0
  250. package/dist/verification/gates/type-check.js +84 -0
  251. package/dist/verification/gates/type-check.js.map +1 -0
  252. package/dist/verification/registry.d.ts +6 -0
  253. package/dist/verification/registry.d.ts.map +1 -0
  254. package/dist/verification/registry.js +49 -0
  255. package/dist/verification/registry.js.map +1 -0
  256. package/dist/verification/runner.d.ts +27 -0
  257. package/dist/verification/runner.d.ts.map +1 -0
  258. package/dist/verification/runner.js +173 -0
  259. package/dist/verification/runner.js.map +1 -0
  260. package/dist/verification/telemetry.d.ts +18 -0
  261. package/dist/verification/telemetry.d.ts.map +1 -0
  262. package/dist/verification/telemetry.js +71 -0
  263. package/dist/verification/telemetry.js.map +1 -0
  264. package/dist/verification/types.d.ts +89 -0
  265. package/dist/verification/types.d.ts.map +1 -0
  266. package/dist/verification/types.js +3 -0
  267. package/dist/verification/types.js.map +1 -0
  268. package/package.json +5 -3
  269. package/templates/UPDATE-MANIFEST.json +20 -0
  270. package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -0
  271. package/templates/ide/claude/.claude/commands/dare-bench.md +18 -0
  272. package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -0
@@ -0,0 +1,10 @@
1
+ import type { Candidate } from '../../types.js';
2
+ export declare class NoViableCandidateError extends Error {
3
+ constructor(message?: string);
4
+ }
5
+ /**
6
+ * Pareto-dominant candidate over test/lint/type/mutation aspects.
7
+ * Candidates with any FAIL aspect are discarded first.
8
+ */
9
+ export declare function selectByPareto(candidates: ReadonlyArray<Candidate>): Candidate;
10
+ //# sourceMappingURL=pareto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pareto.d.ts","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/pareto.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAK5E,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,SAA8D;CAIlF;AA6CD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,GAAG,SAAS,CAuB9E"}
@@ -0,0 +1,65 @@
1
+ const PARETO_ASPECTS = ['test', 'lint', 'type', 'mutation'];
2
+ export class NoViableCandidateError extends Error {
3
+ constructor(message = 'no viable candidate: all candidates have a failing aspect') {
4
+ super(message);
5
+ this.name = 'NoViableCandidateError';
6
+ }
7
+ }
8
+ function hasFailingAspect(result) {
9
+ return result.aspects.some((a) => a.verdict === 'FAIL');
10
+ }
11
+ function aspectValue(result, aspect) {
12
+ if (aspect === 'mutation') {
13
+ const mut = result.aspects.find((a) => a.aspect === 'mutation');
14
+ return result.mutationScore ?? mut?.score ?? 0;
15
+ }
16
+ const row = result.aspects.find((a) => a.aspect === aspect);
17
+ if (!row || row.verdict === 'SKIP')
18
+ return 0.5;
19
+ if (row.verdict === 'PASS')
20
+ return 1;
21
+ return 0;
22
+ }
23
+ function aspectVector(result) {
24
+ return {
25
+ test: aspectValue(result, 'test'),
26
+ lint: aspectValue(result, 'lint'),
27
+ type: aspectValue(result, 'type'),
28
+ mutation: aspectValue(result, 'mutation'),
29
+ };
30
+ }
31
+ function dominates(a, b) {
32
+ let strictlyBetter = false;
33
+ for (const key of PARETO_ASPECTS) {
34
+ if (a[key] < b[key])
35
+ return false;
36
+ if (a[key] > b[key])
37
+ strictlyBetter = true;
38
+ }
39
+ return strictlyBetter;
40
+ }
41
+ function compareCandidates(a, b) {
42
+ const scoreA = a.verification.mutationScore ?? 0;
43
+ const scoreB = b.verification.mutationScore ?? 0;
44
+ if (scoreB !== scoreA)
45
+ return scoreB - scoreA;
46
+ return a.id.localeCompare(b.id);
47
+ }
48
+ /**
49
+ * Pareto-dominant candidate over test/lint/type/mutation aspects.
50
+ * Candidates with any FAIL aspect are discarded first.
51
+ */
52
+ export function selectByPareto(candidates) {
53
+ const viable = candidates.filter((c) => !hasFailingAspect(c.verification));
54
+ if (viable.length === 0) {
55
+ throw new NoViableCandidateError();
56
+ }
57
+ const scored = viable.map((candidate) => ({
58
+ candidate,
59
+ vector: aspectVector(candidate.verification),
60
+ }));
61
+ const nonDominated = scored.filter(({ vector }, index) => !scored.some((other, otherIndex) => index !== otherIndex && dominates(other.vector, vector)));
62
+ const pool = nonDominated.length > 0 ? nonDominated.map((s) => s.candidate) : viable;
63
+ return [...pool].sort(compareCandidates)[0];
64
+ }
65
+ //# sourceMappingURL=pareto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pareto.js","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/pareto.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAGrE,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAO,GAAG,2DAA2D;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,MAA0B;IAClD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,MAA0B,EAAE,MAAoB;IACnE,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;QAChE,OAAO,MAAM,CAAC,aAAa,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO,GAAG,CAAC;IAC/C,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,YAAY,CAAC,MAA0B;IAC9C,OAAO;QACL,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;QACjC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;QACjC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;QACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,CAA+B,EAC/B,CAA+B;IAE/B,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAClC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;YAAE,cAAc,GAAG,IAAI,CAAC;IAC7C,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAY,EAAE,CAAY;IACnD,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC,aAAa,IAAI,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,CAAC,YAAY,CAAC,aAAa,IAAI,CAAC,CAAC;IACjD,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,CAAC;IAC9C,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,UAAoC;IACjE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,sBAAsB,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACxC,SAAS;QACT,MAAM,EAAE,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC;KAC7C,CAAC,CAAC,CAAC;IAEJ,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAChC,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CACpB,CAAC,MAAM,CAAC,IAAI,CACV,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CACpB,KAAK,KAAK,UAAU,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAC1D,CACJ,CAAC;IAEF,MAAM,IAAI,GACR,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE1E,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Exec-free candidate ordering (RF-09). RS-07: prerank NEVER authorizes DONE/PASS —
3
+ * it only produces scores in [0, 1] for reordering before verification.
4
+ */
5
+ export interface PrerankInput {
6
+ readonly id: string;
7
+ readonly diff: string;
8
+ }
9
+ export interface PrerankScore {
10
+ readonly id: string;
11
+ readonly score: number;
12
+ }
13
+ /** Documented invariant for security tests (RS-07). */
14
+ export declare const PRERANK_NEVER_AUTHORIZES_DONE: true;
15
+ /**
16
+ * Deterministic heuristic: prefer smaller diffs, fewer hunks, and test-file touches.
17
+ */
18
+ export declare function prerank(inputs: ReadonlyArray<PrerankInput>): PrerankScore[];
19
+ /** Reorder items by prerank scores (descending). Does not mutate verification verdicts. */
20
+ export declare function reorderByPrerank<T extends {
21
+ id: string;
22
+ }>(items: ReadonlyArray<T>, scores: ReadonlyArray<PrerankScore>): T[];
23
+ //# sourceMappingURL=prerank.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerank.d.ts","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/prerank.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,uDAAuD;AACvD,eAAO,MAAM,6BAA6B,EAAG,IAAa,CAAC;AAM3D;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,YAAY,EAAE,CAe3E;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EACvD,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAClC,CAAC,EAAE,CAKL"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Exec-free candidate ordering (RF-09). RS-07: prerank NEVER authorizes DONE/PASS —
3
+ * it only produces scores in [0, 1] for reordering before verification.
4
+ */
5
+ /** Documented invariant for security tests (RS-07). */
6
+ export const PRERANK_NEVER_AUTHORIZES_DONE = true;
7
+ function clamp01(n) {
8
+ return Math.max(0, Math.min(1, n));
9
+ }
10
+ /**
11
+ * Deterministic heuristic: prefer smaller diffs, fewer hunks, and test-file touches.
12
+ */
13
+ export function prerank(inputs) {
14
+ return inputs.map(({ id, diff }) => {
15
+ const changedLines = diff
16
+ .split('\n')
17
+ .filter((l) => l.startsWith('+') || l.startsWith('-')).length;
18
+ const hunks = (diff.match(/^@@/gm) ?? []).length;
19
+ const testTouches = (diff.match(/\.(spec|test)\./gi) ?? []).length;
20
+ const sizePenalty = Math.min(1, changedLines / 200);
21
+ const hunkPenalty = Math.min(1, hunks / 20);
22
+ const testBonus = Math.min(0.3, testTouches * 0.1);
23
+ const score = clamp01(1 - sizePenalty * 0.5 - hunkPenalty * 0.2 + testBonus);
24
+ return { id, score };
25
+ });
26
+ }
27
+ /** Reorder items by prerank scores (descending). Does not mutate verification verdicts. */
28
+ export function reorderByPrerank(items, scores) {
29
+ const scoreMap = new Map(scores.map((s) => [s.id, s.score]));
30
+ return [...items].sort((a, b) => (scoreMap.get(b.id) ?? 0) - (scoreMap.get(a.id) ?? 0));
31
+ }
32
+ //# sourceMappingURL=prerank.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerank.js","sourceRoot":"","sources":["../../../../src/verification/best-of-n/selector/prerank.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,uDAAuD;AACvD,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAa,CAAC;AAE3D,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAmC;IACzD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjC,MAAM,YAAY,GAAG,IAAI;aACtB,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACjD,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAEnE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,GAAG,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,GAAG,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,WAAW,GAAG,GAAG,GAAG,WAAW,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC;QAE7E,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,gBAAgB,CAC9B,KAAuB,EACvB,MAAmC;IAEnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CACpB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAChE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface Worktree {
2
+ readonly id: string;
3
+ readonly path: string;
4
+ readonly branch: string;
5
+ }
6
+ export declare function createWorktree(repoRoot: string, id: string): Promise<Worktree>;
7
+ export declare function removeWorktree(repoRoot: string, wt: Worktree): Promise<void>;
8
+ export declare function listWorktrees(repoRoot: string): Promise<ReadonlyArray<Worktree>>;
9
+ //# sourceMappingURL=worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../../src/verification/best-of-n/worktree.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AA+BD,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,QAAQ,GACX,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAkDlC"}
@@ -0,0 +1,100 @@
1
+ import path from 'node:path';
2
+ import fs from 'fs-extra';
3
+ import { safeSpawn } from '../../exec/safe-spawn.js';
4
+ import { assertRelativeSafe } from '../../utils/path-safety.js';
5
+ const WORKTREE_ROOT = '.dare/worktrees';
6
+ function worktreeRelPath(id) {
7
+ const rel = path.posix.join(WORKTREE_ROOT, id);
8
+ assertRelativeSafe(rel);
9
+ return rel;
10
+ }
11
+ function branchName(id) {
12
+ assertRelativeSafe(id);
13
+ if (id.includes('/') || id.includes('\\')) {
14
+ throw new Error(`unsafe worktree id: ${id}`);
15
+ }
16
+ return `dare/cand-${id}`;
17
+ }
18
+ async function git(repoRoot, args, timeoutSeconds = 120) {
19
+ const result = await safeSpawn('git', args, {
20
+ cwd: repoRoot,
21
+ timeoutSeconds,
22
+ maxChars: 8000,
23
+ });
24
+ return { code: result.code, stderr: result.stderr };
25
+ }
26
+ export async function createWorktree(repoRoot, id) {
27
+ const rel = worktreeRelPath(id);
28
+ const absPath = path.resolve(repoRoot, rel);
29
+ const branch = branchName(id);
30
+ await fs.ensureDir(path.dirname(absPath));
31
+ const add = await git(repoRoot, [
32
+ 'worktree',
33
+ 'add',
34
+ '-b',
35
+ branch,
36
+ absPath,
37
+ 'HEAD',
38
+ ]);
39
+ if (add.code !== 0) {
40
+ throw new Error(`git worktree add failed for ${id}: ${add.stderr.trim()}`);
41
+ }
42
+ return { id, path: rel, branch };
43
+ }
44
+ export async function removeWorktree(repoRoot, wt) {
45
+ assertRelativeSafe(wt.path);
46
+ const absPath = path.resolve(repoRoot, wt.path);
47
+ const remove = await git(repoRoot, ['worktree', 'remove', '--force', absPath]);
48
+ if (remove.code !== 0) {
49
+ throw new Error(`git worktree remove failed for ${wt.id}: ${remove.stderr.trim()}`);
50
+ }
51
+ await git(repoRoot, ['branch', '-D', wt.branch]).catch(() => undefined);
52
+ await fs.remove(absPath).catch(() => undefined);
53
+ }
54
+ export async function listWorktrees(repoRoot) {
55
+ const result = await safeSpawn('git', ['worktree', 'list', '--porcelain'], { cwd: repoRoot, timeoutSeconds: 60, maxChars: 16000 });
56
+ if (result.code !== 0) {
57
+ throw new Error(`git worktree list failed: ${result.stderr.trim()}`);
58
+ }
59
+ const out = [];
60
+ const prefix = path.resolve(repoRoot, WORKTREE_ROOT) + path.sep;
61
+ let absPath = '';
62
+ let branch = '';
63
+ const flush = () => {
64
+ if (!absPath)
65
+ return;
66
+ const normalized = path.resolve(absPath);
67
+ if (!normalized.startsWith(prefix)) {
68
+ absPath = '';
69
+ branch = '';
70
+ return;
71
+ }
72
+ const rel = path.relative(repoRoot, normalized).replace(/\\/g, '/');
73
+ const id = path.basename(rel);
74
+ out.push({
75
+ id,
76
+ path: rel,
77
+ branch: branch || branchName(id),
78
+ });
79
+ absPath = '';
80
+ branch = '';
81
+ };
82
+ for (const line of result.stdout.split(/\r?\n/)) {
83
+ if (line.startsWith('worktree ')) {
84
+ flush();
85
+ absPath = line.slice('worktree '.length).trim();
86
+ }
87
+ else if (line.startsWith('branch ')) {
88
+ branch = line
89
+ .slice('branch '.length)
90
+ .trim()
91
+ .replace(/^refs\/heads\//, '');
92
+ }
93
+ else if (line === '') {
94
+ flush();
95
+ }
96
+ }
97
+ flush();
98
+ return out;
99
+ }
100
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../../src/verification/best-of-n/worktree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { VerificationConfig } from './types.js';
2
+ export declare const DEFAULTS: VerificationConfig;
3
+ export declare class VerificationConfigError extends Error {
4
+ readonly issues: ReadonlyArray<{
5
+ path: string;
6
+ message: string;
7
+ }>;
8
+ constructor(issues: ReadonlyArray<{
9
+ path: string;
10
+ message: string;
11
+ }>);
12
+ }
13
+ /**
14
+ * Parse and validate `verification` from an already-parsed dare.config.json object.
15
+ */
16
+ /** Serializable defaults for dare.config.json (new projects + migrations). */
17
+ export declare function defaultVerificationConfigForProject(): VerificationConfig;
18
+ /**
19
+ * Inserts the verification block when absent (opt-in: enabled stays false).
20
+ * Returns true when the block was added.
21
+ */
22
+ export declare function seedVerificationDefaultsIfAbsent(cfg: Record<string, unknown>): boolean;
23
+ export declare function parseVerificationConfig(raw: unknown): VerificationConfig;
24
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/verification/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,eAAO,MAAM,QAAQ,EAAE,kBAwBtB,CAAC;AAkGF,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;gBAEtD,MAAM,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAOrE;AAkBD;;GAEG;AACH,8EAA8E;AAC9E,wBAAgB,mCAAmC,IAAI,kBAAkB,CAExE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAIT;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAWxE"}
@@ -0,0 +1,168 @@
1
+ import { z } from 'zod';
2
+ export const DEFAULTS = {
3
+ enabled: false,
4
+ mutation: {
5
+ enabled: true,
6
+ minScore: 0.7,
7
+ incremental: true,
8
+ maxMutants: 200,
9
+ timeoutSeconds: 900,
10
+ },
11
+ failToPass: { required: true },
12
+ antiTamper: { enabled: true },
13
+ typeCheck: { enabled: false },
14
+ loop: {
15
+ policy: 'decay',
16
+ maxAttempts: 5,
17
+ saturationWindow: 3,
18
+ onSaturation: 'fresh-start',
19
+ },
20
+ bestOfN: {
21
+ default: 1,
22
+ max: 5,
23
+ budgetTokens: null,
24
+ },
25
+ prerank: { enabled: false },
26
+ };
27
+ const loopPolicySchema = z.enum(['decay', 'fixed']);
28
+ const saturationActionSchema = z.enum(['fresh-start', 'replan', 'escalate']);
29
+ const verificationConfigSchema = z
30
+ .object({
31
+ enabled: z.boolean().default(DEFAULTS.enabled),
32
+ mutation: z
33
+ .object({
34
+ enabled: z.boolean().default(DEFAULTS.mutation.enabled),
35
+ minScore: z
36
+ .number()
37
+ .min(0, 'minScore must be between 0 and 1')
38
+ .max(1, 'minScore must be between 0 and 1')
39
+ .default(DEFAULTS.mutation.minScore),
40
+ incremental: z.boolean().default(DEFAULTS.mutation.incremental),
41
+ maxMutants: z
42
+ .number()
43
+ .int()
44
+ .positive()
45
+ .default(DEFAULTS.mutation.maxMutants),
46
+ timeoutSeconds: z
47
+ .number()
48
+ .int()
49
+ .positive()
50
+ .default(DEFAULTS.mutation.timeoutSeconds),
51
+ })
52
+ .default({ ...DEFAULTS.mutation }),
53
+ failToPass: z
54
+ .object({
55
+ required: z.boolean().default(DEFAULTS.failToPass.required),
56
+ })
57
+ .default({ ...DEFAULTS.failToPass }),
58
+ antiTamper: z
59
+ .object({
60
+ enabled: z.boolean().default(DEFAULTS.antiTamper.enabled),
61
+ })
62
+ .default({ ...DEFAULTS.antiTamper }),
63
+ typeCheck: z
64
+ .object({
65
+ enabled: z.boolean().default(DEFAULTS.typeCheck.enabled),
66
+ })
67
+ .default({ ...DEFAULTS.typeCheck }),
68
+ loop: z
69
+ .object({
70
+ policy: loopPolicySchema.default(DEFAULTS.loop.policy),
71
+ maxAttempts: z
72
+ .number()
73
+ .int()
74
+ .min(1, 'maxAttempts must be at least 1')
75
+ .default(DEFAULTS.loop.maxAttempts),
76
+ saturationWindow: z
77
+ .number()
78
+ .int()
79
+ .min(1, 'saturationWindow must be at least 1')
80
+ .default(DEFAULTS.loop.saturationWindow),
81
+ onSaturation: saturationActionSchema.default(DEFAULTS.loop.onSaturation),
82
+ })
83
+ .default({ ...DEFAULTS.loop }),
84
+ bestOfN: z
85
+ .object({
86
+ default: z
87
+ .number()
88
+ .int()
89
+ .min(1, 'bestOfN.default must be at least 1')
90
+ .default(DEFAULTS.bestOfN.default),
91
+ max: z
92
+ .number()
93
+ .int()
94
+ .min(1, 'bestOfN.max must be at least 1')
95
+ .default(DEFAULTS.bestOfN.max),
96
+ budgetTokens: z
97
+ .number()
98
+ .int()
99
+ .nullable()
100
+ .default(DEFAULTS.bestOfN.budgetTokens),
101
+ })
102
+ .default({ ...DEFAULTS.bestOfN })
103
+ .superRefine((b, ctx) => {
104
+ if (b.default > b.max) {
105
+ ctx.addIssue({
106
+ code: z.ZodIssueCode.custom,
107
+ message: 'bestOfN.default must be <= bestOfN.max',
108
+ path: ['default'],
109
+ });
110
+ }
111
+ }),
112
+ prerank: z
113
+ .object({
114
+ enabled: z.boolean().default(DEFAULTS.prerank.enabled),
115
+ })
116
+ .default({ ...DEFAULTS.prerank }),
117
+ })
118
+ .strict();
119
+ export class VerificationConfigError extends Error {
120
+ constructor(issues) {
121
+ super(`Invalid verification config: ${issues.map((i) => `${i.path}: ${i.message}`).join('; ')}`);
122
+ this.name = 'VerificationConfigError';
123
+ this.issues = issues;
124
+ }
125
+ }
126
+ function isVerificationBlockAbsent(raw) {
127
+ if (raw === undefined || raw === null)
128
+ return true;
129
+ if (typeof raw !== 'object')
130
+ return false;
131
+ const rec = raw;
132
+ return !('verification' in rec) || rec.verification === undefined;
133
+ }
134
+ function zodIssues(error) {
135
+ return error.issues.map((issue) => ({
136
+ path: issue.path.length > 0 ? issue.path.join('.') : '(root)',
137
+ message: issue.message,
138
+ }));
139
+ }
140
+ /**
141
+ * Parse and validate `verification` from an already-parsed dare.config.json object.
142
+ */
143
+ /** Serializable defaults for dare.config.json (new projects + migrations). */
144
+ export function defaultVerificationConfigForProject() {
145
+ return structuredClone(DEFAULTS);
146
+ }
147
+ /**
148
+ * Inserts the verification block when absent (opt-in: enabled stays false).
149
+ * Returns true when the block was added.
150
+ */
151
+ export function seedVerificationDefaultsIfAbsent(cfg) {
152
+ if (cfg.verification !== undefined)
153
+ return false;
154
+ cfg.verification = defaultVerificationConfigForProject();
155
+ return true;
156
+ }
157
+ export function parseVerificationConfig(raw) {
158
+ if (isVerificationBlockAbsent(raw)) {
159
+ return { ...DEFAULTS, enabled: false };
160
+ }
161
+ const block = raw.verification;
162
+ const result = verificationConfigSchema.safeParse(block);
163
+ if (!result.success) {
164
+ throw new VerificationConfigError(zodIssues(result.error));
165
+ }
166
+ return result.data;
167
+ }
168
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/verification/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { AttemptRecord, LoopConfig, LoopVerdict, VerificationResult } from '../types.js';
2
+ type DecayResult = VerificationResult | {
3
+ readonly passed: boolean;
4
+ readonly failedAspect?: string;
5
+ };
6
+ /** True when the last `window` attempts share the same non-null failureSignature. */
7
+ export declare function isSaturated(history: ReadonlyArray<AttemptRecord>, window: number): boolean;
8
+ /** Canonical loop decision (RF-06) — deterministic, no LLM. */
9
+ export declare function decideNextAction(args: {
10
+ readonly result: DecayResult;
11
+ readonly current: AttemptRecord;
12
+ readonly history: ReadonlyArray<AttemptRecord>;
13
+ readonly loop: LoopConfig;
14
+ }): LoopVerdict;
15
+ export {};
16
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/verification/decay/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,WAAW,EAEX,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAErB,KAAK,WAAW,GACZ,kBAAkB,GAClB;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAUjE,qFAAqF;AACrF,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,EACrC,MAAM,EAAE,MAAM,GACb,OAAO,CAQT;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B,GAAG,WAAW,CAmDd"}
@@ -0,0 +1,64 @@
1
+ const SATURATION_ACTION = {
2
+ 'fresh-start': 'FRESH_START',
3
+ replan: 'REPLAN',
4
+ escalate: 'ESCALATE',
5
+ };
6
+ /** True when the last `window` attempts share the same non-null failureSignature. */
7
+ export function isSaturated(history, window) {
8
+ if (window < 1 || history.length < window)
9
+ return false;
10
+ const slice = history.slice(-window);
11
+ const signature = slice[0]?.failureSignature;
12
+ if (!signature)
13
+ return false;
14
+ return slice.every((record) => record.failureSignature === signature);
15
+ }
16
+ /** Canonical loop decision (RF-06) — deterministic, no LLM. */
17
+ export function decideNextAction(args) {
18
+ const { result, current, history, loop } = args;
19
+ if (result.passed) {
20
+ return {
21
+ action: 'DONE',
22
+ attempt: current.n,
23
+ saturated: false,
24
+ reason: 'verification passed',
25
+ };
26
+ }
27
+ if (current.n >= loop.maxAttempts) {
28
+ return {
29
+ action: 'ESCALATE',
30
+ attempt: current.n,
31
+ saturated: false,
32
+ reason: 'max attempts reached',
33
+ failureSignature: current.failureSignature,
34
+ };
35
+ }
36
+ const saturated = isSaturated(history, loop.saturationWindow);
37
+ if (saturated) {
38
+ const action = SATURATION_ACTION[loop.onSaturation];
39
+ return {
40
+ action,
41
+ attempt: current.n,
42
+ saturated: true,
43
+ reason: `failure saturation: ${loop.onSaturation}`,
44
+ failureSignature: current.failureSignature,
45
+ };
46
+ }
47
+ if (loop.policy === 'fixed' && current.n < loop.maxAttempts) {
48
+ return {
49
+ action: 'CONTINUE',
50
+ attempt: current.n,
51
+ saturated: false,
52
+ reason: 'fixed policy: continue',
53
+ failureSignature: current.failureSignature,
54
+ };
55
+ }
56
+ return {
57
+ action: 'CONTINUE',
58
+ attempt: current.n,
59
+ saturated: false,
60
+ reason: 'decay policy: continue',
61
+ failureSignature: current.failureSignature,
62
+ };
63
+ }
64
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/verification/decay/policy.ts"],"names":[],"mappings":"AAYA,MAAM,iBAAiB,GAEnB;IACF,aAAa,EAAE,aAAa;IAC5B,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,qFAAqF;AACrF,MAAM,UAAU,WAAW,CACzB,OAAqC,EACrC,MAAc;IAEd,IAAI,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM;QAAE,OAAO,KAAK,CAAC;IAExD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC;AACxE,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,gBAAgB,CAAC,IAKhC;IACC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEhD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO;YACL,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,OAAO,CAAC,CAAC;YAClB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,qBAAqB;SAC9B,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,OAAO,CAAC,CAAC;YAClB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,sBAAsB;YAC9B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpD,OAAO;YACL,MAAM;YACN,OAAO,EAAE,OAAO,CAAC,CAAC;YAClB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,uBAAuB,IAAI,CAAC,YAAY,EAAE;YAClD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5D,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,OAAO,CAAC,CAAC;YAClB,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,wBAAwB;YAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,OAAO,CAAC,CAAC;QAClB,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,wBAAwB;QAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Stable 8-hex failure signature for saturation detection (RF-06). */
2
+ export declare function failureSignature(input: {
3
+ readonly failedAspect: string;
4
+ readonly stderr: string;
5
+ }): string;
6
+ //# sourceMappingURL=signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../../../src/verification/decay/signature.ts"],"names":[],"mappings":"AAsBA,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,CAIT"}
@@ -0,0 +1,18 @@
1
+ import { createHash } from 'node:crypto';
2
+ function normalizeStderr(stderr) {
3
+ let normalized = stderr.toLowerCase();
4
+ normalized = normalized.replace(/\/(?:[\w.-]+\/)+[\w.-]+/g, '<path>');
5
+ normalized = normalized.replace(/[a-z]:\\(?:[\w.-]+\\)+[\w.-]*/gi, '<path>');
6
+ normalized = normalized.replace(/\d{4}-\d{2}-\d{2}t[\d:.]+z?/g, '<ts>');
7
+ normalized = normalized.replace(/\b[0-9a-f]{8,}\b/g, '<hex>');
8
+ normalized = normalized.replace(/:\d+:/g, ':<line>:');
9
+ normalized = normalized.replace(/\s+/g, ' ').trim();
10
+ return normalized;
11
+ }
12
+ /** Stable 8-hex failure signature for saturation detection (RF-06). */
13
+ export function failureSignature(input) {
14
+ const normalized = normalizeStderr(input.stderr);
15
+ const payload = `${input.failedAspect}\n${normalized}`;
16
+ return createHash('sha256').update(payload).digest('hex').slice(0, 8);
17
+ }
18
+ //# sourceMappingURL=signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../../src/verification/decay/signature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,eAAe,CAAC,MAAc;IACrC,IAAI,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACtC,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,0BAA0B,EAC1B,QAAQ,CACT,CAAC;IACF,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,iCAAiC,EACjC,QAAQ,CACT,CAAC;IACF,UAAU,GAAG,UAAU,CAAC,OAAO,CAC7B,8BAA8B,EAC9B,MAAM,CACP,CAAC;IACF,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC9D,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtD,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACpD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,KAGhC;IACC,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;IACvD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { AspectResult } from '../types.js';
2
+ export interface TamperSnapshot {
3
+ readonly assertionCount: number;
4
+ readonly testFiles: ReadonlyArray<string>;
5
+ readonly coveragePct?: number;
6
+ }
7
+ export declare function snapshotTests(args: {
8
+ readonly cwd: string;
9
+ readonly testGlob: string;
10
+ }): Promise<TamperSnapshot>;
11
+ export declare function checkAntiTamper(args: {
12
+ readonly baseline: TamperSnapshot;
13
+ readonly cwd: string;
14
+ readonly testGlob: string;
15
+ }): Promise<AspectResult>;
16
+ //# sourceMappingURL=anti-tamper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anti-tamper.d.ts","sourceRoot":"","sources":["../../../src/verification/gates/anti-tamper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA+FD,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,cAAc,CAAC,CAU1B;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,YAAY,CAAC,CAwDxB"}