audrey 1.1.2 → 1.2.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 (285) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +39 -12
  3. package/dist/mcp-server/codex-hooks-probe.d.ts +22 -0
  4. package/dist/mcp-server/codex-hooks-probe.d.ts.map +1 -0
  5. package/dist/mcp-server/codex-hooks-probe.js +160 -0
  6. package/dist/mcp-server/codex-hooks-probe.js.map +1 -0
  7. package/dist/mcp-server/config.d.ts +26 -2
  8. package/dist/mcp-server/config.d.ts.map +1 -1
  9. package/dist/mcp-server/config.js +52 -20
  10. package/dist/mcp-server/config.js.map +1 -1
  11. package/dist/mcp-server/hooks.d.ts +28 -0
  12. package/dist/mcp-server/hooks.d.ts.map +1 -1
  13. package/dist/mcp-server/hooks.js +91 -2
  14. package/dist/mcp-server/hooks.js.map +1 -1
  15. package/dist/mcp-server/index.d.ts +242 -2
  16. package/dist/mcp-server/index.d.ts.map +1 -1
  17. package/dist/mcp-server/index.js +806 -240
  18. package/dist/mcp-server/index.js.map +1 -1
  19. package/dist/mcp-server/tool-schemas.d.ts +32 -2
  20. package/dist/mcp-server/tool-schemas.d.ts.map +1 -1
  21. package/dist/mcp-server/tool-schemas.js +55 -0
  22. package/dist/mcp-server/tool-schemas.js.map +1 -1
  23. package/dist/src/audrey.d.ts +14 -2
  24. package/dist/src/audrey.d.ts.map +1 -1
  25. package/dist/src/audrey.js +152 -28
  26. package/dist/src/audrey.js.map +1 -1
  27. package/dist/src/autopilot.d.ts +22 -0
  28. package/dist/src/autopilot.d.ts.map +1 -1
  29. package/dist/src/autopilot.js +271 -50
  30. package/dist/src/autopilot.js.map +1 -1
  31. package/dist/src/capsule.d.ts +23 -0
  32. package/dist/src/capsule.d.ts.map +1 -1
  33. package/dist/src/capsule.js +56 -11
  34. package/dist/src/capsule.js.map +1 -1
  35. package/dist/src/confidence.d.ts +9 -1
  36. package/dist/src/confidence.d.ts.map +1 -1
  37. package/dist/src/confidence.js +16 -2
  38. package/dist/src/confidence.js.map +1 -1
  39. package/dist/src/consolidate.d.ts +4 -0
  40. package/dist/src/consolidate.d.ts.map +1 -1
  41. package/dist/src/consolidate.js +206 -34
  42. package/dist/src/consolidate.js.map +1 -1
  43. package/dist/src/controller.d.ts +17 -1
  44. package/dist/src/controller.d.ts.map +1 -1
  45. package/dist/src/controller.js +244 -128
  46. package/dist/src/controller.js.map +1 -1
  47. package/dist/src/db.d.ts.map +1 -1
  48. package/dist/src/db.js +233 -56
  49. package/dist/src/db.js.map +1 -1
  50. package/dist/src/encode.d.ts +2 -1
  51. package/dist/src/encode.d.ts.map +1 -1
  52. package/dist/src/encode.js +41 -4
  53. package/dist/src/encode.js.map +1 -1
  54. package/dist/src/events.d.ts +48 -1
  55. package/dist/src/events.d.ts.map +1 -1
  56. package/dist/src/events.js +160 -62
  57. package/dist/src/events.js.map +1 -1
  58. package/dist/src/export.d.ts.map +1 -1
  59. package/dist/src/export.js +4 -4
  60. package/dist/src/export.js.map +1 -1
  61. package/dist/src/grounding.d.ts +111 -0
  62. package/dist/src/grounding.d.ts.map +1 -0
  63. package/dist/src/grounding.js +259 -0
  64. package/dist/src/grounding.js.map +1 -0
  65. package/dist/src/hybrid-recall.d.ts +16 -7
  66. package/dist/src/hybrid-recall.d.ts.map +1 -1
  67. package/dist/src/hybrid-recall.js +22 -11
  68. package/dist/src/hybrid-recall.js.map +1 -1
  69. package/dist/src/import.d.ts +10 -0
  70. package/dist/src/import.d.ts.map +1 -1
  71. package/dist/src/import.js +122 -22
  72. package/dist/src/import.js.map +1 -1
  73. package/dist/src/llm.d.ts.map +1 -1
  74. package/dist/src/llm.js +16 -0
  75. package/dist/src/llm.js.map +1 -1
  76. package/dist/src/preflight.d.ts.map +1 -1
  77. package/dist/src/preflight.js +89 -47
  78. package/dist/src/preflight.js.map +1 -1
  79. package/dist/src/project.d.ts +4 -1
  80. package/dist/src/project.d.ts.map +1 -1
  81. package/dist/src/project.js +65 -5
  82. package/dist/src/project.js.map +1 -1
  83. package/dist/src/recall.d.ts.map +1 -1
  84. package/dist/src/recall.js +138 -13
  85. package/dist/src/recall.js.map +1 -1
  86. package/dist/src/redact.d.ts +1 -1
  87. package/dist/src/redact.d.ts.map +1 -1
  88. package/dist/src/redact.js +185 -5
  89. package/dist/src/redact.js.map +1 -1
  90. package/dist/src/routes.d.ts.map +1 -1
  91. package/dist/src/routes.js +91 -18
  92. package/dist/src/routes.js.map +1 -1
  93. package/dist/src/trust.d.ts +35 -0
  94. package/dist/src/trust.d.ts.map +1 -0
  95. package/dist/src/trust.js +77 -0
  96. package/dist/src/trust.js.map +1 -0
  97. package/dist/src/types.d.ts +24 -0
  98. package/dist/src/types.d.ts.map +1 -1
  99. package/package.json +4 -38
  100. package/benchmarks/adapter-kit.mjs +0 -20
  101. package/benchmarks/adapter-self-test.mjs +0 -170
  102. package/benchmarks/adapters/example-allow.mjs +0 -31
  103. package/benchmarks/adapters/mem0-platform.mjs +0 -274
  104. package/benchmarks/adapters/registry.json +0 -51
  105. package/benchmarks/adapters/zep-cloud.mjs +0 -304
  106. package/benchmarks/baselines.js +0 -174
  107. package/benchmarks/build-leaderboard.mjs +0 -183
  108. package/benchmarks/cases.js +0 -549
  109. package/benchmarks/create-conformance-card.mjs +0 -148
  110. package/benchmarks/create-submission-bundle.mjs +0 -190
  111. package/benchmarks/dry-run-external-adapters.mjs +0 -177
  112. package/benchmarks/guardbench.js +0 -1265
  113. package/benchmarks/output/adapter-self-test/guardbench-adapter-self-test.json +0 -50
  114. package/benchmarks/output/external/guardbench-external-dry-run.json +0 -69
  115. package/benchmarks/output/external/guardbench-external-evidence.json +0 -56
  116. package/benchmarks/output/guardbench-conformance-card.json +0 -63
  117. package/benchmarks/output/guardbench-manifest.json +0 -414
  118. package/benchmarks/output/guardbench-raw.json +0 -1279
  119. package/benchmarks/output/guardbench-summary.json +0 -2123
  120. package/benchmarks/output/leaderboard/guardbench-leaderboard.json +0 -93
  121. package/benchmarks/output/leaderboard/guardbench-leaderboard.md +0 -7
  122. package/benchmarks/output/submission-bundle/guardbench-conformance-card.json +0 -63
  123. package/benchmarks/output/submission-bundle/guardbench-manifest.json +0 -414
  124. package/benchmarks/output/submission-bundle/guardbench-raw.json +0 -1279
  125. package/benchmarks/output/submission-bundle/guardbench-summary.json +0 -2123
  126. package/benchmarks/output/submission-bundle/schemas/guardbench-adapter-registry.schema.json +0 -69
  127. package/benchmarks/output/submission-bundle/schemas/guardbench-adapter-self-test.schema.json +0 -156
  128. package/benchmarks/output/submission-bundle/schemas/guardbench-conformance-card.schema.json +0 -184
  129. package/benchmarks/output/submission-bundle/schemas/guardbench-external-dry-run.schema.json +0 -74
  130. package/benchmarks/output/submission-bundle/schemas/guardbench-external-evidence.schema.json +0 -108
  131. package/benchmarks/output/submission-bundle/schemas/guardbench-external-run.schema.json +0 -160
  132. package/benchmarks/output/submission-bundle/schemas/guardbench-leaderboard.schema.json +0 -179
  133. package/benchmarks/output/submission-bundle/schemas/guardbench-manifest.schema.json +0 -213
  134. package/benchmarks/output/submission-bundle/schemas/guardbench-publication-verification.schema.json +0 -47
  135. package/benchmarks/output/submission-bundle/schemas/guardbench-raw.schema.json +0 -184
  136. package/benchmarks/output/submission-bundle/schemas/guardbench-submission-manifest.schema.json +0 -151
  137. package/benchmarks/output/submission-bundle/schemas/guardbench-summary.schema.json +0 -249
  138. package/benchmarks/output/submission-bundle/submission-manifest.json +0 -131
  139. package/benchmarks/output/submission-bundle/validation-report.json +0 -31
  140. package/benchmarks/output/summary.json +0 -2354
  141. package/benchmarks/perf-snapshot.js +0 -307
  142. package/benchmarks/perf.bench.js +0 -169
  143. package/benchmarks/public-paths.mjs +0 -97
  144. package/benchmarks/reference-results.js +0 -75
  145. package/benchmarks/report.js +0 -280
  146. package/benchmarks/run-external-guardbench.mjs +0 -303
  147. package/benchmarks/run.js +0 -735
  148. package/benchmarks/schemas/guardbench-adapter-registry.schema.json +0 -69
  149. package/benchmarks/schemas/guardbench-adapter-self-test.schema.json +0 -156
  150. package/benchmarks/schemas/guardbench-conformance-card.schema.json +0 -184
  151. package/benchmarks/schemas/guardbench-external-dry-run.schema.json +0 -74
  152. package/benchmarks/schemas/guardbench-external-evidence.schema.json +0 -108
  153. package/benchmarks/schemas/guardbench-external-run.schema.json +0 -160
  154. package/benchmarks/schemas/guardbench-leaderboard.schema.json +0 -179
  155. package/benchmarks/schemas/guardbench-manifest.schema.json +0 -213
  156. package/benchmarks/schemas/guardbench-publication-verification.schema.json +0 -47
  157. package/benchmarks/schemas/guardbench-raw.schema.json +0 -184
  158. package/benchmarks/schemas/guardbench-submission-manifest.schema.json +0 -151
  159. package/benchmarks/schemas/guardbench-summary.schema.json +0 -249
  160. package/benchmarks/snapshots/perf-0.22.2.json +0 -123
  161. package/benchmarks/snapshots/perf-0.23.0.json +0 -123
  162. package/benchmarks/validate-adapter-module.mjs +0 -107
  163. package/benchmarks/validate-adapter-registry.mjs +0 -145
  164. package/benchmarks/validate-adapter-self-test.mjs +0 -96
  165. package/benchmarks/validate-guardbench-artifacts.mjs +0 -400
  166. package/benchmarks/verify-external-evidence.mjs +0 -351
  167. package/benchmarks/verify-publication-artifacts.mjs +0 -309
  168. package/benchmarks/verify-submission-bundle.mjs +0 -172
  169. package/docs/AUDREY_PAPER_OUTLINE.md +0 -178
  170. package/docs/MEMORY_BENCHMARKING.md +0 -59
  171. package/docs/PRODUCTION_BACKLOG.md +0 -321
  172. package/docs/assets/audrey-feature-grid.jpg +0 -0
  173. package/docs/assets/audrey-logo.svg +0 -45
  174. package/docs/assets/audrey-wordmark.png +0 -0
  175. package/docs/paper/00-master.md +0 -48
  176. package/docs/paper/01-introduction.md +0 -27
  177. package/docs/paper/02-related-work.md +0 -47
  178. package/docs/paper/03-problem-definition.md +0 -108
  179. package/docs/paper/04-design.md +0 -164
  180. package/docs/paper/05-guardbench-spec.md +0 -412
  181. package/docs/paper/06-implementation.md +0 -115
  182. package/docs/paper/07-evaluation.md +0 -168
  183. package/docs/paper/08-discussion-limitations.md +0 -61
  184. package/docs/paper/09-conclusion.md +0 -11
  185. package/docs/paper/SUBMISSION_README.md +0 -162
  186. package/docs/paper/appendix-a-demo-transcript.md +0 -114
  187. package/docs/paper/arxiv-compile-report.schema.json +0 -116
  188. package/docs/paper/arxiv-source.schema.json +0 -61
  189. package/docs/paper/audrey-paper-v1.md +0 -1108
  190. package/docs/paper/browser-launch-plan.json +0 -209
  191. package/docs/paper/browser-launch-plan.schema.json +0 -100
  192. package/docs/paper/browser-launch-results.json +0 -86
  193. package/docs/paper/browser-launch-results.schema.json +0 -66
  194. package/docs/paper/claim-register.json +0 -138
  195. package/docs/paper/claim-register.schema.json +0 -81
  196. package/docs/paper/evidence-ledger.md +0 -103
  197. package/docs/paper/output/arxiv/README-arxiv.txt +0 -8
  198. package/docs/paper/output/arxiv/arxiv-manifest.json +0 -41
  199. package/docs/paper/output/arxiv/main.tex +0 -951
  200. package/docs/paper/output/arxiv/references.bib +0 -222
  201. package/docs/paper/output/arxiv-compile-report.json +0 -24
  202. package/docs/paper/output/submission-bundle/LICENSE +0 -21
  203. package/docs/paper/output/submission-bundle/README.md +0 -440
  204. package/docs/paper/output/submission-bundle/benchmarks/output/adapter-self-test/guardbench-adapter-self-test.json +0 -50
  205. package/docs/paper/output/submission-bundle/benchmarks/output/external/guardbench-external-dry-run.json +0 -69
  206. package/docs/paper/output/submission-bundle/benchmarks/output/external/guardbench-external-evidence.json +0 -56
  207. package/docs/paper/output/submission-bundle/benchmarks/output/guardbench-conformance-card.json +0 -63
  208. package/docs/paper/output/submission-bundle/benchmarks/output/guardbench-manifest.json +0 -414
  209. package/docs/paper/output/submission-bundle/benchmarks/output/guardbench-raw.json +0 -1279
  210. package/docs/paper/output/submission-bundle/benchmarks/output/guardbench-summary.json +0 -2123
  211. package/docs/paper/output/submission-bundle/benchmarks/output/leaderboard/guardbench-leaderboard.json +0 -93
  212. package/docs/paper/output/submission-bundle/benchmarks/output/leaderboard/guardbench-leaderboard.md +0 -7
  213. package/docs/paper/output/submission-bundle/benchmarks/output/submission-bundle/submission-manifest.json +0 -131
  214. package/docs/paper/output/submission-bundle/benchmarks/output/submission-bundle/validation-report.json +0 -31
  215. package/docs/paper/output/submission-bundle/benchmarks/output/summary.json +0 -2354
  216. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-adapter-registry.schema.json +0 -69
  217. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-adapter-self-test.schema.json +0 -156
  218. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-conformance-card.schema.json +0 -184
  219. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-external-dry-run.schema.json +0 -74
  220. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-external-evidence.schema.json +0 -108
  221. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-external-run.schema.json +0 -160
  222. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-leaderboard.schema.json +0 -179
  223. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-manifest.schema.json +0 -213
  224. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-publication-verification.schema.json +0 -47
  225. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-raw.schema.json +0 -184
  226. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-submission-manifest.schema.json +0 -151
  227. package/docs/paper/output/submission-bundle/benchmarks/schemas/guardbench-summary.schema.json +0 -249
  228. package/docs/paper/output/submission-bundle/docs/AUDREY_PAPER_OUTLINE.md +0 -178
  229. package/docs/paper/output/submission-bundle/docs/paper/00-master.md +0 -48
  230. package/docs/paper/output/submission-bundle/docs/paper/01-introduction.md +0 -27
  231. package/docs/paper/output/submission-bundle/docs/paper/02-related-work.md +0 -47
  232. package/docs/paper/output/submission-bundle/docs/paper/03-problem-definition.md +0 -108
  233. package/docs/paper/output/submission-bundle/docs/paper/04-design.md +0 -164
  234. package/docs/paper/output/submission-bundle/docs/paper/05-guardbench-spec.md +0 -412
  235. package/docs/paper/output/submission-bundle/docs/paper/06-implementation.md +0 -115
  236. package/docs/paper/output/submission-bundle/docs/paper/07-evaluation.md +0 -168
  237. package/docs/paper/output/submission-bundle/docs/paper/08-discussion-limitations.md +0 -61
  238. package/docs/paper/output/submission-bundle/docs/paper/09-conclusion.md +0 -11
  239. package/docs/paper/output/submission-bundle/docs/paper/SUBMISSION_README.md +0 -162
  240. package/docs/paper/output/submission-bundle/docs/paper/appendix-a-demo-transcript.md +0 -114
  241. package/docs/paper/output/submission-bundle/docs/paper/arxiv-compile-report.schema.json +0 -116
  242. package/docs/paper/output/submission-bundle/docs/paper/arxiv-source.schema.json +0 -61
  243. package/docs/paper/output/submission-bundle/docs/paper/audrey-paper-v1.md +0 -1108
  244. package/docs/paper/output/submission-bundle/docs/paper/browser-launch-plan.json +0 -209
  245. package/docs/paper/output/submission-bundle/docs/paper/browser-launch-plan.schema.json +0 -100
  246. package/docs/paper/output/submission-bundle/docs/paper/browser-launch-results.json +0 -86
  247. package/docs/paper/output/submission-bundle/docs/paper/browser-launch-results.schema.json +0 -66
  248. package/docs/paper/output/submission-bundle/docs/paper/claim-register.json +0 -138
  249. package/docs/paper/output/submission-bundle/docs/paper/claim-register.schema.json +0 -81
  250. package/docs/paper/output/submission-bundle/docs/paper/evidence-ledger.md +0 -103
  251. package/docs/paper/output/submission-bundle/docs/paper/output/arxiv/README-arxiv.txt +0 -8
  252. package/docs/paper/output/submission-bundle/docs/paper/output/arxiv/arxiv-manifest.json +0 -41
  253. package/docs/paper/output/submission-bundle/docs/paper/output/arxiv/main.tex +0 -951
  254. package/docs/paper/output/submission-bundle/docs/paper/output/arxiv/references.bib +0 -222
  255. package/docs/paper/output/submission-bundle/docs/paper/output/arxiv-compile-report.json +0 -24
  256. package/docs/paper/output/submission-bundle/docs/paper/paper-submission-bundle.schema.json +0 -70
  257. package/docs/paper/output/submission-bundle/docs/paper/publication-pack.json +0 -81
  258. package/docs/paper/output/submission-bundle/docs/paper/publication-pack.schema.json +0 -60
  259. package/docs/paper/output/submission-bundle/docs/paper/references.bib +0 -222
  260. package/docs/paper/output/submission-bundle/package.json +0 -235
  261. package/docs/paper/output/submission-bundle/paper-submission-manifest.json +0 -379
  262. package/docs/paper/paper-submission-bundle.schema.json +0 -70
  263. package/docs/paper/publication-pack.json +0 -81
  264. package/docs/paper/publication-pack.schema.json +0 -60
  265. package/docs/paper/references.bib +0 -222
  266. package/scripts/audit-release-completion.mjs +0 -440
  267. package/scripts/create-arxiv-source.mjs +0 -368
  268. package/scripts/create-paper-submission-bundle.mjs +0 -214
  269. package/scripts/finalize-release.mjs +0 -601
  270. package/scripts/prepare-release-cut.mjs +0 -277
  271. package/scripts/publish-release-bundle.mjs +0 -252
  272. package/scripts/publish-release-github-api.mjs +0 -494
  273. package/scripts/run-vitest.mjs +0 -34
  274. package/scripts/smoke-cli.js +0 -92
  275. package/scripts/sync-paper-artifacts.mjs +0 -112
  276. package/scripts/verify-arxiv-compile.mjs +0 -476
  277. package/scripts/verify-arxiv-source.mjs +0 -224
  278. package/scripts/verify-browser-launch-plan.mjs +0 -254
  279. package/scripts/verify-browser-launch-results.mjs +0 -303
  280. package/scripts/verify-paper-artifacts.mjs +0 -798
  281. package/scripts/verify-paper-claims.mjs +0 -254
  282. package/scripts/verify-paper-submission-bundle.mjs +0 -218
  283. package/scripts/verify-publication-pack.mjs +0 -210
  284. package/scripts/verify-python-package.py +0 -201
  285. package/scripts/verify-release-readiness.mjs +0 -920
