@tangle-network/browser-agent-driver 0.29.0 → 0.31.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 (276) hide show
  1. package/dist/brain/index.d.ts +15 -1
  2. package/dist/brain/index.d.ts.map +1 -1
  3. package/dist/brain/index.js +67 -5
  4. package/dist/brain/index.js.map +1 -1
  5. package/dist/cli-ack-patch.d.ts +39 -0
  6. package/dist/cli-ack-patch.d.ts.map +1 -0
  7. package/dist/cli-ack-patch.js +47 -0
  8. package/dist/cli-ack-patch.js.map +1 -0
  9. package/dist/cli-design-audit.d.ts +16 -0
  10. package/dist/cli-design-audit.d.ts.map +1 -1
  11. package/dist/cli-design-audit.js +232 -7
  12. package/dist/cli-design-audit.js.map +1 -1
  13. package/dist/cli-jobs.d.ts +13 -0
  14. package/dist/cli-jobs.d.ts.map +1 -0
  15. package/dist/cli-jobs.js +262 -0
  16. package/dist/cli-jobs.js.map +1 -0
  17. package/dist/cli-patterns.d.ts +26 -0
  18. package/dist/cli-patterns.d.ts.map +1 -0
  19. package/dist/cli-patterns.js +49 -0
  20. package/dist/cli-patterns.js.map +1 -0
  21. package/dist/cli-reports.d.ts +12 -0
  22. package/dist/cli-reports.d.ts.map +1 -0
  23. package/dist/cli-reports.js +97 -0
  24. package/dist/cli-reports.js.map +1 -0
  25. package/dist/cli-ui.d.ts.map +1 -1
  26. package/dist/cli-ui.js +5 -1
  27. package/dist/cli-ui.js.map +1 -1
  28. package/dist/cli.js +52 -2
  29. package/dist/cli.js.map +1 -1
  30. package/dist/config.d.ts +4 -4
  31. package/dist/config.d.ts.map +1 -1
  32. package/dist/design/audit/attribution/aggregate.d.ts +16 -0
  33. package/dist/design/audit/attribution/aggregate.d.ts.map +1 -0
  34. package/dist/design/audit/attribution/aggregate.js +81 -0
  35. package/dist/design/audit/attribution/aggregate.js.map +1 -0
  36. package/dist/design/audit/attribution/store.d.ts +36 -0
  37. package/dist/design/audit/attribution/store.d.ts.map +1 -0
  38. package/dist/design/audit/attribution/store.js +108 -0
  39. package/dist/design/audit/attribution/store.js.map +1 -0
  40. package/dist/design/audit/attribution/types.d.ts +13 -0
  41. package/dist/design/audit/attribution/types.d.ts.map +1 -0
  42. package/dist/design/audit/attribution/types.js +10 -0
  43. package/dist/design/audit/attribution/types.js.map +1 -0
  44. package/dist/design/audit/classify-ensemble.d.ts +46 -0
  45. package/dist/design/audit/classify-ensemble.d.ts.map +1 -0
  46. package/dist/design/audit/classify-ensemble.js +207 -0
  47. package/dist/design/audit/classify-ensemble.js.map +1 -0
  48. package/dist/design/audit/ethics/check.d.ts +59 -0
  49. package/dist/design/audit/ethics/check.d.ts.map +1 -0
  50. package/dist/design/audit/ethics/check.js +137 -0
  51. package/dist/design/audit/ethics/check.js.map +1 -0
  52. package/dist/design/audit/ethics/loader.d.ts +21 -0
  53. package/dist/design/audit/ethics/loader.d.ts.map +1 -0
  54. package/dist/design/audit/ethics/loader.js +207 -0
  55. package/dist/design/audit/ethics/loader.js.map +1 -0
  56. package/dist/design/audit/ethics/rules/finance.yaml +37 -0
  57. package/dist/design/audit/ethics/rules/kids.yaml +37 -0
  58. package/dist/design/audit/ethics/rules/legal.yaml +35 -0
  59. package/dist/design/audit/ethics/rules/medical.yaml +36 -0
  60. package/dist/design/audit/evaluate.d.ts +69 -0
  61. package/dist/design/audit/evaluate.d.ts.map +1 -1
  62. package/dist/design/audit/evaluate.js +417 -55
  63. package/dist/design/audit/evaluate.js.map +1 -1
  64. package/dist/design/audit/first-principles-mode.d.ts +42 -0
  65. package/dist/design/audit/first-principles-mode.d.ts.map +1 -0
  66. package/dist/design/audit/first-principles-mode.js +77 -0
  67. package/dist/design/audit/first-principles-mode.js.map +1 -0
  68. package/dist/design/audit/modality/android.d.ts +14 -0
  69. package/dist/design/audit/modality/android.d.ts.map +1 -0
  70. package/dist/design/audit/modality/android.js +18 -0
  71. package/dist/design/audit/modality/android.js.map +1 -0
  72. package/dist/design/audit/modality/html.d.ts +22 -0
  73. package/dist/design/audit/modality/html.d.ts.map +1 -0
  74. package/dist/design/audit/modality/html.js +51 -0
  75. package/dist/design/audit/modality/html.js.map +1 -0
  76. package/dist/design/audit/modality/index.d.ts +8 -0
  77. package/dist/design/audit/modality/index.d.ts.map +1 -0
  78. package/dist/design/audit/modality/index.js +15 -0
  79. package/dist/design/audit/modality/index.js.map +1 -0
  80. package/dist/design/audit/modality/ios.d.ts +16 -0
  81. package/dist/design/audit/modality/ios.d.ts.map +1 -0
  82. package/dist/design/audit/modality/ios.js +19 -0
  83. package/dist/design/audit/modality/ios.js.map +1 -0
  84. package/dist/design/audit/modality/types.d.ts +9 -0
  85. package/dist/design/audit/modality/types.d.ts.map +1 -0
  86. package/dist/design/audit/modality/types.js +9 -0
  87. package/dist/design/audit/modality/types.js.map +1 -0
  88. package/dist/design/audit/patches/index.d.ts +8 -0
  89. package/dist/design/audit/patches/index.d.ts.map +1 -0
  90. package/dist/design/audit/patches/index.js +5 -0
  91. package/dist/design/audit/patches/index.js.map +1 -0
  92. package/dist/design/audit/patches/parse.d.ts +29 -0
  93. package/dist/design/audit/patches/parse.d.ts.map +1 -0
  94. package/dist/design/audit/patches/parse.js +153 -0
  95. package/dist/design/audit/patches/parse.js.map +1 -0
  96. package/dist/design/audit/patches/render.d.ts +20 -0
  97. package/dist/design/audit/patches/render.d.ts.map +1 -0
  98. package/dist/design/audit/patches/render.js +55 -0
  99. package/dist/design/audit/patches/render.js.map +1 -0
  100. package/dist/design/audit/patches/severity-enforcement.d.ts +23 -0
  101. package/dist/design/audit/patches/severity-enforcement.d.ts.map +1 -0
  102. package/dist/design/audit/patches/severity-enforcement.js +42 -0
  103. package/dist/design/audit/patches/severity-enforcement.js.map +1 -0
  104. package/dist/design/audit/patches/validate.d.ts +34 -0
  105. package/dist/design/audit/patches/validate.d.ts.map +1 -0
  106. package/dist/design/audit/patches/validate.js +53 -0
  107. package/dist/design/audit/patches/validate.js.map +1 -0
  108. package/dist/design/audit/patterns/match.d.ts +24 -0
  109. package/dist/design/audit/patterns/match.d.ts.map +1 -0
  110. package/dist/design/audit/patterns/match.js +48 -0
  111. package/dist/design/audit/patterns/match.js.map +1 -0
  112. package/dist/design/audit/patterns/mine.d.ts +31 -0
  113. package/dist/design/audit/patterns/mine.d.ts.map +1 -0
  114. package/dist/design/audit/patterns/mine.js +35 -0
  115. package/dist/design/audit/patterns/mine.js.map +1 -0
  116. package/dist/design/audit/patterns/store.d.ts +14 -0
  117. package/dist/design/audit/patterns/store.d.ts.map +1 -0
  118. package/dist/design/audit/patterns/store.js +53 -0
  119. package/dist/design/audit/patterns/store.js.map +1 -0
  120. package/dist/design/audit/patterns/types.d.ts +53 -0
  121. package/dist/design/audit/patterns/types.d.ts.map +1 -0
  122. package/dist/design/audit/patterns/types.js +13 -0
  123. package/dist/design/audit/patterns/types.js.map +1 -0
  124. package/dist/design/audit/pipeline.d.ts +26 -0
  125. package/dist/design/audit/pipeline.d.ts.map +1 -1
  126. package/dist/design/audit/pipeline.js +131 -4
  127. package/dist/design/audit/pipeline.js.map +1 -1
  128. package/dist/design/audit/rubric/anchor-loader.d.ts +44 -0
  129. package/dist/design/audit/rubric/anchor-loader.d.ts.map +1 -0
  130. package/dist/design/audit/rubric/anchor-loader.js +210 -0
  131. package/dist/design/audit/rubric/anchor-loader.js.map +1 -0
  132. package/dist/design/audit/rubric/anchors/blog.yaml +33 -0
  133. package/dist/design/audit/rubric/anchors/dashboard.yaml +35 -0
  134. package/dist/design/audit/rubric/anchors/docs.yaml +35 -0
  135. package/dist/design/audit/rubric/anchors/ecommerce.yaml +33 -0
  136. package/dist/design/audit/rubric/anchors/marketing.yaml +34 -0
  137. package/dist/design/audit/rubric/anchors/saas-app.yaml +38 -0
  138. package/dist/design/audit/rubric/anchors/social.yaml +33 -0
  139. package/dist/design/audit/rubric/anchors/tool.yaml +33 -0
  140. package/dist/design/audit/rubric/anchors/utility.yaml +33 -0
  141. package/dist/design/audit/rubric/fragments/audience-clinician.md +42 -0
  142. package/dist/design/audit/rubric/fragments/audience-developer.md +40 -0
  143. package/dist/design/audit/rubric/fragments/audience-kids.md +35 -0
  144. package/dist/design/audit/rubric/fragments/audience-vulnerability-minor-facing.md +37 -0
  145. package/dist/design/audit/rubric/fragments/first-principles.md +65 -0
  146. package/dist/design/audit/rubric/fragments/modality-mobile.md +39 -0
  147. package/dist/design/audit/rubric/fragments/modality-tablet.md +35 -0
  148. package/dist/design/audit/rubric/fragments/regulatory-coppa.md +32 -0
  149. package/dist/design/audit/rubric/fragments/regulatory-gdpr.md +33 -0
  150. package/dist/design/audit/rubric/fragments/regulatory-hipaa.md +36 -0
  151. package/dist/design/audit/rubric/fragments/universal-product-intent.md +48 -0
  152. package/dist/design/audit/rubric/loader.d.ts +26 -6
  153. package/dist/design/audit/rubric/loader.d.ts.map +1 -1
  154. package/dist/design/audit/rubric/loader.js +77 -27
  155. package/dist/design/audit/rubric/loader.js.map +1 -1
  156. package/dist/design/audit/rubric/rollup-weights.d.ts +25 -0
  157. package/dist/design/audit/rubric/rollup-weights.d.ts.map +1 -0
  158. package/dist/design/audit/rubric/rollup-weights.js +51 -0
  159. package/dist/design/audit/rubric/rollup-weights.js.map +1 -0
  160. package/dist/design/audit/types.d.ts +28 -0
  161. package/dist/design/audit/types.d.ts.map +1 -1
  162. package/dist/design/audit/v2/build-result.d.ts +47 -0
  163. package/dist/design/audit/v2/build-result.d.ts.map +1 -0
  164. package/dist/design/audit/v2/build-result.js +163 -0
  165. package/dist/design/audit/v2/build-result.js.map +1 -0
  166. package/dist/design/audit/v2/score.d.ts +49 -0
  167. package/dist/design/audit/v2/score.d.ts.map +1 -0
  168. package/dist/design/audit/v2/score.js +211 -0
  169. package/dist/design/audit/v2/score.js.map +1 -0
  170. package/dist/design/audit/v2/types.d.ts +431 -0
  171. package/dist/design/audit/v2/types.d.ts.map +1 -0
  172. package/dist/design/audit/v2/types.js +26 -0
  173. package/dist/design/audit/v2/types.js.map +1 -0
  174. package/dist/discover/index.d.ts +16 -0
  175. package/dist/discover/index.d.ts.map +1 -0
  176. package/dist/discover/index.js +25 -0
  177. package/dist/discover/index.js.map +1 -0
  178. package/dist/discover/wayback.d.ts +49 -0
  179. package/dist/discover/wayback.d.ts.map +1 -0
  180. package/dist/discover/wayback.js +123 -0
  181. package/dist/discover/wayback.js.map +1 -0
  182. package/dist/jobs/anti-bot.d.ts +19 -0
  183. package/dist/jobs/anti-bot.d.ts.map +1 -0
  184. package/dist/jobs/anti-bot.js +64 -0
  185. package/dist/jobs/anti-bot.js.map +1 -0
  186. package/dist/jobs/cost-estimate.d.ts +12 -0
  187. package/dist/jobs/cost-estimate.d.ts.map +1 -0
  188. package/dist/jobs/cost-estimate.js +21 -0
  189. package/dist/jobs/cost-estimate.js.map +1 -0
  190. package/dist/jobs/cost-history.d.ts +19 -0
  191. package/dist/jobs/cost-history.d.ts.map +1 -0
  192. package/dist/jobs/cost-history.js +42 -0
  193. package/dist/jobs/cost-history.js.map +1 -0
  194. package/dist/jobs/index.d.ts +31 -0
  195. package/dist/jobs/index.d.ts.map +1 -0
  196. package/dist/jobs/index.js +37 -0
  197. package/dist/jobs/index.js.map +1 -0
  198. package/dist/jobs/orchestrator.d.ts +42 -0
  199. package/dist/jobs/orchestrator.d.ts.map +1 -0
  200. package/dist/jobs/orchestrator.js +282 -0
  201. package/dist/jobs/orchestrator.js.map +1 -0
  202. package/dist/jobs/queue.d.ts +45 -0
  203. package/dist/jobs/queue.d.ts.map +1 -0
  204. package/dist/jobs/queue.js +114 -0
  205. package/dist/jobs/queue.js.map +1 -0
  206. package/dist/jobs/retry.d.ts +36 -0
  207. package/dist/jobs/retry.d.ts.map +1 -0
  208. package/dist/jobs/retry.js +77 -0
  209. package/dist/jobs/retry.js.map +1 -0
  210. package/dist/jobs/store.d.ts +31 -0
  211. package/dist/jobs/store.d.ts.map +1 -0
  212. package/dist/jobs/store.js +92 -0
  213. package/dist/jobs/store.js.map +1 -0
  214. package/dist/jobs/types.d.ts +106 -0
  215. package/dist/jobs/types.d.ts.map +1 -0
  216. package/dist/jobs/types.js +13 -0
  217. package/dist/jobs/types.js.map +1 -0
  218. package/dist/provider-defaults.d.ts +1 -1
  219. package/dist/provider-defaults.d.ts.map +1 -1
  220. package/dist/provider-defaults.js +8 -0
  221. package/dist/provider-defaults.js.map +1 -1
  222. package/dist/reports/aggregate.d.ts +38 -0
  223. package/dist/reports/aggregate.d.ts.map +1 -0
  224. package/dist/reports/aggregate.js +145 -0
  225. package/dist/reports/aggregate.js.map +1 -0
  226. package/dist/reports/index.d.ts +21 -0
  227. package/dist/reports/index.d.ts.map +1 -0
  228. package/dist/reports/index.js +15 -0
  229. package/dist/reports/index.js.map +1 -0
  230. package/dist/reports/narrate.d.ts +19 -0
  231. package/dist/reports/narrate.d.ts.map +1 -0
  232. package/dist/reports/narrate.js +40 -0
  233. package/dist/reports/narrate.js.map +1 -0
  234. package/dist/reports/templates.d.ts +43 -0
  235. package/dist/reports/templates.d.ts.map +1 -0
  236. package/dist/reports/templates.js +200 -0
  237. package/dist/reports/templates.js.map +1 -0
  238. package/dist/reports/tokens.d.ts +77 -0
  239. package/dist/reports/tokens.d.ts.map +1 -0
  240. package/dist/reports/tokens.js +88 -0
  241. package/dist/reports/tokens.js.map +1 -0
  242. package/dist/reports/tools.d.ts +76 -0
  243. package/dist/reports/tools.d.ts.map +1 -0
  244. package/dist/reports/tools.js +205 -0
  245. package/dist/reports/tools.js.map +1 -0
  246. package/dist/reports/types.d.ts +51 -0
  247. package/dist/reports/types.d.ts.map +1 -0
  248. package/dist/reports/types.js +9 -0
  249. package/dist/reports/types.js.map +1 -0
  250. package/dist/supervisor/critic.d.ts +1 -1
  251. package/dist/supervisor/critic.d.ts.map +1 -1
  252. package/dist/supervisor/critic.js +50 -5
  253. package/dist/supervisor/critic.js.map +1 -1
  254. package/dist/telemetry/client.d.ts +42 -0
  255. package/dist/telemetry/client.d.ts.map +1 -0
  256. package/dist/telemetry/client.js +203 -0
  257. package/dist/telemetry/client.js.map +1 -0
  258. package/dist/telemetry/hash.d.ts +4 -0
  259. package/dist/telemetry/hash.d.ts.map +1 -0
  260. package/dist/telemetry/hash.js +7 -0
  261. package/dist/telemetry/hash.js.map +1 -0
  262. package/dist/telemetry/index.d.ts +6 -0
  263. package/dist/telemetry/index.d.ts.map +1 -0
  264. package/dist/telemetry/index.js +5 -0
  265. package/dist/telemetry/index.js.map +1 -0
  266. package/dist/telemetry/schema.d.ts +85 -0
  267. package/dist/telemetry/schema.d.ts.map +1 -0
  268. package/dist/telemetry/schema.js +13 -0
  269. package/dist/telemetry/schema.js.map +1 -0
  270. package/dist/telemetry/sink.d.ts +46 -0
  271. package/dist/telemetry/sink.d.ts.map +1 -0
  272. package/dist/telemetry/sink.js +97 -0
  273. package/dist/telemetry/sink.js.map +1 -0
  274. package/dist/types.d.ts +5 -5
  275. package/dist/types.d.ts.map +1 -1
  276. package/package.json +5 -1
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Patch renderer — produces a unified diff from a Patch when filePath is known.
3
+ *
4
+ * Agents can pipe the result to `git apply --check` then `git apply`.
5
+ * When filePath is unknown, returns null — the agent must use before/after for
6
+ * search-replace instead.
7
+ */
8
+ /**
9
+ * Render a minimal unified diff (1-hunk, 3 lines context) from a patch.
10
+ * Returns null when:
11
+ * - `target.filePath` is not set (no file to diff against)
12
+ * - `unifiedDiff` is already set on the patch (prefer the LLM's version)
13
+ */
14
+ export function renderUnifiedDiff(patch) {
15
+ if (patch.diff.unifiedDiff)
16
+ return patch.diff.unifiedDiff;
17
+ if (!patch.target.filePath)
18
+ return null;
19
+ const { before, after } = patch.diff;
20
+ const filePath = patch.target.filePath;
21
+ const beforeLines = before.split('\n');
22
+ const afterLines = after.split('\n');
23
+ const removals = beforeLines.map(l => `- ${l}`);
24
+ const additions = afterLines.map(l => `+ ${l}`);
25
+ const hunkOldLen = beforeLines.length;
26
+ const hunkNewLen = afterLines.length;
27
+ return [
28
+ `--- a/${filePath}`,
29
+ `+++ b/${filePath}`,
30
+ `@@ -1,${hunkOldLen} +1,${hunkNewLen} @@`,
31
+ ...removals,
32
+ ...additions,
33
+ ].join('\n');
34
+ }
35
+ /**
36
+ * Render a human-readable patch summary for display in report.md.
37
+ */
38
+ export function renderPatchSummary(patch) {
39
+ const parts = [];
40
+ parts.push(`**Patch ${patch.patchId}** (${patch.scope})`);
41
+ if (patch.target.filePath)
42
+ parts.push(`File: \`${patch.target.filePath}\``);
43
+ else if (patch.target.cssSelector)
44
+ parts.push(`Selector: \`${patch.target.cssSelector}\``);
45
+ else if (patch.target.componentName)
46
+ parts.push(`Component: \`${patch.target.componentName}\``);
47
+ parts.push(`\`\`\`diff\n${renderUnifiedDiff(patch) ?? `- ${patch.diff.before}\n+ ${patch.diff.after}`}\n\`\`\``);
48
+ parts.push(`Test: ${patch.testThatProves.description}`);
49
+ if (patch.testThatProves.command)
50
+ parts.push(`Command: \`${patch.testThatProves.command}\``);
51
+ parts.push(`Rollback: ${patch.rollback.kind}${patch.rollback.instruction ? ` — ${patch.rollback.instruction}` : ''}`);
52
+ parts.push(`Estimated Δ: ${patch.estimatedDelta.dim} ${patch.estimatedDelta.delta > 0 ? '+' : ''}${patch.estimatedDelta.delta} (confidence: ${patch.estimatedDeltaConfidence})`);
53
+ return parts.join('\n');
54
+ }
55
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/design/audit/patches/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Severity enforcement — every major/critical finding MUST have ≥1 valid patch.
3
+ *
4
+ * Findings without patches are downgraded to `minor` with an explanatory note.
5
+ * This runs as a post-processing step after patch validation.
6
+ */
7
+ import type { DesignFinding } from '../v2/types.js';
8
+ export interface EnforcementRecord {
9
+ findingId: string;
10
+ fromSeverity: string;
11
+ toSeverity: 'minor';
12
+ reason: string;
13
+ }
14
+ export interface EnforcementResult {
15
+ findings: DesignFinding[];
16
+ downgraded: EnforcementRecord[];
17
+ }
18
+ /**
19
+ * Given a list of findings and the set of valid patches (post-validation),
20
+ * downgrade any major/critical finding that has no valid patch to `minor`.
21
+ */
22
+ export declare function enforcePatchPolicy(findings: DesignFinding[], validPatchIds: Set<string>): EnforcementResult;
23
+ //# sourceMappingURL=severity-enforcement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severity-enforcement.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/patches/severity-enforcement.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAS,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE1D,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,aAAa,EAAE,CAAA;IACzB,UAAU,EAAE,iBAAiB,EAAE,CAAA;CAChC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,EAAE,EACzB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GACzB,iBAAiB,CAkCnB"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Severity enforcement — every major/critical finding MUST have ≥1 valid patch.
3
+ *
4
+ * Findings without patches are downgraded to `minor` with an explanatory note.
5
+ * This runs as a post-processing step after patch validation.
6
+ */
7
+ /**
8
+ * Given a list of findings and the set of valid patches (post-validation),
9
+ * downgrade any major/critical finding that has no valid patch to `minor`.
10
+ */
11
+ export function enforcePatchPolicy(findings, validPatchIds) {
12
+ const downgraded = [];
13
+ const updated = findings.map(f => {
14
+ if (f.severity !== 'major' && f.severity !== 'critical')
15
+ return f;
16
+ const v2Finding = f;
17
+ const patches = v2Finding.patches ?? [];
18
+ const hasValidPatch = patches.some(p => validPatchIds.has(p.patchId));
19
+ if (hasValidPatch)
20
+ return f;
21
+ downgraded.push({
22
+ findingId: f.id,
23
+ fromSeverity: f.severity,
24
+ toSeverity: 'minor',
25
+ reason: patches.length === 0
26
+ ? 'no patches proposed'
27
+ : 'all proposed patches failed validation (before not in snapshot, missing locator, or delta out of range)',
28
+ });
29
+ return {
30
+ ...f,
31
+ severity: 'minor',
32
+ suggestion: [
33
+ f.suggestion,
34
+ '[auto-downgraded: patch required for major/critical severity]',
35
+ ]
36
+ .filter(Boolean)
37
+ .join(' '),
38
+ };
39
+ });
40
+ return { findings: updated, downgraded };
41
+ }
42
+ //# sourceMappingURL=severity-enforcement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"severity-enforcement.js","sourceRoot":"","sources":["../../../../src/design/audit/patches/severity-enforcement.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAyB,EACzB,aAA0B;IAE1B,MAAM,UAAU,GAAwB,EAAE,CAAA;IAE1C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC/B,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,UAAU;YAAE,OAAO,CAAC,CAAA;QAEjE,MAAM,SAAS,GAAG,CAA0C,CAAA;QAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,EAAE,CAAA;QACvC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QAErE,IAAI,aAAa;YAAE,OAAO,CAAC,CAAA;QAE3B,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,CAAC,CAAC,EAAE;YACf,YAAY,EAAE,CAAC,CAAC,QAAQ;YACxB,UAAU,EAAE,OAAO;YACnB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;gBAC1B,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,yGAAyG;SAC9G,CAAC,CAAA;QAEF,OAAO;YACL,GAAG,CAAC;YACJ,QAAQ,EAAE,OAAgB;YAC1B,UAAU,EAAE;gBACV,CAAC,CAAC,UAAU;gBACZ,+DAA+D;aAChE;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,GAAG,CAAC;SACb,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;AAC1C,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Patch validator — given a parsed patch and the page snapshot text, verify
3
+ * that the patch is grounded and applyable.
4
+ *
5
+ * Rules:
6
+ * - `diff.before` must appear as a case-sensitive substring of the snapshot.
7
+ * Agents apply patches literally; a hallucinated `before` is unfixable.
8
+ * - `target` must carry at least one locator (cssSelector | filePath |
9
+ * componentName). Without one the agent has nowhere to apply.
10
+ * - `estimatedDelta.delta` must be in [-3, 3]. Larger claims are almost
11
+ * always over-confident on a 1–10 scale.
12
+ */
13
+ import type { Patch } from '../v2/types.js';
14
+ export type ValidationReason = 'before-not-in-snapshot' | 'target-missing-locator' | 'estimated-delta-out-of-range' | 'before-empty';
15
+ export interface ValidationResult {
16
+ valid: boolean;
17
+ reasons: ValidationReason[];
18
+ }
19
+ /**
20
+ * Validate a single patch against a page snapshot. Reports all issues in one
21
+ * pass so callers can surface every problem to the agent at once.
22
+ */
23
+ export declare function validatePatch(patch: Patch, snapshot: string): ValidationResult;
24
+ /**
25
+ * Validate a list of patches and partition into valid / invalid.
26
+ */
27
+ export declare function validatePatches(patches: Patch[], snapshot: string): {
28
+ valid: Patch[];
29
+ invalid: Array<{
30
+ patch: Patch;
31
+ reasons: ValidationReason[];
32
+ }>;
33
+ };
34
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/patches/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAE3C,MAAM,MAAM,gBAAgB,GACxB,wBAAwB,GACxB,wBAAwB,GACxB,8BAA8B,GAC9B,cAAc,CAAA;AAElB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAC5B;AAKD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAuB9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,KAAK,EAAE,EAChB,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE,CASnF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Patch validator — given a parsed patch and the page snapshot text, verify
3
+ * that the patch is grounded and applyable.
4
+ *
5
+ * Rules:
6
+ * - `diff.before` must appear as a case-sensitive substring of the snapshot.
7
+ * Agents apply patches literally; a hallucinated `before` is unfixable.
8
+ * - `target` must carry at least one locator (cssSelector | filePath |
9
+ * componentName). Without one the agent has nowhere to apply.
10
+ * - `estimatedDelta.delta` must be in [-3, 3]. Larger claims are almost
11
+ * always over-confident on a 1–10 scale.
12
+ */
13
+ const DELTA_MIN = -3;
14
+ const DELTA_MAX = 3;
15
+ /**
16
+ * Validate a single patch against a page snapshot. Reports all issues in one
17
+ * pass so callers can surface every problem to the agent at once.
18
+ */
19
+ export function validatePatch(patch, snapshot) {
20
+ const reasons = [];
21
+ const { target, diff, estimatedDelta } = patch;
22
+ if (!target.cssSelector && !target.filePath && !target.componentName) {
23
+ reasons.push('target-missing-locator');
24
+ }
25
+ if (diff.before.length === 0) {
26
+ reasons.push('before-empty');
27
+ }
28
+ else if (!snapshot.includes(diff.before)) {
29
+ reasons.push('before-not-in-snapshot');
30
+ }
31
+ if (estimatedDelta.delta < DELTA_MIN ||
32
+ estimatedDelta.delta > DELTA_MAX ||
33
+ !Number.isFinite(estimatedDelta.delta)) {
34
+ reasons.push('estimated-delta-out-of-range');
35
+ }
36
+ return { valid: reasons.length === 0, reasons };
37
+ }
38
+ /**
39
+ * Validate a list of patches and partition into valid / invalid.
40
+ */
41
+ export function validatePatches(patches, snapshot) {
42
+ const valid = [];
43
+ const invalid = [];
44
+ for (const patch of patches) {
45
+ const result = validatePatch(patch, snapshot);
46
+ if (result.valid)
47
+ valid.push(patch);
48
+ else
49
+ invalid.push({ patch, reasons: result.reasons });
50
+ }
51
+ return { valid, invalid };
52
+ }
53
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../src/design/audit/patches/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAeH,MAAM,SAAS,GAAG,CAAC,CAAC,CAAA;AACpB,MAAM,SAAS,GAAG,CAAC,CAAA;AAEnB;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAY,EAAE,QAAgB;IAC1D,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,KAAK,CAAA;IAE9C,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9B,CAAC;SAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IACxC,CAAC;IAED,IACE,cAAc,CAAC,KAAK,GAAG,SAAS;QAChC,cAAc,CAAC,KAAK,GAAG,SAAS;QAChC,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,EACtC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAgB,EAChB,QAAgB;IAEhB,MAAM,KAAK,GAAY,EAAE,CAAA;IACzB,MAAM,OAAO,GAAyD,EAAE,CAAA;IACxE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC7C,IAAI,MAAM,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;;YAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Layer 5 — Pattern matching.
3
+ *
4
+ * Fuzzy-matches a page against catalogued patterns. When patterns exist (post
5
+ * fleet accumulation), findings include `matchedPatterns[]` so agents can cite
6
+ * fleet evidence rather than applying novel patches.
7
+ *
8
+ * Currently returns [] (cold-start). The interface is stable.
9
+ */
10
+ import type { PatternMatch } from './types.js';
11
+ import type { PageType, Dimension } from '../v2/types.js';
12
+ export interface MatchContext {
13
+ pageType: PageType;
14
+ weakDimensions: Dimension[];
15
+ dir?: string;
16
+ }
17
+ /**
18
+ * Match patterns against the current page context. Returns the top-N matches
19
+ * ordered by expected leverage (weakest dim × pattern's median delta for that dim).
20
+ *
21
+ * Cold-start: returns [] until patterns are mined.
22
+ */
23
+ export declare function matchPatterns(ctx: MatchContext, topN?: number): Promise<PatternMatch[]>;
24
+ //# sourceMappingURL=match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/patterns/match.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAW,YAAY,EAAgB,MAAM,YAAY,CAAA;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAGzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,CAAA;IAClB,cAAc,EAAE,SAAS,EAAE,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,YAAY,EACjB,IAAI,GAAE,MAAU,GACf,OAAO,CAAC,YAAY,EAAE,CAAC,CA+BzB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Layer 5 — Pattern matching.
3
+ *
4
+ * Fuzzy-matches a page against catalogued patterns. When patterns exist (post
5
+ * fleet accumulation), findings include `matchedPatterns[]` so agents can cite
6
+ * fleet evidence rather than applying novel patches.
7
+ *
8
+ * Currently returns [] (cold-start). The interface is stable.
9
+ */
10
+ import { queryPatterns } from './store.js';
11
+ /**
12
+ * Match patterns against the current page context. Returns the top-N matches
13
+ * ordered by expected leverage (weakest dim × pattern's median delta for that dim).
14
+ *
15
+ * Cold-start: returns [] until patterns are mined.
16
+ */
17
+ export async function matchPatterns(ctx, topN = 5) {
18
+ const query = {
19
+ pageType: ctx.pageType,
20
+ minApplications: 5,
21
+ minSuccessRate: 0.5,
22
+ };
23
+ const candidates = await queryPatterns(query, ctx.dir);
24
+ if (candidates.length === 0)
25
+ return [];
26
+ const scored = candidates.map(p => {
27
+ const leverage = ctx.weakDimensions.reduce((sum, dim) => {
28
+ return sum + (p.fleetEvidence.medianDimDelta[dim] ?? 0);
29
+ }, 0);
30
+ return { pattern: p, leverage };
31
+ });
32
+ return scored
33
+ .sort((a, b) => b.leverage - a.leverage)
34
+ .slice(0, topN)
35
+ .map(({ pattern, leverage }) => {
36
+ const expectedDelta = {};
37
+ for (const dim of ctx.weakDimensions) {
38
+ expectedDelta[dim] = pattern.fleetEvidence.medianDimDelta[dim] ?? 0;
39
+ }
40
+ return {
41
+ pattern,
42
+ matchConfidence: Math.min(1, leverage / 10),
43
+ expectedDelta,
44
+ applicationGuidance: `Apply ${pattern.scaffold.description}. Key decisions: ${pattern.scaffold.keyDecisions.join('; ')}.`,
45
+ };
46
+ });
47
+ }
48
+ //# sourceMappingURL=match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.js","sourceRoot":"","sources":["../../../../src/design/audit/patterns/match.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAQ1C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAiB,EACjB,OAAe,CAAC;IAEhB,MAAM,KAAK,GAAiB;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,eAAe,EAAE,CAAC;QAClB,cAAc,EAAE,GAAG;KACpB,CAAA;IACD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IACtD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEtC,MAAM,MAAM,GAAkD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC/E,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACtD,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QACzD,CAAC,EAAE,CAAC,CAAC,CAAA;QACL,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM;SACV,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SACvC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;SACd,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7B,MAAM,aAAa,GAA8B,EAA+B,CAAA;QAChF,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YACrC,aAAa,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACrE,CAAC;QACD,OAAO;YACL,OAAO;YACP,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,EAAE,CAAC;YAC3C,aAAa;YACb,mBAAmB,EAAE,SAAS,OAAO,CAAC,QAAQ,CAAC,WAAW,oBAAoB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SAC1H,CAAA;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Layer 5 — Pattern mining (scaffold).
3
+ *
4
+ * In production this runs as a Cloudflare Worker cron job on accumulated
5
+ * PatchApplication telemetry. The mining threshold (N≥30, ≥5 tenants,
6
+ * replicationRate≥0.7) prevents false patterns from premature data.
7
+ *
8
+ * Until fleet data accumulates this module is a scaffold. Run:
9
+ * pnpm patterns:mine --dir ~/.bad
10
+ *
11
+ * TODO: implement clustering algorithm once sufficient attribution data exists.
12
+ */
13
+ import type { PatchApplication } from '../attribution/types.js';
14
+ export interface MineOptions {
15
+ minApplications?: number;
16
+ minTenants?: number;
17
+ minReplicationRate?: number;
18
+ dir?: string;
19
+ }
20
+ /**
21
+ * Mine patterns from accumulated PatchApplication records.
22
+ *
23
+ * Currently a stub — returns 0 mined until clustering is implemented.
24
+ * The interface is stable; consumers can call it safely in tests via synthetic
25
+ * data without triggering real fleet operations.
26
+ */
27
+ export declare function minePatterns(applications: PatchApplication[], opts?: MineOptions): Promise<{
28
+ mined: number;
29
+ skipped: number;
30
+ }>;
31
+ //# sourceMappingURL=mine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mine.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/patterns/mine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAI/D,MAAM,WAAW,WAAW;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAQD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,gBAAgB,EAAE,EAChC,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ7C"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Layer 5 — Pattern mining (scaffold).
3
+ *
4
+ * In production this runs as a Cloudflare Worker cron job on accumulated
5
+ * PatchApplication telemetry. The mining threshold (N≥30, ≥5 tenants,
6
+ * replicationRate≥0.7) prevents false patterns from premature data.
7
+ *
8
+ * Until fleet data accumulates this module is a scaffold. Run:
9
+ * pnpm patterns:mine --dir ~/.bad
10
+ *
11
+ * TODO: implement clustering algorithm once sufficient attribution data exists.
12
+ */
13
+ import { savePattern } from './store.js';
14
+ const DEFAULTS = {
15
+ minApplications: 30,
16
+ minTenants: 5,
17
+ minReplicationRate: 0.7,
18
+ };
19
+ /**
20
+ * Mine patterns from accumulated PatchApplication records.
21
+ *
22
+ * Currently a stub — returns 0 mined until clustering is implemented.
23
+ * The interface is stable; consumers can call it safely in tests via synthetic
24
+ * data without triggering real fleet operations.
25
+ */
26
+ export async function minePatterns(applications, opts = {}) {
27
+ void applications;
28
+ void opts;
29
+ void DEFAULTS;
30
+ void savePattern;
31
+ // TODO: implement structural clustering by (scope, target.cssSelector pattern,
32
+ // diff similarity) once N≥30 fleet data is available. See RFC §Layer 5.
33
+ return { mined: 0, skipped: applications.length };
34
+ }
35
+ //# sourceMappingURL=mine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mine.js","sourceRoot":"","sources":["../../../../src/design/audit/patterns/mine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AASxC,MAAM,QAAQ,GAAuC;IACnD,eAAe,EAAE,EAAE;IACnB,UAAU,EAAE,CAAC;IACb,kBAAkB,EAAE,GAAG;CACxB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAAgC,EAChC,OAAoB,EAAE;IAEtB,KAAK,YAAY,CAAA;IACjB,KAAK,IAAI,CAAA;IACT,KAAK,QAAQ,CAAA;IACb,KAAK,WAAW,CAAA;IAChB,+EAA+E;IAC/E,wEAAwE;IACxE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,MAAM,EAAE,CAAA;AACnD,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Layer 5 — Pattern store.
3
+ *
4
+ * Reads/writes patterns from a JSONL file. In production this is backed by a
5
+ * Cloudflare D1 or R2 store; the JSONL backend is for local dev and tests.
6
+ *
7
+ * Cold-start: the pattern library is empty until fleet data accumulates.
8
+ * The store returns [] for all queries until patterns are mined (Layer 5 mine.ts).
9
+ */
10
+ import type { Pattern, PatternQuery } from './types.js';
11
+ export declare function loadPatterns(dir?: string): Promise<Pattern[]>;
12
+ export declare function savePattern(pattern: Pattern, dir?: string): Promise<void>;
13
+ export declare function queryPatterns(query: PatternQuery, dir?: string): Promise<Pattern[]>;
14
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/patterns/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAKvD,wBAAsB,YAAY,CAAC,GAAG,GAAE,MAAoB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAQhF;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,GAAE,MAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5F;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,YAAY,EACnB,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,OAAO,EAAE,CAAC,CAapB"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Layer 5 — Pattern store.
3
+ *
4
+ * Reads/writes patterns from a JSONL file. In production this is backed by a
5
+ * Cloudflare D1 or R2 store; the JSONL backend is for local dev and tests.
6
+ *
7
+ * Cold-start: the pattern library is empty until fleet data accumulates.
8
+ * The store returns [] for all queries until patterns are mined (Layer 5 mine.ts).
9
+ */
10
+ import * as fs from 'node:fs';
11
+ import * as fsp from 'node:fs/promises';
12
+ import * as path from 'node:path';
13
+ import * as os from 'node:os';
14
+ const DEFAULT_DIR = path.join(os.homedir(), '.bad', 'patterns');
15
+ const PATTERNS_FILE = 'patterns.jsonl';
16
+ export async function loadPatterns(dir = DEFAULT_DIR) {
17
+ const filePath = path.join(dir, PATTERNS_FILE);
18
+ if (!fs.existsSync(filePath))
19
+ return [];
20
+ const lines = fs.readFileSync(filePath, 'utf-8').split('\n').filter(Boolean);
21
+ return lines.flatMap(line => {
22
+ try {
23
+ return [JSON.parse(line)];
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ });
29
+ }
30
+ export async function savePattern(pattern, dir = DEFAULT_DIR) {
31
+ await fsp.mkdir(dir, { recursive: true });
32
+ await fsp.appendFile(path.join(dir, PATTERNS_FILE), JSON.stringify(pattern) + '\n', 'utf-8');
33
+ }
34
+ export async function queryPatterns(query, dir = DEFAULT_DIR) {
35
+ const all = await loadPatterns(dir);
36
+ return all.filter(p => {
37
+ if (query.category && p.category !== query.category)
38
+ return false;
39
+ if (query.pageType && p.classification.type !== query.pageType)
40
+ return false;
41
+ if (query.minApplications && p.fleetEvidence.applications < query.minApplications)
42
+ return false;
43
+ if (query.minSuccessRate && p.fleetEvidence.successRate < query.minSuccessRate)
44
+ return false;
45
+ if (query.weakDimension) {
46
+ const delta = p.fleetEvidence.medianDimDelta[query.weakDimension] ?? 0;
47
+ if (delta <= 0)
48
+ return false;
49
+ }
50
+ return true;
51
+ });
52
+ }
53
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../src/design/audit/patterns/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAA;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAG7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;AAC/D,MAAM,aAAa,GAAG,gBAAgB,CAAA;AAEtC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,WAAW;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAA;IACvC,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC5E,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC1B,IAAI,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC,CAAA;QAAC,CAAC;QAC5C,MAAM,CAAC;YAAC,OAAO,EAAE,CAAA;QAAC,CAAC;IACrB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAgB,EAAE,MAAc,WAAW;IAC3E,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA;AAC9F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAmB,EACnB,MAAc,WAAW;IAEzB,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAA;IACnC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACpB,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAA;QACjE,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,cAAc,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAA;QAC5E,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,aAAa,CAAC,YAAY,GAAG,KAAK,CAAC,eAAe;YAAE,OAAO,KAAK,CAAA;QAC/F,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC,aAAa,CAAC,WAAW,GAAG,KAAK,CAAC,cAAc;YAAE,OAAO,KAAK,CAAA;QAC5F,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YACtE,IAAI,KAAK,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAA;QAC9B,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Layer 5 — Pattern library type contract.
3
+ *
4
+ * Patterns are mined from accumulated PatchApplication data once a cluster
5
+ * meets: N≥30 applications across ≥5 distinct tenants, replicationRate≥0.7.
6
+ * Until fleet data accumulates (≥6 weeks), the pattern library is empty.
7
+ *
8
+ * This module defines the stable query API so agents can code against it now.
9
+ * The mining and matching implementations are scaffolded; real clustering runs
10
+ * as a Cloudflare Worker cron once the attribution data accumulates.
11
+ */
12
+ export type { PageType, Dimension } from '../v2/types.js';
13
+ import type { PageType, Dimension } from '../v2/types.js';
14
+ export interface PatternScaffold {
15
+ description: string;
16
+ referenceTsx?: string;
17
+ referenceCss?: string;
18
+ keyDecisions: string[];
19
+ }
20
+ export interface PatternFleetEvidence {
21
+ applications: number;
22
+ successRate: number;
23
+ medianDimDelta: Record<Dimension, number>;
24
+ sampleTenants: number;
25
+ }
26
+ export interface Pattern {
27
+ patternId: string;
28
+ category: string;
29
+ classification: {
30
+ type: PageType;
31
+ tags: string[];
32
+ };
33
+ scaffold: PatternScaffold;
34
+ scores: {
35
+ whenFollowed: Record<Dimension, number>;
36
+ };
37
+ fleetEvidence: PatternFleetEvidence;
38
+ fixtures: string[];
39
+ }
40
+ export interface PatternQuery {
41
+ category?: string;
42
+ pageType?: PageType;
43
+ weakDimension?: Dimension;
44
+ minApplications?: number;
45
+ minSuccessRate?: number;
46
+ }
47
+ export interface PatternMatch {
48
+ pattern: Pattern;
49
+ matchConfidence: number;
50
+ expectedDelta: Record<Dimension, number>;
51
+ applicationGuidance: string;
52
+ }
53
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/patterns/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAEzD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACzC,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAClD,QAAQ,EAAE,eAAe,CAAA;IACzB,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;KAAE,CAAA;IACnD,aAAa,EAAE,oBAAoB,CAAA;IACnC,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACxC,mBAAmB,EAAE,MAAM,CAAA;CAC5B"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Layer 5 — Pattern library type contract.
3
+ *
4
+ * Patterns are mined from accumulated PatchApplication data once a cluster
5
+ * meets: N≥30 applications across ≥5 distinct tenants, replicationRate≥0.7.
6
+ * Until fleet data accumulates (≥6 weeks), the pattern library is empty.
7
+ *
8
+ * This module defines the stable query API so agents can code against it now.
9
+ * The mining and matching implementations are scaffolded; real clustering runs
10
+ * as a Cloudflare Worker cron once the attribution data accumulates.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/design/audit/patterns/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -9,7 +9,9 @@
9
9
  import type { Page } from 'playwright';
10
10
  import type { Brain } from '../../brain/index.js';
11
11
  import { PlaywrightDriver } from '../../drivers/playwright.js';
12
+ import { type AuditPassId, type AuditOverrides } from './evaluate.js';
12
13
  import type { PageAuditResult } from './types.js';
14
+ import type { AudienceTag, ModalityTag, RegulatoryContextTag, AudienceVulnerabilityTag } from './v2/types.js';
13
15
  export interface AuditOnePageOptions {
14
16
  brain: Brain;
15
17
  driver: PlaywrightDriver;
@@ -21,6 +23,30 @@ export interface AuditOnePageOptions {
21
23
  screenshotDir?: string;
22
24
  /** User-supplied rubric fragments directory */
23
25
  userRubricsDir?: string;
26
+ /** Focused LLM audit passes to run for the subjective evaluation layer */
27
+ auditPasses?: AuditPassId[];
28
+ /** Telemetry correlation — links every page envelope to its parent run. */
29
+ runId?: string;
30
+ parentRunId?: string;
31
+ /** Provider/model — captured into telemetry so a rollup can group by model. */
32
+ provider?: string;
33
+ model?: string;
34
+ /**
35
+ * Evolve-aware overrides. The GEPA harness passes these per-trial to A/B
36
+ * candidate prompts; production runs leave them undefined.
37
+ */
38
+ overrides?: AuditOverrides;
39
+ /**
40
+ * Layer 7 — bypass the ethics gate entirely. Audited + warned. Test-only.
41
+ */
42
+ skipEthics?: boolean;
43
+ /** Override directory containing ethics `*.yaml` rule files. */
44
+ ethicsRulesDir?: string;
45
+ /** Layer 6 hints used by ethics + composable predicates. */
46
+ audience?: AudienceTag[];
47
+ modality?: ModalityTag[];
48
+ regulatoryContext?: RegulatoryContextTag[];
49
+ audienceVulnerability?: AudienceVulnerabilityTag[];
24
50
  }
25
51
  /**
26
52
  * Audit one page through the full Gen 2 pipeline.
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/design/audit/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAK9D,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,YAAY,CAAA;AAErE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAqBD;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAyEtF"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/design/audit/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAI9D,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACnF,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,YAAY,CAAA;AAOrE,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,wBAAwB,EAGzB,MAAM,eAAe,CAAA;AAEtB,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,KAAK,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,WAAW,EAAE,CAAA;IAC3B,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAA;IAC1B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;IACxB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;IACxB,iBAAiB,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAC1C,qBAAqB,CAAC,EAAE,wBAAwB,EAAE,CAAA;CACnD;AAqBD;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CA2NtF"}