@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,211 @@
1
+ /**
2
+ * Layer 1 multi-dim scoring — prompt builder, parser, and rollup.
3
+ *
4
+ * Pure functions. No I/O, no Brain dependency. The pipeline supplies the
5
+ * inputs (classification, rubric, anchor, measurements) and persists the
6
+ * resulting `Record<Dimension, DimensionScore> + RollupScore`.
7
+ */
8
+ import { DIMENSIONS, } from './types.js';
9
+ import { rollupFormula, rollupWeightsFor } from '../rubric/rollup-weights.js';
10
+ import { renderAnchor } from '../rubric/anchor-loader.js';
11
+ const VALID_CONFIDENCE = ['high', 'medium', 'low'];
12
+ const DEFAULT_OPENER = 'You are a principal product-design auditor. Score this page on five universal dimensions independently, with explicit ranges and confidence. The downstream system aggregates these into a page-type-aware rollup.';
13
+ /**
14
+ * Build the v2 evaluation prompt. Demands per-dim DimensionScore output with
15
+ * range + confidence. Does NOT request the rollup — the rollup is computed
16
+ * deterministically from the per-dim scores using rollup-weights.
17
+ */
18
+ export function buildEvalPromptV2(input) {
19
+ const opener = input.systemOpener ?? DEFAULT_OPENER;
20
+ const anchorBlock = input.anchor ? renderAnchor(input.anchor) : '';
21
+ const intentLine = input.intent ? `\nPAGE INTENT (from classifier): ${input.intent}` : '';
22
+ return `${opener}
23
+
24
+ You are auditing a page that has been pre-classified as type=${input.pageType}. Contrast and accessibility measurements have already been counted deterministically — do NOT re-evaluate them. They will be merged with your output.${intentLine}
25
+
26
+ DIMENSIONS — score each one 1-10 (integer) with an explicit uncertainty range and confidence:
27
+
28
+ product_intent — Does the page make its audience, purpose, primary action, and product state obvious within 5 seconds? Empty/loading/error states designed?
29
+ visual_craft — Is the visual system intentional? Typography ramp, spacing rhythm, color tokens, component coherence, polish details. Decorative-but-shallow output is a defect.
30
+ trust_clarity — Are commitments (money, identity, deploy, share, irreversible actions) accompanied by the right trust details (price, fees, permissions, undo path, provenance)?
31
+ workflow — Can a user complete the end-to-end job? State transitions, recovery from failure, action hierarchy match the operational verbs of the system.
32
+ content_ia — Is the copy plain and useful? Are labels and IA tuned to the audience's tasks? Meta-copy that explains the UI is a defect.
33
+
34
+ DETERMINISTIC MEASUREMENTS (do not duplicate):
35
+ ${input.measurementSummary}
36
+
37
+ ${anchorBlock ? anchorBlock + '\n\n' : ''}EVALUATION RUBRIC:
38
+ ${input.rubricBody}
39
+
40
+ OUTPUT REQUIREMENTS:
41
+ - Every dimension MUST have an integer score 1-10.
42
+ - Every dimension MUST have a range [low, high] with low <= score <= high. Range width encodes your uncertainty.
43
+ - Every dimension MUST have confidence in {"high","medium","low"}.
44
+ - Summary is one sentence grounded in observable evidence.
45
+ - primaryFindings is a list of finding ids that drive the score (may be empty if you produce no findings).
46
+
47
+ RESPOND WITH ONLY a JSON object:
48
+ {
49
+ "scores": {
50
+ "product_intent": { "score": 6, "range": [5, 7], "confidence": "medium", "summary": "Hero is clear but action hierarchy is diffuse.", "primaryFindings": [] },
51
+ "visual_craft": { "score": 7, "range": [6, 8], "confidence": "high", "summary": "Spacing rhythm is intentional but type ramp drifts in cards.", "primaryFindings": [] },
52
+ "trust_clarity": { "score": 5, "range": [4, 6], "confidence": "medium", "summary": "Fees disclosed but only at the final step.", "primaryFindings": [] },
53
+ "workflow": { "score": 6, "range": [5, 7], "confidence": "medium", "summary": "Empty state directs the user but error recovery is implicit.", "primaryFindings": [] },
54
+ "content_ia": { "score": 7, "range": [6, 8], "confidence": "high", "summary": "Copy is plain and audience-tuned.", "primaryFindings": [] }
55
+ },
56
+ "summary": "One-sentence overall assessment.",
57
+ "strengths": ["..."],
58
+ "findings": []
59
+ }
60
+
61
+ Score 1-10. Most production apps score 5-7. Only world-class deserves 8+. Be honest.`;
62
+ }
63
+ /**
64
+ * Parse the v2 LLM response. Throws when scores are missing, ranges violate
65
+ * `range[0] <= score <= range[1]`, or score is outside 1..10. The pipeline
66
+ * catches the throw and falls back to v1 mean-of-passes.
67
+ */
68
+ export function parseAuditResponseV2(raw) {
69
+ const parsed = extractJsonObject(raw);
70
+ if (!parsed)
71
+ throw new Error('v2 parser: no JSON object in response');
72
+ const rawScores = parsed.scores;
73
+ if (!rawScores || typeof rawScores !== 'object') {
74
+ throw new Error('v2 parser: missing scores object');
75
+ }
76
+ const scoreMap = rawScores;
77
+ const out = {};
78
+ for (const dim of DIMENSIONS) {
79
+ const dimRaw = scoreMap[dim];
80
+ if (!dimRaw || typeof dimRaw !== 'object') {
81
+ throw new Error(`v2 parser: dimension ${dim} missing`);
82
+ }
83
+ out[dim] = parseDimensionScore(dim, dimRaw);
84
+ }
85
+ return {
86
+ scores: out,
87
+ summary: typeof parsed.summary === 'string' ? parsed.summary : '',
88
+ strengths: Array.isArray(parsed.strengths)
89
+ ? (parsed.strengths.filter((s) => typeof s === 'string'))
90
+ : [],
91
+ };
92
+ }
93
+ function parseDimensionScore(dim, raw) {
94
+ const score = raw.score;
95
+ if (typeof score !== 'number' || !Number.isFinite(score)) {
96
+ throw new Error(`v2 parser: ${dim}.score must be a number`);
97
+ }
98
+ const integerScore = Math.round(score);
99
+ if (integerScore < 1 || integerScore > 10) {
100
+ throw new Error(`v2 parser: ${dim}.score=${integerScore} outside 1..10`);
101
+ }
102
+ const range = raw.range;
103
+ if (!Array.isArray(range) || range.length !== 2 || typeof range[0] !== 'number' || typeof range[1] !== 'number') {
104
+ throw new Error(`v2 parser: ${dim}.range must be [number, number]`);
105
+ }
106
+ const [low, high] = range;
107
+ if (low > high) {
108
+ throw new Error(`v2 parser: ${dim}.range=[${low},${high}] inverted`);
109
+ }
110
+ if (integerScore < low || integerScore > high) {
111
+ throw new Error(`v2 parser: ${dim}.score=${integerScore} outside range [${low},${high}]`);
112
+ }
113
+ if (low < 1 || high > 10) {
114
+ throw new Error(`v2 parser: ${dim}.range=[${low},${high}] outside 1..10`);
115
+ }
116
+ const confidenceRaw = String(raw.confidence ?? '').toLowerCase();
117
+ const confidence = VALID_CONFIDENCE.includes(confidenceRaw)
118
+ ? confidenceRaw
119
+ : 'medium';
120
+ const summary = typeof raw.summary === 'string' ? raw.summary : '';
121
+ const primaryFindings = Array.isArray(raw.primaryFindings)
122
+ ? raw.primaryFindings.filter((s) => typeof s === 'string')
123
+ : [];
124
+ return { score: integerScore, range: [low, high], confidence, summary, primaryFindings };
125
+ }
126
+ /**
127
+ * Compute the rollup from per-dimension scores using per-page-type weights.
128
+ * Conservative confidence rule: rollup confidence = lowest dim confidence.
129
+ */
130
+ export function computeRollup(scores, pageType) {
131
+ const weights = rollupWeightsFor(pageType);
132
+ let weighted = 0;
133
+ let lowSum = 0;
134
+ let highSum = 0;
135
+ for (const dim of DIMENSIONS) {
136
+ const dimScore = scores[dim];
137
+ const w = weights[dim];
138
+ weighted += dimScore.score * w;
139
+ lowSum += dimScore.range[0] * w;
140
+ highSum += dimScore.range[1] * w;
141
+ }
142
+ const score = Math.round(weighted * 10) / 10;
143
+ const range = [
144
+ Math.round(lowSum * 10) / 10,
145
+ Math.round(highSum * 10) / 10,
146
+ ];
147
+ const confidences = DIMENSIONS.map((d) => scores[d].confidence);
148
+ const confidence = confidences.includes('low')
149
+ ? 'low'
150
+ : confidences.includes('medium')
151
+ ? 'medium'
152
+ : 'high';
153
+ return {
154
+ score,
155
+ range,
156
+ confidence,
157
+ rule: rollupFormula(pageType, weights),
158
+ weights,
159
+ };
160
+ }
161
+ /**
162
+ * Aggregate per-dim scores from N independent passes (mean). Used when the
163
+ * audit runs deep mode and we want one DimensionScore per dimension.
164
+ */
165
+ export function mergeDimensionScoresAcrossPasses(perPass) {
166
+ if (perPass.length === 0) {
167
+ throw new Error('mergeDimensionScoresAcrossPasses: empty input');
168
+ }
169
+ if (perPass.length === 1)
170
+ return perPass[0];
171
+ const out = {};
172
+ for (const dim of DIMENSIONS) {
173
+ const samples = perPass.map((p) => p[dim]);
174
+ const meanScore = samples.reduce((a, s) => a + s.score, 0) / samples.length;
175
+ const meanLow = samples.reduce((a, s) => a + s.range[0], 0) / samples.length;
176
+ const meanHigh = samples.reduce((a, s) => a + s.range[1], 0) / samples.length;
177
+ const conf = samples.map((s) => s.confidence);
178
+ const confidence = conf.includes('low') ? 'low' : conf.includes('medium') ? 'medium' : 'high';
179
+ const allFindings = samples.flatMap((s) => s.primaryFindings);
180
+ const primaryFindings = Array.from(new Set(allFindings)).slice(0, 3);
181
+ const summary = samples.find((s) => s.summary)?.summary ?? '';
182
+ out[dim] = {
183
+ score: Math.round(meanScore),
184
+ range: [
185
+ Math.max(1, Math.floor(meanLow)),
186
+ Math.min(10, Math.ceil(meanHigh)),
187
+ ],
188
+ confidence,
189
+ summary,
190
+ primaryFindings,
191
+ };
192
+ }
193
+ return out;
194
+ }
195
+ function extractJsonObject(raw) {
196
+ try {
197
+ let text = raw.trim();
198
+ if (text.startsWith('```')) {
199
+ text = text.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
200
+ }
201
+ const start = text.indexOf('{');
202
+ const end = text.lastIndexOf('}');
203
+ if (start < 0 || end <= start)
204
+ return null;
205
+ return JSON.parse(text.slice(start, end + 1));
206
+ }
207
+ catch {
208
+ return null;
209
+ }
210
+ }
211
+ //# sourceMappingURL=score.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.js","sourceRoot":"","sources":["../../../../src/design/audit/v2/score.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,431 @@
1
+ /**
2
+ * Design audit v2 — type contract for the 8-layer architecture.
3
+ *
4
+ * RFC: docs/rfc/design-audit-world-class.md
5
+ *
6
+ * This file is the stable contract that every layer's implementation
7
+ * builds against. It exists to let parallel implementation work proceed
8
+ * without diverging interfaces. Editing this file mid-build is a coordinated
9
+ * change; layers must update in lockstep.
10
+ *
11
+ * Invariants enforced by this contract:
12
+ * - Every score is a `DimensionScore` with `range` + `confidence`. No bare numbers.
13
+ * - Every finding with `severity in ['major','critical']` MUST have ≥1 `Patch`.
14
+ * - Every patch has both `target` (what changes) and `testThatProves` (how we verify).
15
+ * - Every classification carries explicit `ensembleConfidence` and `signalsAgreed`.
16
+ * - Every audit run can write a `PatchApplication` event for post-hoc attribution.
17
+ * - Pattern, ethics, modality types compose cleanly via shared `AppliesWhen`.
18
+ */
19
+ import type { PageClassification, PageType, Maturity, DesignSystemTag, AppliesWhen as AppliesWhenV1, MeasurementBundle, DesignFinding as DesignFindingV1 } from '../types.js';
20
+ export type { PageClassification, PageType, Maturity, DesignSystemTag, MeasurementBundle };
21
+ /**
22
+ * The five universal dimensions. Every audit produces a DimensionScore for
23
+ * each. The rollup is computed from these via per-page-type weights.
24
+ */
25
+ export type Dimension = 'product_intent' | 'visual_craft' | 'trust_clarity' | 'workflow' | 'content_ia';
26
+ export declare const DIMENSIONS: readonly Dimension[];
27
+ export type ConfidenceLevel = 'high' | 'medium' | 'low';
28
+ export interface DimensionScore {
29
+ /** 1-10 integer score on the dimension. */
30
+ score: number;
31
+ /** Self-reported uncertainty range. `range[0] <= score <= range[1]`. */
32
+ range: [number, number];
33
+ /** Auditor's confidence in the score. */
34
+ confidence: ConfidenceLevel;
35
+ /** One-sentence assessment grounded in observable evidence. */
36
+ summary: string;
37
+ /** Stable ids of top findings driving this score. References `DesignFinding.id`. */
38
+ primaryFindings: string[];
39
+ }
40
+ export interface RollupScore {
41
+ /** Weighted aggregate of `Record<Dimension, DimensionScore>`. 1-10 number, can be fractional. */
42
+ score: number;
43
+ /** Aggregate uncertainty range. */
44
+ range: [number, number];
45
+ /** Aggregate confidence. Conservative — `low` if any dim is `low`. */
46
+ confidence: ConfidenceLevel;
47
+ /** Human-readable formula, e.g. "saas-app: product*0.35 + workflow*0.30 + ...". */
48
+ rule: string;
49
+ /** Per-dimension weight that produced this rollup. Must sum to 1.0 ± 1e-6. */
50
+ weights: Record<Dimension, number>;
51
+ }
52
+ export type ClassifierSource = 'url-pattern' | 'dom-heuristic' | 'llm';
53
+ export interface ClassifierSignal {
54
+ source: ClassifierSource;
55
+ type: PageType;
56
+ /** 0..1, source-specific. */
57
+ confidence: number;
58
+ /** Why this signal voted this type. Logged for debugging. */
59
+ rationale: string;
60
+ }
61
+ export interface EnsembleClassification extends PageClassification {
62
+ /** Every signal that voted on this classification. */
63
+ signals: ClassifierSignal[];
64
+ /** True if all signals agreed on `type`. */
65
+ signalsAgreed: boolean;
66
+ /** Aggregated 0..1 confidence after ensemble vote. */
67
+ ensembleConfidence: number;
68
+ /** Signals that disagreed with the final type, if any. */
69
+ dissent?: {
70
+ source: ClassifierSource;
71
+ type: PageType;
72
+ }[];
73
+ /** True if Layer 3 (first-principles) mode was triggered. */
74
+ firstPrinciplesMode: boolean;
75
+ }
76
+ /**
77
+ * DOM-derived signals used by the heuristic classifier. Captured once during
78
+ * the page-load phase, fed to the ensemble vote, and emitted into telemetry.
79
+ */
80
+ export interface DomHeuristics {
81
+ formCount: number;
82
+ inputCount: number;
83
+ tableRowCount: number;
84
+ chartCount: number;
85
+ navItems: number;
86
+ hasFooterLinks: boolean;
87
+ hasHeroSection: boolean;
88
+ hasSidebar: boolean;
89
+ paragraphCount: number;
90
+ codeBlockCount: number;
91
+ }
92
+ /**
93
+ * Where a patch applies. At least one of `cssSelector | filePath | componentName`
94
+ * MUST be set. The combination determines how an agent applies it.
95
+ */
96
+ export interface PatchTarget {
97
+ /** Source file path when known via component scan. */
98
+ filePath?: string;
99
+ /** Component name when known (e.g. 'Sidebar', 'PrimaryButton'). */
100
+ componentName?: string;
101
+ /** CSS selector — fallback when filePath unknown. */
102
+ cssSelector?: string;
103
+ /** Patch scope. Determines applicability check. */
104
+ scope: 'tsx' | 'jsx' | 'css' | 'tailwind' | 'module-css' | 'styled-component' | 'structural' | 'html';
105
+ }
106
+ export interface PatchDiff {
107
+ /**
108
+ * Exact substring being replaced. Validators MUST verify `before` is a
109
+ * substring of the page snapshot or source file at apply time. If `before`
110
+ * is not found, the patch is rejected (no fuzzy apply).
111
+ */
112
+ before: string;
113
+ /** Replacement text. */
114
+ after: string;
115
+ /**
116
+ * When `target.filePath` is known, the unified diff format an agent can
117
+ * pipe to `git apply`. Optional; `before`/`after` is the canonical form.
118
+ */
119
+ unifiedDiff?: string;
120
+ }
121
+ export type PatchTestKind = 'storybook' | 'a11y-rule' | 'visual-snapshot' | 'unit' | 'rerun-audit' | 'manual';
122
+ export interface PatchTest {
123
+ kind: PatchTestKind;
124
+ /** Human-readable description of what proves the patch worked. */
125
+ description: string;
126
+ /** Optional CLI command an agent can invoke to verify (e.g. `pnpm vitest <name>`). */
127
+ command?: string;
128
+ }
129
+ export type PatchRollbackKind = 'git-revert' | 'css-disable' | 'manual';
130
+ export interface PatchRollback {
131
+ kind: PatchRollbackKind;
132
+ /** Optional human-readable rollback instruction. */
133
+ instruction?: string;
134
+ }
135
+ /**
136
+ * A `Patch` is the agent-actionable unit. Layer 2 mandates ≥1 patch on every
137
+ * major/critical finding. Findings without patches downgrade to minor.
138
+ */
139
+ export interface Patch {
140
+ /** Stable id derived from finding hash + target. Same patch across tenants → same id. */
141
+ patchId: string;
142
+ /** The finding this patch fixes. */
143
+ findingId: string;
144
+ /** Patch scope — page/section/component/system, drives ROI weighting. */
145
+ scope: 'page' | 'section' | 'component' | 'system';
146
+ target: PatchTarget;
147
+ diff: PatchDiff;
148
+ testThatProves: PatchTest;
149
+ rollback: PatchRollback;
150
+ /** The dimension the auditor predicts this patch will move + by how much. */
151
+ estimatedDelta: {
152
+ dim: Dimension;
153
+ delta: number;
154
+ };
155
+ /**
156
+ * Confidence in `estimatedDelta`, calibrated against fleet outcomes (Layer 4).
157
+ * 'untested' means no fleet data yet; 'high' means N≥30 with replication ≥0.7.
158
+ */
159
+ estimatedDeltaConfidence: ConfidenceLevel | 'untested';
160
+ /**
161
+ * If this patch matches a known fleet pattern (Layer 5), the matched pattern
162
+ * id. Surfaced by the auditor so agents prefer evidence-backed patches.
163
+ */
164
+ matchedPatternId?: string;
165
+ }
166
+ /**
167
+ * Updated `DesignFinding` shape — extends v1 with stable id, dimension link,
168
+ * mandatory patches for major/critical, optional pattern match.
169
+ */
170
+ export interface DesignFinding extends DesignFindingV1 {
171
+ /** Stable id, used by `DimensionScore.primaryFindings`. */
172
+ id: string;
173
+ /** Which dimension this finding affects. */
174
+ dimension: Dimension;
175
+ /** Agent-actionable patches. Required (≥1) when severity is major or critical. */
176
+ patches: Patch[];
177
+ /**
178
+ * Discriminator for finding kind. `polish` findings cap at impact 6;
179
+ * `job` findings can go to 10; `measurement` findings come from axe/contrast.
180
+ * Set this so ROI ranking auto-prioritizes job over polish.
181
+ */
182
+ kind: 'polish' | 'job' | 'measurement';
183
+ }
184
+ /**
185
+ * Triggered when ensemble confidence is low or no fixture matches the page
186
+ * structure. Auditor scores against 5 universal principles and emits a
187
+ * novel-pattern record for fleet mining.
188
+ */
189
+ export interface NovelPatternObservation {
190
+ observationId: string;
191
+ capturedAt: string;
192
+ /** What was distinctive about this page structurally. */
193
+ observed: string;
194
+ /** Closest existing classification, with low confidence. */
195
+ closestType: PageType;
196
+ closestConfidence: number;
197
+ /** Page snapshot reference for later mining. */
198
+ snapshotKey?: string;
199
+ /** URL or fixture id. */
200
+ pageRef: string;
201
+ }
202
+ /**
203
+ * One application of a patch. Emitted by the `bad design-audit ack-patch`
204
+ * subcommand or auto-detected by the `--evolve` loop.
205
+ */
206
+ export interface PatchApplication {
207
+ applicationId: string;
208
+ patchId: string;
209
+ /** `sha256(diff.before + '\n---\n' + diff.after + '\n---\n' + scope).slice(0, 16)` */
210
+ patchHash: string;
211
+ appliedAt: string;
212
+ appliedBy: string;
213
+ /** The audit run that proposed the patch. */
214
+ preAuditRunId: string;
215
+ /** The audit run after the patch was applied. May be null until re-audit. */
216
+ postAuditRunId?: string;
217
+ /** Auditor's prediction at apply time. */
218
+ predicted: {
219
+ dim: Dimension;
220
+ delta: number;
221
+ };
222
+ /** Measured delta after re-audit. Populated when postAuditRunId resolves. */
223
+ observed?: {
224
+ dim: Dimension;
225
+ delta: number;
226
+ };
227
+ /**
228
+ * Agreement metric: 1.0 = perfect prediction, 0 = orthogonal, negative = wrong direction.
229
+ * `(observed.delta * predicted.delta) / max(|observed.delta|, |predicted.delta|, 1)`
230
+ */
231
+ agreementScore?: number;
232
+ }
233
+ /**
234
+ * Aggregated reliability across all applications of a patch (joined on
235
+ * `patchHash = hash(diff.before, diff.after, scope)`). Surfaces in audit
236
+ * output as `Patch.estimatedDeltaConfidence` upgrade.
237
+ */
238
+ export interface PatchReliability {
239
+ patchHash: string;
240
+ applications: number;
241
+ meanPredictedDelta: number;
242
+ meanObservedDelta: number;
243
+ /** % of applications where observed >= 0.5 * predicted. */
244
+ replicationRate: number;
245
+ recommendation: 'recommended' | 'neutral' | 'antipattern';
246
+ /** Distinct tenant count. Below 5 → 'untested' confidence. */
247
+ sampleTenants: number;
248
+ }
249
+ /**
250
+ * A curated known-good design pattern, mined from accumulated PatchApplication
251
+ * data once N≥30 across ≥5 distinct tenants with ≥0.7 replication.
252
+ */
253
+ export interface Pattern {
254
+ patternId: string;
255
+ /** Free-form category name, e.g. 'leaderboard', 'empty-state', 'pricing-table'. */
256
+ category: string;
257
+ classification: {
258
+ type: PageType;
259
+ tags: string[];
260
+ };
261
+ scaffold: PatternScaffold;
262
+ scores: {
263
+ whenFollowed: Record<Dimension, number>;
264
+ };
265
+ fleetEvidence: PatternFleetEvidence;
266
+ /** Fixture ids that exemplify this pattern. */
267
+ fixtures: string[];
268
+ }
269
+ export interface PatternScaffold {
270
+ description: string;
271
+ referenceTsx?: string;
272
+ referenceCss?: string;
273
+ /** Concrete decisions that make the pattern work, e.g. 'criterion in header'. */
274
+ keyDecisions: string[];
275
+ }
276
+ export interface PatternFleetEvidence {
277
+ applications: number;
278
+ /** % where adopting this pattern delivered the predicted dim delta. */
279
+ successRate: number;
280
+ medianDimDelta: Record<Dimension, number>;
281
+ /** Distinct tenants. ≥5 required for promotion to 'recommended'. */
282
+ sampleTenants: number;
283
+ }
284
+ export interface PatternQuery {
285
+ category?: string;
286
+ pageType?: PageType;
287
+ /** "I'm scoring 4 on product_intent — show me patterns that lift it." */
288
+ weakDimension?: Dimension;
289
+ minApplications?: number;
290
+ minSuccessRate?: number;
291
+ }
292
+ export interface PatternMatch {
293
+ pattern: Pattern;
294
+ matchConfidence: number;
295
+ expectedDelta: Record<Dimension, number>;
296
+ /** How to adapt this pattern to the current page. */
297
+ applicationGuidance: string;
298
+ }
299
+ export type AudienceTag = 'developer' | 'clinician' | 'analyst' | 'consumer' | 'admin' | 'kids' | 'enterprise-buyer' | 'creator';
300
+ export type ModalityTag = 'desktop' | 'tablet' | 'mobile' | 'tv' | 'kiosk';
301
+ export type RegulatoryContextTag = 'hipaa' | 'gdpr' | 'sox' | 'pci-dss' | 'coppa' | 'wcag-aaa';
302
+ export type AudienceVulnerabilityTag = 'patient-facing' | 'minor-facing' | 'high-stakes-financial' | 'crisis-context';
303
+ /**
304
+ * v2 predicate set. Extends v1 with audience/modality/regulatoryContext/
305
+ * audienceVulnerability so a pediatric medical app on tablet for clinicians
306
+ * loads multiple fragments simultaneously.
307
+ */
308
+ export interface AppliesWhen extends AppliesWhenV1 {
309
+ audience?: AudienceTag[];
310
+ modality?: ModalityTag[];
311
+ regulatoryContext?: RegulatoryContextTag[];
312
+ audienceVulnerability?: AudienceVulnerabilityTag[];
313
+ }
314
+ export type EthicsCategory = 'medical' | 'kids' | 'finance' | 'legal' | 'accessibility' | 'crisis';
315
+ export type EthicsSeverity = 'critical-floor' | 'major-floor';
316
+ export interface EthicsRule {
317
+ ruleId: string;
318
+ category: EthicsCategory;
319
+ severity: EthicsSeverity;
320
+ appliesWhen: AppliesWhen;
321
+ detector: EthicsDetector;
322
+ remediation: string;
323
+ /** Citation to regulation or standard, e.g. 'FDA 21 CFR 201.57'. */
324
+ citation?: string;
325
+ }
326
+ export type EthicsDetector = {
327
+ kind: 'pattern-absent';
328
+ pattern: string;
329
+ } | {
330
+ kind: 'pattern-present';
331
+ pattern: string;
332
+ } | {
333
+ kind: 'llm-classifier';
334
+ llmCheck: string;
335
+ };
336
+ export interface EthicsViolation {
337
+ ruleId: string;
338
+ detected: true;
339
+ severity: EthicsSeverity;
340
+ /** Rollup ceiling enforced by this violation. critical-floor → 4; major-floor → 6. */
341
+ rollupCap: number;
342
+ remediation: string;
343
+ citation?: string;
344
+ }
345
+ export type Modality = 'html' | 'ios' | 'android' | 'terminal' | 'voice';
346
+ export interface ModalityInput {
347
+ /** Modality-specific entry point — URL for HTML, app bundle for iOS, etc. */
348
+ entryPoint: string;
349
+ /** Optional flow specification when capturing multiple surfaces. */
350
+ flow?: string[];
351
+ }
352
+ /**
353
+ * Per-modality measurement bundle — analogous to the existing HTML
354
+ * MeasurementBundle (axe + contrast). Modality-specific implementations
355
+ * provide their own a11y/contrast equivalents.
356
+ */
357
+ export interface SurfaceMeasurements {
358
+ modality: Modality;
359
+ /** A11y violations — modality-specific shape. */
360
+ a11y?: unknown;
361
+ /** Contrast or readability check — modality-specific. */
362
+ contrast?: unknown;
363
+ /** Modality-specific measurements (haptic, latency, etc.). */
364
+ extra?: Record<string, unknown>;
365
+ }
366
+ export interface SurfaceRecord {
367
+ /** URL for HTML; screen name for native; turn id for voice. */
368
+ identifier: string;
369
+ measurements: SurfaceMeasurements;
370
+ snapshot: string;
371
+ screenshot?: string;
372
+ }
373
+ export interface Evidence {
374
+ modality: Modality;
375
+ surfaces: SurfaceRecord[];
376
+ /** Roll-up of per-surface measurements for backwards compat with v1 pipeline. */
377
+ measurements: MeasurementBundle;
378
+ /** Concatenated snapshot for LLM consumption. */
379
+ snapshot: string;
380
+ screenshot?: string;
381
+ }
382
+ export interface ModalityAdapter {
383
+ modality: Modality;
384
+ capture(input: ModalityInput): Promise<Evidence>;
385
+ }
386
+ export interface AuditResult_v2 {
387
+ schemaVersion: 2;
388
+ /** Run id for telemetry / attribution correlation. */
389
+ runId: string;
390
+ /** Page reference (URL for HTML; bundle id for native; etc.). */
391
+ pageRef: string;
392
+ classification: EnsembleClassification;
393
+ /** Per-dimension scores, ALWAYS all 5 dimensions. */
394
+ scores: Record<Dimension, DimensionScore>;
395
+ rollup: RollupScore;
396
+ /** Findings + patches. Includes deterministic measurements (axe, contrast). */
397
+ findings: DesignFinding[];
398
+ /** Top-N findings ranked by ROI. References `findings[*].id`. */
399
+ topFixes: string[];
400
+ measurements: MeasurementBundle;
401
+ ethicsViolations: EthicsViolation[];
402
+ /** Patterns matched against the page (Layer 5). May be empty. */
403
+ matchedPatterns: PatternMatch[];
404
+ /** When first-principles mode triggered (Layer 3). May be undefined. */
405
+ novelPattern?: NovelPatternObservation;
406
+ /** Modality (Layer 8). HTML for v1 compat. */
407
+ modality: Modality;
408
+ /** Provenance. */
409
+ evaluatedAt: string;
410
+ promptHash: string;
411
+ rubricHash: string;
412
+ /** LLM token usage across passes. */
413
+ tokensUsed?: number;
414
+ /** Ensemble of audit passes that ran (deep / max / single). */
415
+ passes: string[];
416
+ error?: string;
417
+ }
418
+ /**
419
+ * Operator-supplied hints. None override the classifier outright; they bias
420
+ * the ensemble toward a result. If a hint disagrees with the classifier's
421
+ * final type with high confidence, a warning surfaces.
422
+ */
423
+ export interface AuditRuntimeHints {
424
+ rubricHint?: PageType;
425
+ audience?: AudienceTag[];
426
+ modality?: ModalityTag[];
427
+ regulatoryContext?: RegulatoryContextTag[];
428
+ /** Tenant id for cross-tenant attribution + ethics rule overrides. */
429
+ tenantId?: string;
430
+ }
431
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/design/audit/v2/types.ts"],"names":[],"mappings":"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"}