@@ -1,798 +0,0 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { resolve } from 'node:path';
3
- import { verifyPaperClaims } from './verify-paper-claims.mjs';
4
- import { verifyPaperSubmissionBundle } from './verify-paper-submission-bundle.mjs';
5
- import { verifyPublicationPack } from './verify-publication-pack.mjs';
6
- import { verifyBrowserLaunchPlan } from './verify-browser-launch-plan.mjs';
7
- import { verifyBrowserLaunchResults } from './verify-browser-launch-results.mjs';
8
- import { verifyArxivSourcePackage } from './verify-arxiv-source.mjs';
9
- import { verifyArxivCompileReport } from './verify-arxiv-compile.mjs';
10
-
11
- const ROOT = process.cwd();
12
- const SEEDED_SECRET = 'sk-guardbench-secret-0000000000000000000000000000';
13
-
14
- function readText(path) {
15
- const absolute = resolve(ROOT, path);
16
- if (!existsSync(absolute)) throw new Error(`Missing required file: ${path}`);
17
- return readFileSync(absolute, 'utf-8');
18
- }
19
-
20
- function readJson(path) {
21
- return JSON.parse(readText(path));
22
- }
23
-
24
- function assert(condition, message, failures) {
25
- if (!condition) failures.push(message);
26
- }
27
-
28
- function formatMetric(value) {
29
- return String(value);
30
- }
31
-
32
- function countEvidenceRows(ledger) {
33
- return ledger.split(/\r?\n/).filter(line => /^\| E\d+ - /.test(line)).length;
34
- }
35
-
36
- function countBibEntries(bib) {
37
- return [...bib.matchAll(/@\w+\s*\{/g)].length;
38
- }
39
-
40
- function ensureContainsAll(text, needles, label, failures) {
41
- for (const needle of needles) {
42
- assert(text.includes(needle), `${label} is missing: ${needle}`, failures);
43
- }
44
- }
45
-
46
- function ensureContainsAllProse(text, needles, label, failures) {
47
- const normalized = text.replace(/\s+/g, ' ').toLowerCase();
48
- for (const needle of needles) {
49
- assert(normalized.includes(needle.toLowerCase()), `${label} is missing: ${needle}`, failures);
50
- }
51
- }
52
-
53
- function typeOf(value) {
54
- if (Array.isArray(value)) return 'array';
55
- if (value === null) return 'null';
56
- return typeof value;
57
- }
58
-
59
- function validateSchema(value, schema, label, root = schema) {
60
- const errors = [];
61
-
62
- function validate(current, currentSchema, path) {
63
- if (currentSchema.$ref) {
64
- const refPath = currentSchema.$ref.replace(/^#\//, '').split('/');
65
- const resolved = refPath.reduce((node, key) => node?.[key], root);
66
- if (!resolved) {
67
- errors.push(`${path}: unresolved schema ref ${currentSchema.$ref}`);
68
- return;
69
- }
70
- validate(current, resolved, path);
71
- return;
72
- }
73
-
74
- if (currentSchema.anyOf) {
75
- const nested = currentSchema.anyOf.map(option => {
76
- const before = errors.length;
77
- validate(current, option, path);
78
- return errors.splice(before);
79
- });
80
- const passed = nested.some(group => group.length === 0);
81
- if (!passed) errors.push(`${path}: did not match any allowed schema`);
82
- return;
83
- }
84
-
85
- if (currentSchema.const !== undefined && current !== currentSchema.const) {
86
- errors.push(`${path}: expected constant ${currentSchema.const}`);
87
- }
88
- if (currentSchema.enum && !currentSchema.enum.includes(current)) {
89
- errors.push(`${path}: expected one of ${currentSchema.enum.join(', ')}`);
90
- }
91
- if (currentSchema.type === 'integer') {
92
- if (typeof current !== 'number' || !Number.isInteger(current)) {
93
- errors.push(`${path}: expected integer, got ${typeOf(current)}`);
94
- return;
95
- }
96
- } else if (currentSchema.type) {
97
- const actual = typeOf(current);
98
- if (actual !== currentSchema.type) {
99
- errors.push(`${path}: expected ${currentSchema.type}, got ${actual}`);
100
- return;
101
- }
102
- }
103
- if (currentSchema.minLength != null && String(current).length < currentSchema.minLength) {
104
- errors.push(`${path}: shorter than minLength ${currentSchema.minLength}`);
105
- }
106
- if (
107
- currentSchema.pattern &&
108
- typeof current === 'string' &&
109
- !new RegExp(currentSchema.pattern).test(current)
110
- ) {
111
- errors.push(`${path}: does not match ${currentSchema.pattern}`);
112
- }
113
- if (
114
- currentSchema.minimum != null &&
115
- typeof current === 'number' &&
116
- current < currentSchema.minimum
117
- ) {
118
- errors.push(`${path}: below minimum ${currentSchema.minimum}`);
119
- }
120
- if (
121
- currentSchema.maximum != null &&
122
- typeof current === 'number' &&
123
- current > currentSchema.maximum
124
- ) {
125
- errors.push(`${path}: above maximum ${currentSchema.maximum}`);
126
- }
127
-
128
- if (currentSchema.type === 'array') {
129
- if (currentSchema.minItems != null && current.length < currentSchema.minItems) {
130
- errors.push(`${path}: expected at least ${currentSchema.minItems} items`);
131
- }
132
- if (currentSchema.items) {
133
- current.forEach((item, index) => validate(item, currentSchema.items, `${path}[${index}]`));
134
- }
135
- if (currentSchema.contains) {
136
- const matched = current.some(
137
- item =>
138
- validateSchema(item, currentSchema.contains, `${path}.contains`, root).length === 0,
139
- );
140
- if (!matched) errors.push(`${path}: no item matched contains constraint`);
141
- }
142
- }
143
-
144
- if (currentSchema.type === 'object') {
145
- for (const required of currentSchema.required ?? []) {
146
- if (!Object.hasOwn(current, required))
147
- errors.push(`${path}: missing required property ${required}`);
148
- }
149
- if (currentSchema.additionalProperties === false) {
150
- for (const key of Object.keys(current)) {
151
- if (!Object.hasOwn(currentSchema.properties ?? {}, key)) {
152
- errors.push(`${path}: unexpected property ${key}`);
153
- }
154
- }
155
- }
156
- for (const [key, propertySchema] of Object.entries(currentSchema.properties ?? {})) {
157
- if (Object.hasOwn(current, key)) validate(current[key], propertySchema, `${path}.${key}`);
158
- }
159
- }
160
- }
161
-
162
- validate(value, schema, label);
163
- return errors;
164
- }
165
-
166
- const failures = [];
167
-
168
- const summary = readJson('benchmarks/output/summary.json');
169
- const guardSummary = readJson('benchmarks/output/guardbench-summary.json');
170
- const guardManifest = readJson('benchmarks/output/guardbench-manifest.json');
171
- const guardRaw = readJson('benchmarks/output/guardbench-raw.json');
172
- const guardAdapterSelfTest = readJson(
173
- 'benchmarks/output/adapter-self-test/guardbench-adapter-self-test.json',
174
- );
175
- const guardAdapterRegistry = readJson('benchmarks/adapters/registry.json');
176
- const guardExternalDryRun = readJson('benchmarks/output/external/guardbench-external-dry-run.json');
177
- const guardExternalEvidence = readJson(
178
- 'benchmarks/output/external/guardbench-external-evidence.json',
179
- );
180
- const guardManifestSchema = readJson('benchmarks/schemas/guardbench-manifest.schema.json');
181
- const guardSummarySchema = readJson('benchmarks/schemas/guardbench-summary.schema.json');
182
- const guardRawSchema = readJson('benchmarks/schemas/guardbench-raw.schema.json');
183
- const guardAdapterSelfTestSchema = readJson(
184
- 'benchmarks/schemas/guardbench-adapter-self-test.schema.json',
185
- );
186
- const guardAdapterRegistrySchema = readJson(
187
- 'benchmarks/schemas/guardbench-adapter-registry.schema.json',
188
- );
189
- const guardExternalDryRunSchema = readJson(
190
- 'benchmarks/schemas/guardbench-external-dry-run.schema.json',
191
- );
192
- const guardExternalEvidenceSchema = readJson(
193
- 'benchmarks/schemas/guardbench-external-evidence.schema.json',
194
- );
195
- const guardPublicationVerificationSchema = readJson(
196
- 'benchmarks/schemas/guardbench-publication-verification.schema.json',
197
- );
198
- const packageJsonText = readText('package.json');
199
- const readme = readText('README.md');
200
- const evaluation = readText('docs/paper/07-evaluation.md');
201
- const paper = readText('docs/paper/audrey-paper-v1.md');
202
- const ledger = readText('docs/paper/evidence-ledger.md');
203
- const submission = readText('docs/paper/SUBMISSION_README.md');
204
- const references = readText('docs/paper/references.bib');
205
- const browserPlan = readText('docs/paper/browser-launch-plan.json');
206
- const browserLaunchResultsVerifier = readText('scripts/verify-browser-launch-results.mjs');
207
- const claimReport = await verifyPaperClaims();
208
- const publicationPackReport = await verifyPublicationPack();
209
- const arxivSourceReport = verifyArxivSourcePackage();
210
- const arxivCompileReport = verifyArxivCompileReport({ allowPending: true });
211
- const browserLaunchReport = await verifyBrowserLaunchPlan();
212
- const browserLaunchResultsReport = await verifyBrowserLaunchResults();
213
- const paperBundleReport = verifyPaperSubmissionBundle();
214
-
215
- const local = Object.fromEntries(summary.local.overall.map(row => [row.system, row]));
216
- const evidenceRows = countEvidenceRows(ledger);
217
- const bibEntries = countBibEntries(references);
218
-
219
- assert(
220
- evidenceRows >= 97,
221
- `Expected at least 97 evidence ledger rows, found ${evidenceRows}`,
222
- failures,
223
- );
224
- assert(
225
- submission.includes(`Evidence ledger with ${evidenceRows} rows`),
226
- 'SUBMISSION_README ledger row count is stale',
227
- failures,
228
- );
229
- assert(bibEntries === 21, `Expected 21 bibliography entries, found ${bibEntries}`, failures);
230
- assert(
231
- submission.includes(`Primary-source bibliography with ${bibEntries} entries`),
232
- 'SUBMISSION_README bibliography count is stale',
233
- failures,
234
- );
235
-
236
- ensureContainsAll(
237
- ledger,
238
- [
239
- '| E46 -',
240
- '| E47 -',
241
- '| E48 -',
242
- '| E49 -',
243
- '| E50 -',
244
- '| E51 -',
245
- '| E52 -',
246
- '| E53 -',
247
- '| E54 -',
248
- '| E55 -',
249
- '| E56 -',
250
- '| E57 -',
251
- '| E58 -',
252
- '| E59 -',
253
- '| E60 -',
254
- '| E61 -',
255
- '| E62 -',
256
- '| E63 -',
257
- '| E64 -',
258
- '| E65 -',
259
- '| E66 -',
260
- '| E67 -',
261
- '| E68 -',
262
- '| E69 -',
263
- '| E70 -',
264
- '| E71 -',
265
- '| E72 -',
266
- '| E73 -',
267
- '| E74 -',
268
- '| E75 -',
269
- '| E76 -',
270
- '| E77 -',
271
- '| E78 -',
272
- '| E79 -',
273
- '| E80 -',
274
- '| E81 -',
275
- '| E82 -',
276
- '| E83 -',
277
- '| E84 -',
278
- '| E85 -',
279
- '| E86 -',
280
- '| E87 -',
281
- '| E88 -',
282
- '| E89 -',
283
- '| E90 -',
284
- '| E91 -',
285
- '| E92 -',
286
- '| E93 -',
287
- '| E94 -',
288
- '| E95 -',
289
- '| E96 -',
290
- '| E97 -',
291
- ],
292
- 'evidence-ledger.md',
293
- failures,
294
- );
295
- ensureContainsAll(
296
- submission,
297
- [
298
- 'Ledger: E46-E51',
299
- 'artifact redaction sweep',
300
- 'local absolute-path sweep',
301
- 'public-paths.mjs',
302
- 'adapter-kit.mjs',
303
- 'registry.json',
304
- 'claim-register.json',
305
- 'publication-pack.json',
306
- 'reservedUrlChars',
307
- 'arxiv-source.schema.json',
308
- 'arxiv-compile-report.schema.json',
309
- 'arxiv-compile-report.json',
310
- 'docs/paper/output/arxiv',
311
- 'paper:arxiv',
312
- 'paper:arxiv:verify',
313
- 'paper:arxiv:compile',
314
- 'paper:arxiv:compile:strict',
315
- 'browser-launch-plan.json',
316
- 'browser-launch-plan.schema.json',
317
- 'browser-launch-results.json',
318
- 'browser-launch-results.schema.json',
319
- 'artifactUrl',
320
- 'x-counting-characters',
321
- 'paper-submission-bundle.schema.json',
322
- 'docs/paper/output/submission-bundle',
323
- 'paper:bundle',
324
- 'paper:bundle:verify',
325
- 'paper:launch-plan',
326
- 'paper:launch-results',
327
- 'paper:launch-results:strict',
328
- 'release:cut:plan',
329
- 'release:cut:apply',
330
- 'release:readiness',
331
- 'release:readiness:strict',
332
- 'python:release:check',
333
- 'Python package release verifier',
334
- 'npm audit --omit=dev --audit-level=moderate',
335
- 'bench:guard:adapter-registry:validate',
336
- 'bench:guard:adapter-module:validate',
337
- 'bench:guard:adapter-self-test',
338
- 'bench:guard:adapter-self-test:validate',
339
- 'bench:guard:publication:verify',
340
- 'bench:guard:external:dry-run',
341
- 'bench:guard:external:evidence',
342
- 'bench:guard:external:evidence:strict',
343
- 'paper:claims',
344
- 'paper:publication-pack',
345
- 'guardbench-adapter-self-test.schema.json',
346
- 'guardbench-adapter-registry.schema.json',
347
- 'guardbench-external-dry-run.schema.json',
348
- 'guardbench-external-evidence.schema.json',
349
- 'guardbench-publication-verification.schema.json',
350
- 'zep-cloud.mjs',
351
- 'bench:guard:zep',
352
- 'ZEP_API_KEY',
353
- ],
354
- 'SUBMISSION_README.md',
355
- failures,
356
- );
357
- ensureContainsAllProse(
358
- submission,
359
- [
360
- 'source-control release-state check',
361
- 'live remote-head verification',
362
- 'git ls-remote',
363
- 'npm registry/auth readiness',
364
- 'npm whoami',
365
- 'audrey@1.0.0',
366
- 'PyPI publish readiness',
367
- ],
368
- 'SUBMISSION_README.md',
369
- failures,
370
- );
371
- ensureContainsAll(
372
- packageJsonText,
373
- [
374
- '"scripts/*.py"',
375
- '"python:release:check"',
376
- '"paper:arxiv:compile"',
377
- '"paper:arxiv:compile:strict"',
378
- ],
379
- 'package.json',
380
- failures,
381
- );
382
- if (!claimReport.ok) {
383
- failures.push(
384
- ...claimReport.failures.map(failure => `Paper claim verification failed: ${failure}`),
385
- );
386
- }
387
- if (!publicationPackReport.ok) {
388
- failures.push(
389
- ...publicationPackReport.failures.map(
390
- failure => `Publication pack verification failed: ${failure}`,
391
- ),
392
- );
393
- }
394
- if (!arxivSourceReport.ok) {
395
- failures.push(
396
- ...arxivSourceReport.failures.map(
397
- failure => `arXiv source package verification failed: ${failure}`,
398
- ),
399
- );
400
- }
401
- if (!arxivCompileReport.ok) {
402
- failures.push(
403
- ...arxivCompileReport.failures.map(
404
- failure => `arXiv compile report verification failed: ${failure}`,
405
- ),
406
- );
407
- }
408
- if (!browserLaunchReport.ok) {
409
- failures.push(
410
- ...browserLaunchReport.failures.map(
411
- failure => `Browser launch plan verification failed: ${failure}`,
412
- ),
413
- );
414
- }
415
- if (!browserLaunchResultsReport.ok) {
416
- failures.push(
417
- ...browserLaunchResultsReport.failures.map(
418
- failure => `Browser launch results verification failed: ${failure}`,
419
- ),
420
- );
421
- }
422
- if (!paperBundleReport.ok) {
423
- failures.push(
424
- ...paperBundleReport.failures.map(
425
- failure => `Paper submission bundle verification failed: ${failure}`,
426
- ),
427
- );
428
- }
429
- if (arxivCompileReport.status === 'passed') {
430
- assert(
431
- paperBundleReport.files.includes('docs/paper/output/arxiv-compile/main.pdf'),
432
- 'Paper submission bundle missing compiled arXiv PDF',
433
- failures,
434
- );
435
- assert(
436
- paperBundleReport.files.includes('docs/paper/output/arxiv-compile/arxiv-compile.log'),
437
- 'Paper submission bundle missing arXiv compile log',
438
- failures,
439
- );
440
- }
441
- const firstXPost = publicationPackReport.entries.find(entry => entry.id === 'x-post-1');
442
- assert(firstXPost?.requiresArtifactUrl === true, 'x-post-1 must require an artifact URL', failures);
443
- assert(
444
- firstXPost?.reservedUrlChars >= 24,
445
- 'x-post-1 must reserve at least 24 characters for an X URL plus separator',
446
- failures,
447
- );
448
- assert(
449
- firstXPost?.effectiveChars <= 280,
450
- 'x-post-1 text plus URL reserve must fit within 280 characters',
451
- failures,
452
- );
453
- ensureContainsAll(
454
- browserPlan,
455
- [
456
- 'x-counting-characters',
457
- 'https://docs.x.com/fundamentals/counting-characters',
458
- 'reservedUrlChars',
459
- ],
460
- 'browser-launch-plan.json',
461
- failures,
462
- );
463
- ensureContainsAll(
464
- browserLaunchResultsVerifier,
465
- ['submitted artifact-url target must record artifactUrl'],
466
- 'verify-browser-launch-results.mjs',
467
- failures,
468
- );
469
-
470
- const manifestSchemaErrors = validateSchema(
471
- guardManifest,
472
- guardManifestSchema,
473
- 'guardbench-manifest',
474
- );
475
- for (const error of manifestSchemaErrors)
476
- failures.push(`GuardBench manifest schema violation: ${error}`);
477
- const summarySchemaErrors = validateSchema(guardSummary, guardSummarySchema, 'guardbench-summary');
478
- for (const error of summarySchemaErrors)
479
- failures.push(`GuardBench summary schema violation: ${error}`);
480
- const rawSchemaErrors = validateSchema(guardRaw, guardRawSchema, 'guardbench-raw');
481
- for (const error of rawSchemaErrors) failures.push(`GuardBench raw schema violation: ${error}`);
482
- const adapterSelfTestSchemaErrors = validateSchema(
483
- guardAdapterSelfTest,
484
- guardAdapterSelfTestSchema,
485
- 'guardbench-adapter-self-test',
486
- );
487
- for (const error of adapterSelfTestSchemaErrors)
488
- failures.push(`GuardBench adapter self-test schema violation: ${error}`);
489
- const adapterRegistrySchemaErrors = validateSchema(
490
- guardAdapterRegistry,
491
- guardAdapterRegistrySchema,
492
- 'guardbench-adapter-registry',
493
- );
494
- for (const error of adapterRegistrySchemaErrors)
495
- failures.push(`GuardBench adapter registry schema violation: ${error}`);
496
- const externalDryRunSchemaErrors = validateSchema(
497
- guardExternalDryRun,
498
- guardExternalDryRunSchema,
499
- 'guardbench-external-dry-run',
500
- );
501
- for (const error of externalDryRunSchemaErrors)
502
- failures.push(`GuardBench external dry-run schema violation: ${error}`);
503
- const externalEvidenceSchemaErrors = validateSchema(
504
- guardExternalEvidence,
505
- guardExternalEvidenceSchema,
506
- 'guardbench-external-evidence',
507
- );
508
- for (const error of externalEvidenceSchemaErrors)
509
- failures.push(`GuardBench external evidence schema violation: ${error}`);
510
- const registryIds = guardAdapterRegistry.adapters.map(adapter => adapter.id);
511
- assert(
512
- registryIds.includes('mem0-platform'),
513
- 'GuardBench adapter registry missing mem0-platform',
514
- failures,
515
- );
516
- assert(
517
- registryIds.includes('zep-cloud'),
518
- 'GuardBench adapter registry missing zep-cloud',
519
- failures,
520
- );
521
- const dryRunIds = guardExternalDryRun.adapters.map(adapter => adapter.id);
522
- assert(
523
- dryRunIds.includes('mem0-platform'),
524
- 'GuardBench external dry-run matrix missing mem0-platform',
525
- failures,
526
- );
527
- assert(
528
- dryRunIds.includes('zep-cloud'),
529
- 'GuardBench external dry-run matrix missing zep-cloud',
530
- failures,
531
- );
532
- assert(
533
- guardExternalDryRun.adapters.every(adapter => !JSON.stringify(adapter).includes('runtime-key')),
534
- 'GuardBench external dry-run matrix contains a test secret',
535
- failures,
536
- );
537
- const evidenceIds = guardExternalEvidence.adapters.map(adapter => adapter.id);
538
- assert(
539
- guardExternalEvidence.allowPending === true,
540
- 'GuardBench external evidence report should allow pending live runs in the release gate',
541
- failures,
542
- );
543
- assert(
544
- evidenceIds.includes('mem0-platform'),
545
- 'GuardBench external evidence report missing mem0-platform',
546
- failures,
547
- );
548
- assert(
549
- evidenceIds.includes('zep-cloud'),
550
- 'GuardBench external evidence report missing zep-cloud',
551
- failures,
552
- );
553
- assert(
554
- guardExternalEvidence.adapters.every(adapter => ['pending', 'verified'].includes(adapter.status)),
555
- 'GuardBench external evidence report has an invalid adapter status',
556
- failures,
557
- );
558
- assert(
559
- guardExternalEvidence.adapters.every(adapter => !JSON.stringify(adapter).includes('runtime-key')),
560
- 'GuardBench external evidence report contains a test secret',
561
- failures,
562
- );
563
- const zepAdapter = guardAdapterRegistry.adapters.find(adapter => adapter.id === 'zep-cloud');
564
- assert(
565
- zepAdapter?.credentialMode === 'runtime-env',
566
- 'Zep adapter must require runtime environment credentials',
567
- failures,
568
- );
569
- assert(
570
- zepAdapter?.requiredEnv?.includes('ZEP_API_KEY'),
571
- 'Zep adapter registry entry missing ZEP_API_KEY',
572
- failures,
573
- );
574
- assert(
575
- zepAdapter?.commands?.externalRun === 'npm run bench:guard:zep',
576
- 'Zep adapter external-run command is stale',
577
- failures,
578
- );
579
- const publicationVerificationFixture = {
580
- schemaVersion: '1.0.0',
581
- suite: 'GuardBench publication artifact verification',
582
- generatedAt: '2026-05-13T00:00:00.000Z',
583
- ok: true,
584
- checks: {
585
- registry: { ok: true, failures: [] },
586
- adapterModule: { ok: true, failures: [] },
587
- selfTest: { ok: true, failures: [] },
588
- artifacts: { ok: true, failures: [] },
589
- bundle: { ok: true, failures: [] },
590
- externalDryRun: { ok: true, failures: [] },
591
- externalEvidence: { ok: true, failures: [] },
592
- leaderboard: { ok: true, failures: [] },
593
- localPaths: { ok: true, failures: [] },
594
- },
595
- failures: [],
596
- };
597
- const publicationVerificationSchemaErrors = validateSchema(
598
- publicationVerificationFixture,
599
- guardPublicationVerificationSchema,
600
- 'guardbench-publication-verification',
601
- );
602
- for (const error of publicationVerificationSchemaErrors)
603
- failures.push(`GuardBench publication verifier schema violation: ${error}`);
604
-
605
- const benchmarkNeedles = [
606
- summary.generatedAt,
607
- `| Audrey | ${local.Audrey.scorePercent} | ${local.Audrey.passRate} | ${formatMetric(local.Audrey.avgDurationMs)} |`,
608
- `| Vector Only | ${local['Vector Only'].scorePercent} | ${local['Vector Only'].passRate} | ${formatMetric(local['Vector Only'].avgDurationMs)} |`,
609
- `| Keyword + Recency | ${local['Keyword + Recency'].scorePercent} | ${local['Keyword + Recency'].passRate} | ${formatMetric(local['Keyword + Recency'].avgDurationMs)} |`,
610
- ];
611
- ensureContainsAll(evaluation, benchmarkNeedles, '07-evaluation.md', failures);
612
- ensureContainsAll(paper, benchmarkNeedles, 'audrey-paper-v1.md', failures);
613
-
614
- const latency = guardSummary.latency;
615
- const guardLatencyText = `${formatMetric(latency.p50Ms)} ms / ${formatMetric(latency.p95Ms)} ms`;
616
- ensureContainsAll(
617
- evaluation,
618
- [guardLatencyText, '| Published artifact raw-secret leaks | 0 |'],
619
- '07-evaluation.md',
620
- failures,
621
- );
622
- ensureContainsAll(
623
- paper,
624
- [guardLatencyText, '| Published artifact raw-secret leaks | 0 |'],
625
- 'audrey-paper-v1.md',
626
- failures,
627
- );
628
- ensureContainsAll(
629
- readme,
630
- [
631
- `${formatMetric(latency.p50Ms)}ms / ${formatMetric(latency.p95Ms)}ms`,
632
- '0 published artifact leaks',
633
- ],
634
- 'README.md',
635
- failures,
636
- );
637
- ensureContainsAll(
638
- readme,
639
- [
640
- 'bench:guard:zep',
641
- 'bench:guard:external:dry-run',
642
- 'bench:guard:external:evidence',
643
- 'bench:guard:external:evidence:strict',
644
- 'paper:arxiv:compile',
645
- 'paper:arxiv:compile:strict',
646
- 'paper:launch-results',
647
- 'paper:launch-results:strict',
648
- 'release:cut:plan',
649
- 'release:cut:apply',
650
- 'release:readiness',
651
- 'release:readiness:strict',
652
- 'python:release:check',
653
- 'absolute-path sweep',
654
- 'X URL reserve',
655
- 'submitted artifact-url targets',
656
- 'external dry-run matrix',
657
- 'external evidence verification',
658
- 'ZEP_API_KEY',
659
- 'ZEP_GUARDBENCH_INGEST_DELAY_MS',
660
- ],
661
- 'README.md',
662
- failures,
663
- );
664
- ensureContainsAllProse(
665
- readme,
666
- [
667
- 'source-control state',
668
- 'live remote-head verification',
669
- 'npm registry/auth readiness',
670
- 'PyPI publish readiness',
671
- ],
672
- 'README.md',
673
- failures,
674
- );
675
- ensureContainsAll(
676
- paper,
677
- [
678
- 'Zep Cloud',
679
- 'ZEP_API_KEY',
680
- 'Mem0 and Zep adapters',
681
- 'external dry-run matrix',
682
- 'external evidence verification',
683
- 'reserved URL budget',
684
- 'submitted artifact-url targets',
685
- 'arXiv compile report',
686
- 'release-readiness verifier',
687
- 'release-cut planner',
688
- 'Python package verifier',
689
- ],
690
- 'audrey-paper-v1.md',
691
- failures,
692
- );
693
- ensureContainsAllProse(
694
- paper,
695
- [
696
- 'source-control release-state check',
697
- 'live remote-head verification',
698
- 'npm registry/auth readiness',
699
- 'npm whoami',
700
- 'audrey@1.0.0',
701
- 'PyPI publish readiness',
702
- ],
703
- 'audrey-paper-v1.md',
704
- failures,
705
- );
706
- ensureContainsAll(
707
- ledger,
708
- [
709
- `${formatMetric(latency.p50Ms)}ms/${formatMetric(latency.p95Ms)}ms`,
710
- 'zero published artifact raw-secret leaks',
711
- ],
712
- 'evidence-ledger.md',
713
- failures,
714
- );
715
-
716
- assert(
717
- guardSummary.passed === 10,
718
- `GuardBench expected 10 passed scenarios, got ${guardSummary.passed}`,
719
- failures,
720
- );
721
- assert(
722
- guardSummary.scenarios === 10,
723
- `GuardBench expected 10 scenarios, got ${guardSummary.scenarios}`,
724
- failures,
725
- );
726
- assert(
727
- guardSummary.redactionLeaks === 0,
728
- `GuardBench decision-output leaks expected 0, got ${guardSummary.redactionLeaks}`,
729
- failures,
730
- );
731
- assert(
732
- guardSummary.artifactRedactionSweep?.passed === true,
733
- 'GuardBench artifactRedactionSweep did not pass',
734
- failures,
735
- );
736
- assert(
737
- guardSummary.artifactRedactionSweep?.leakCount === 0,
738
- `GuardBench artifact leak count expected 0, got ${guardSummary.artifactRedactionSweep?.leakCount}`,
739
- failures,
740
- );
741
- assert(
742
- guardRaw.artifactRedactionSweep?.passed === true,
743
- 'Raw GuardBench artifactRedactionSweep did not pass',
744
- failures,
745
- );
746
-
747
- const manifestText = JSON.stringify(guardManifest);
748
- const summaryText = JSON.stringify(guardSummary);
749
- const rawText = JSON.stringify(guardRaw);
750
- assert(
751
- !manifestText.includes(SEEDED_SECRET),
752
- 'GuardBench manifest contains the raw seeded secret',
753
- failures,
754
- );
755
- assert(
756
- !summaryText.includes(SEEDED_SECRET),
757
- 'GuardBench summary contains the raw seeded secret',
758
- failures,
759
- );
760
- assert(
761
- !rawText.includes(SEEDED_SECRET),
762
- 'GuardBench raw output contains the raw seeded secret',
763
- failures,
764
- );
765
- assert(
766
- manifestText.includes('seededSecretRefs'),
767
- 'GuardBench manifest missing seededSecretRefs',
768
- failures,
769
- );
770
- assert(
771
- !manifestText.includes('"seededSecrets"'),
772
- 'GuardBench manifest still publishes seededSecrets',
773
- failures,
774
- );
775
-
776
- if (failures.length) {
777
- console.error('Paper artifact verification failed:');
778
- for (const failure of failures) console.error(`- ${failure}`);
779
- process.exit(1);
780
- }
781
-
782
- console.log('Paper artifact verification passed.');
783
- console.log(`Evidence rows: ${evidenceRows}`);
784
- console.log(`Bibliography entries: ${bibEntries}`);
785
- console.log(`Paper claims: ${claimReport.claims.length}`);
786
- console.log(`Publication pack entries: ${publicationPackReport.entries.length}`);
787
- console.log(
788
- `arXiv source files: ${arxivSourceReport.files.length}, citations ${arxivSourceReport.citationCount}`,
789
- );
790
- console.log(`arXiv compile status: ${arxivCompileReport.status}`);
791
- console.log(`Browser launch targets: ${browserLaunchReport.targets.length}`);
792
- console.log(
793
- `Browser launch results: ${browserLaunchResultsReport.targets.length} targets, ready=${browserLaunchResultsReport.ready}`,
794
- );
795
- console.log(`Paper bundle files: ${paperBundleReport.files.length}`);
796
- console.log(
797
- `GuardBench: ${guardSummary.passed}/${guardSummary.scenarios}, latency ${latency.p50Ms}ms/${latency.p95Ms}ms, artifact leaks ${guardSummary.artifactRedactionSweep.leakCount}`,
798
- );