@geotechcli/core 0.4.77 → 0.4.79

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 (129) hide show
  1. package/dist/agents/data-tools.js +38 -1
  2. package/dist/agents/data-tools.js.map +1 -1
  3. package/dist/agents/fem-artifact-guards.d.ts +14 -0
  4. package/dist/agents/fem-artifact-guards.d.ts.map +1 -0
  5. package/dist/agents/fem-artifact-guards.js +53 -0
  6. package/dist/agents/fem-artifact-guards.js.map +1 -0
  7. package/dist/agents/fem-tools.js +86 -1
  8. package/dist/agents/fem-tools.js.map +1 -1
  9. package/dist/agents/filesystem-tools.js +13 -0
  10. package/dist/agents/filesystem-tools.js.map +1 -1
  11. package/dist/agents/provider-operating-contract.d.ts +3 -3
  12. package/dist/agents/provider-operating-contract.d.ts.map +1 -1
  13. package/dist/agents/provider-operating-contract.js +10 -46
  14. package/dist/agents/provider-operating-contract.js.map +1 -1
  15. package/dist/agents/runtime-bootstrap.d.ts +1 -0
  16. package/dist/agents/runtime-bootstrap.d.ts.map +1 -1
  17. package/dist/agents/runtime-bootstrap.js +1 -0
  18. package/dist/agents/runtime-bootstrap.js.map +1 -1
  19. package/dist/agents/safety.d.ts.map +1 -1
  20. package/dist/agents/safety.js +33 -0
  21. package/dist/agents/safety.js.map +1 -1
  22. package/dist/agents/signal-tools.d.ts +2 -0
  23. package/dist/agents/signal-tools.d.ts.map +1 -0
  24. package/dist/agents/signal-tools.js +96 -0
  25. package/dist/agents/signal-tools.js.map +1 -0
  26. package/dist/agents/swarm-planner.js +1 -1
  27. package/dist/agents/swarm-planner.js.map +1 -1
  28. package/dist/agents/swarm.d.ts +1 -0
  29. package/dist/agents/swarm.d.ts.map +1 -1
  30. package/dist/agents/swarm.js +202 -31
  31. package/dist/agents/swarm.js.map +1 -1
  32. package/dist/fem/ground-model-draft.d.ts +14 -0
  33. package/dist/fem/ground-model-draft.d.ts.map +1 -1
  34. package/dist/fem/ground-model-draft.js +86 -21
  35. package/dist/fem/ground-model-draft.js.map +1 -1
  36. package/dist/fem/index.d.ts +1 -1
  37. package/dist/fem/index.d.ts.map +1 -1
  38. package/dist/fem/index.js +1 -1
  39. package/dist/fem/index.js.map +1 -1
  40. package/dist/fem/routing.d.ts +15 -1
  41. package/dist/fem/routing.d.ts.map +1 -1
  42. package/dist/fem/routing.js +192 -14
  43. package/dist/fem/routing.js.map +1 -1
  44. package/dist/fem/validation.d.ts.map +1 -1
  45. package/dist/fem/validation.js +715 -30
  46. package/dist/fem/validation.js.map +1 -1
  47. package/dist/fem/webgl.d.ts.map +1 -1
  48. package/dist/fem/webgl.js +24 -8
  49. package/dist/fem/webgl.js.map +1 -1
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/ingest/document-evidence-packet.d.ts +603 -45
  55. package/dist/ingest/document-evidence-packet.d.ts.map +1 -1
  56. package/dist/ingest/document-evidence-packet.js +145 -5
  57. package/dist/ingest/document-evidence-packet.js.map +1 -1
  58. package/dist/ingest/geotech-benchmark-corpus.d.ts +108 -0
  59. package/dist/ingest/geotech-benchmark-corpus.d.ts.map +1 -0
  60. package/dist/ingest/geotech-benchmark-corpus.js +437 -0
  61. package/dist/ingest/geotech-benchmark-corpus.js.map +1 -0
  62. package/dist/ingest/geotech-document-benchmark.d.ts +133 -0
  63. package/dist/ingest/geotech-document-benchmark.d.ts.map +1 -1
  64. package/dist/ingest/geotech-document-benchmark.js +370 -2
  65. package/dist/ingest/geotech-document-benchmark.js.map +1 -1
  66. package/dist/ingest/geotech-document.d.ts +3 -0
  67. package/dist/ingest/geotech-document.d.ts.map +1 -1
  68. package/dist/ingest/geotech-document.js +7 -0
  69. package/dist/ingest/geotech-document.js.map +1 -1
  70. package/dist/ingest/index.d.ts +2 -1
  71. package/dist/ingest/index.d.ts.map +1 -1
  72. package/dist/ingest/index.js +1 -0
  73. package/dist/ingest/index.js.map +1 -1
  74. package/dist/ingest/job-store.d.ts.map +1 -1
  75. package/dist/ingest/job-store.js +196 -0
  76. package/dist/ingest/job-store.js.map +1 -1
  77. package/dist/ingest/job-worker.d.ts.map +1 -1
  78. package/dist/ingest/job-worker.js +5 -0
  79. package/dist/ingest/job-worker.js.map +1 -1
  80. package/dist/ingest/page-evidence-cache.d.ts +6 -2
  81. package/dist/ingest/page-evidence-cache.d.ts.map +1 -1
  82. package/dist/ingest/page-evidence-cache.js +229 -4
  83. package/dist/ingest/page-evidence-cache.js.map +1 -1
  84. package/dist/ingest/pdf.d.ts.map +1 -1
  85. package/dist/ingest/pdf.js +2 -2
  86. package/dist/ingest/pdf.js.map +1 -1
  87. package/dist/ingest/review-store.d.ts +3 -0
  88. package/dist/ingest/review-store.d.ts.map +1 -1
  89. package/dist/ingest/review-store.js +28 -0
  90. package/dist/ingest/review-store.js.map +1 -1
  91. package/dist/llm/capabilities.d.ts +6 -1
  92. package/dist/llm/capabilities.d.ts.map +1 -1
  93. package/dist/llm/capabilities.js +66 -0
  94. package/dist/llm/capabilities.js.map +1 -1
  95. package/dist/llm/index.d.ts +2 -2
  96. package/dist/llm/index.d.ts.map +1 -1
  97. package/dist/llm/index.js +1 -1
  98. package/dist/llm/index.js.map +1 -1
  99. package/dist/llm/types.d.ts +20 -0
  100. package/dist/llm/types.d.ts.map +1 -1
  101. package/dist/llm/types.js.map +1 -1
  102. package/dist/meta/metadata.json +1 -1
  103. package/dist/report/ingest-dossier.d.ts.map +1 -1
  104. package/dist/report/ingest-dossier.js +13 -1
  105. package/dist/report/ingest-dossier.js.map +1 -1
  106. package/dist/signal/index.d.ts +95 -0
  107. package/dist/signal/index.d.ts.map +1 -0
  108. package/dist/signal/index.js +375 -0
  109. package/dist/signal/index.js.map +1 -0
  110. package/dist/verifier/findings.d.ts +1 -1
  111. package/dist/verifier/findings.d.ts.map +1 -1
  112. package/dist/verifier/findings.js +329 -0
  113. package/dist/verifier/findings.js.map +1 -1
  114. package/dist/vision/ocr.d.ts +2 -0
  115. package/dist/vision/ocr.d.ts.map +1 -1
  116. package/dist/vision/ocr.js +148 -2
  117. package/dist/vision/ocr.js.map +1 -1
  118. package/dist/vision/preprocess.d.ts +66 -1
  119. package/dist/vision/preprocess.d.ts.map +1 -1
  120. package/dist/vision/preprocess.js +728 -9
  121. package/dist/vision/preprocess.js.map +1 -1
  122. package/dist/workspace/project-workflow-executor.d.ts +1 -1
  123. package/dist/workspace/project-workflow-executor.d.ts.map +1 -1
  124. package/dist/workspace/project-workflow-executor.js +216 -4
  125. package/dist/workspace/project-workflow-executor.js.map +1 -1
  126. package/dist/workspace/project-workflow-router.d.ts.map +1 -1
  127. package/dist/workspace/project-workflow-router.js +41 -1
  128. package/dist/workspace/project-workflow-router.js.map +1 -1
  129. package/package.json +1 -1
@@ -0,0 +1,437 @@
1
+ export function buildGeotechBenchmarkCorpusReport(inputs, options = {}) {
2
+ const fixtures = normalizeFixtures(inputs.map((input) => input.fixture));
3
+ const runs = inputs.map((input) => buildCorpusRun(input));
4
+ const fixtureFailures = validateFixtureCoverage(fixtures, runs);
5
+ const failures = [
6
+ ...runs.flatMap((run) => run.failures.map((failure) => `${run.fixtureId}/${run.providerProfile}/${run.preprocessingMode}: ${failure}`)),
7
+ ...fixtureFailures,
8
+ ];
9
+ const warnings = [
10
+ ...fixtures.flatMap((fixture) => (fixture.expectations.knownLimitations ?? []).map((warning) => `${fixture.id}: ${warning}`)),
11
+ ...runs.flatMap((run) => run.warnings.map((warning) => `${run.fixtureId}/${run.providerProfile}/${run.preprocessingMode}: ${warning}`)),
12
+ ];
13
+ return {
14
+ kind: 'geotech-benchmark-corpus-report',
15
+ schemaVersion: 1,
16
+ generatedAt: normalizeGeneratedAt(options.generatedAt),
17
+ ...(options.label ? { label: options.label } : {}),
18
+ summary: summarizeCorpus(fixtures, runs, failures),
19
+ fixtures,
20
+ runs,
21
+ preprocessingComparisons: buildPreprocessingComparisons(runs),
22
+ failures: [...new Set(failures)],
23
+ warnings: [...new Set(warnings)],
24
+ };
25
+ }
26
+ export function renderGeotechBenchmarkCorpusSvg(report) {
27
+ const width = 980;
28
+ const rowHeight = 34;
29
+ const headerHeight = 128;
30
+ const height = headerHeight + Math.max(1, report.runs.length) * rowHeight + 86;
31
+ const rows = report.runs.slice(0, 18).map((run, index) => {
32
+ const y = headerHeight + index * rowHeight;
33
+ const trace = Math.round(run.directTraceabilityRate * 100);
34
+ const quality = Math.round(run.preprocessingQualityScore * 100);
35
+ const statusColor = run.passed ? '#0f766e' : '#b91c1c';
36
+ return [
37
+ `<rect x="24" y="${y}" width="932" height="${rowHeight - 6}" rx="6" fill="${index % 2 === 0 ? '#f8fafc' : '#eef6f8'}" stroke="#dbe5ea"/>`,
38
+ `<text x="42" y="${y + 20}" font-size="12" font-weight="700" fill="#0f172a">${escapeSvg(run.fixtureId)}</text>`,
39
+ `<text x="270" y="${y + 20}" font-size="12" fill="#475569">${escapeSvg(run.category)}</text>`,
40
+ `<text x="430" y="${y + 20}" font-size="12" fill="#475569">${escapeSvg(run.providerProfile)}</text>`,
41
+ `<text x="585" y="${y + 20}" font-size="12" fill="#475569">${escapeSvg(run.preprocessingMode)}</text>`,
42
+ `<text x="720" y="${y + 20}" font-size="12" fill="#0f172a">trace ${trace}% / quality ${quality}%</text>`,
43
+ `<text x="910" y="${y + 20}" text-anchor="end" font-size="12" font-weight="700" fill="${statusColor}">${run.passed ? 'pass' : 'fail'}</text>`,
44
+ ].join('');
45
+ }).join('\n');
46
+ return [
47
+ `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}" role="img" aria-label="GeotechCLI geotechnical benchmark corpus summary">`,
48
+ '<rect width="100%" height="100%" fill="#ffffff"/>',
49
+ '<rect x="0" y="0" width="980" height="112" fill="#0f172a"/>',
50
+ `<text x="32" y="42" font-size="24" font-weight="800" fill="#f8fafc">GeotechCLI Benchmark Corpus</text>`,
51
+ `<text x="32" y="72" font-size="13" fill="#cbd5e1">${escapeSvg(report.label ?? 'internal R&D evidence benchmark')}</text>`,
52
+ `<text x="948" y="42" text-anchor="end" font-size="24" font-weight="800" fill="${report.summary.passed ? '#5eead4' : '#fca5a5'}">${report.summary.passed ? 'PASS' : 'FAIL'}</text>`,
53
+ `<text x="948" y="72" text-anchor="end" font-size="13" fill="#cbd5e1">${report.summary.passedRuns}/${report.summary.runCount} runs passed</text>`,
54
+ `<text x="32" y="108" font-size="12" fill="#64748b">Fixtures ${report.summary.fixtureCount} | providers ${report.summary.providerProfiles.join(', ') || 'none'} | preprocessing ${report.summary.preprocessingModes.join(', ') || 'none'}</text>`,
55
+ rows,
56
+ `<text x="32" y="${height - 44}" font-size="12" fill="#475569">Average traceability ${Math.round(report.summary.averageTraceabilityRate * 100)}%, GroundModel readiness ${report.summary.averageGroundModelReadinessScore}/100, preprocessing quality ${Math.round(report.summary.averagePreprocessingQualityScore * 100)}%.</text>`,
57
+ `<text x="32" y="${height - 22}" font-size="11" fill="#64748b">Generated ${escapeSvg(report.generatedAt)}. Internal strong-beta benchmark; not a production certification.</text>`,
58
+ '</svg>',
59
+ ].join('\n');
60
+ }
61
+ export function renderGeotechBenchmarkCorpusHtml(report) {
62
+ const rows = report.runs.map((run) => `
63
+ <tr>
64
+ <td>${escapeHtml(run.fixtureId)}</td>
65
+ <td>${escapeHtml(run.category)}</td>
66
+ <td>${escapeHtml(run.providerProfile)}</td>
67
+ <td>${escapeHtml(run.preprocessingMode)}</td>
68
+ <td>${Math.round(run.directTraceabilityRate * 100)}%</td>
69
+ <td>${run.groundModelReadinessScore}</td>
70
+ <td>${Math.round(run.preprocessingQualityScore * 100)}%</td>
71
+ <td>${escapeHtml(formatReviewGates(run.reviewGates))}</td>
72
+ <td>${Math.round(run.successfulPageRate * 100)}%</td>
73
+ <td>${run.estimatedHostedCalls}</td>
74
+ <td class="${run.passed ? 'pass' : 'fail'}">${run.passed ? 'pass' : 'fail'}</td>
75
+ </tr>`).join('');
76
+ const comparisons = report.preprocessingComparisons.map((comparison) => `
77
+ <tr>
78
+ <td>${escapeHtml(comparison.fixtureId)}</td>
79
+ <td>${escapeHtml(comparison.providerProfile)}</td>
80
+ <td>${escapeHtml(comparison.baselineMode)} to ${escapeHtml(comparison.currentMode)}</td>
81
+ <td>${signedPercent(comparison.qualityDelta)}</td>
82
+ <td>${signedPercent(comparison.traceabilityDelta)}</td>
83
+ <td>${comparison.pagesDeskewedDelta}</td>
84
+ <td>${comparison.persistedRegionAssetsDelta}</td>
85
+ </tr>`).join('');
86
+ return `<!doctype html>
87
+ <html lang="en">
88
+ <head>
89
+ <meta charset="utf-8">
90
+ <meta name="viewport" content="width=device-width, initial-scale=1">
91
+ <title>GeotechCLI Benchmark Corpus</title>
92
+ <style>
93
+ body{margin:0;font-family:Inter,Arial,sans-serif;background:#f8fafc;color:#0f172a}
94
+ main{max-width:1120px;margin:0 auto;padding:32px 20px 56px}
95
+ h1{margin:0 0 8px;font-size:30px}
96
+ .summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:22px 0}
97
+ .metric{background:white;border:1px solid #dbe5ea;border-radius:8px;padding:14px}
98
+ .metric strong{display:block;font-size:24px}
99
+ table{width:100%;border-collapse:collapse;background:white;border:1px solid #dbe5ea;border-radius:8px;overflow:hidden;margin:16px 0 30px}
100
+ th,td{padding:10px 12px;border-bottom:1px solid #e2e8f0;text-align:left;font-size:13px}
101
+ th{background:#0f172a;color:#f8fafc}
102
+ .pass{color:#0f766e;font-weight:700}.fail{color:#b91c1c;font-weight:700}
103
+ .note{color:#475569;font-size:13px}
104
+ </style>
105
+ </head>
106
+ <body>
107
+ <main>
108
+ <h1>GeotechCLI Benchmark Corpus</h1>
109
+ <p class="note">${escapeHtml(report.label ?? 'Internal R&D evidence benchmark')} generated ${escapeHtml(report.generatedAt)}. Review-gated strong-beta evidence, not production certification.</p>
110
+ <section class="summary">
111
+ <div class="metric"><span>Status</span><strong class="${report.summary.passed ? 'pass' : 'fail'}">${report.summary.passed ? 'PASS' : 'FAIL'}</strong></div>
112
+ <div class="metric"><span>Runs</span><strong>${report.summary.passedRuns}/${report.summary.runCount}</strong></div>
113
+ <div class="metric"><span>Traceability</span><strong>${Math.round(report.summary.averageTraceabilityRate * 100)}%</strong></div>
114
+ <div class="metric"><span>Preprocessing Quality</span><strong>${Math.round(report.summary.averagePreprocessingQualityScore * 100)}%</strong></div>
115
+ </section>
116
+ <h2>Runs</h2>
117
+ <table><thead><tr><th>Fixture</th><th>Category</th><th>Provider</th><th>Preprocessing</th><th>Trace</th><th>GM score</th><th>Quality</th><th>Review gates</th><th>Pages</th><th>Calls</th><th>Status</th></tr></thead><tbody>${rows}</tbody></table>
118
+ <h2>Preprocessing Comparisons</h2>
119
+ <table><thead><tr><th>Fixture</th><th>Provider</th><th>Modes</th><th>Quality delta</th><th>Trace delta</th><th>Deskew delta</th><th>Crop Asset delta</th></tr></thead><tbody>${comparisons || '<tr><td colspan="7">No paired preprocessing-mode comparisons available.</td></tr>'}</tbody></table>
120
+ ${report.failures.length ? `<h2>Failures</h2><ul>${report.failures.map((failure) => `<li>${escapeHtml(failure)}</li>`).join('')}</ul>` : ''}
121
+ ${report.warnings.length ? `<h2>Warnings</h2><ul>${report.warnings.map((warning) => `<li>${escapeHtml(warning)}</li>`).join('')}</ul>` : ''}
122
+ </main>
123
+ </body>
124
+ </html>
125
+ `;
126
+ }
127
+ function buildCorpusRun(input) {
128
+ const benchmark = input.benchmark;
129
+ const providerProfile = input.providerProfile
130
+ ?? benchmark.provider?.profile
131
+ ?? benchmark.provider?.provider
132
+ ?? 'unknown';
133
+ const preprocessingMode = input.preprocessingMode
134
+ ?? benchmark.preprocessing?.modes?.[0]
135
+ ?? 'unknown';
136
+ const estimatedHostedCalls = totalHostedCalls(benchmark);
137
+ const latencyMs = benchmark.latency?.totalKnownLatencyMs ?? benchmark.job?.durationMs ?? null;
138
+ const run = {
139
+ fixtureId: input.fixture.id,
140
+ category: input.fixture.category,
141
+ sourceType: input.fixture.sourceType,
142
+ providerProfile,
143
+ preprocessingMode,
144
+ totalPages: finiteNumber(benchmark.source?.totalPages),
145
+ successfulPages: finiteNumber(benchmark.source?.successfulPages),
146
+ failedPages: finiteNumber(benchmark.source?.failedPages),
147
+ successfulPageRate: successfulPageRate(benchmark),
148
+ documentConfidence: finiteNumber(benchmark.document?.confidence),
149
+ parseStatus: benchmark.document?.parseStatus ?? 'unknown',
150
+ cacheHitRate: finiteNumber(benchmark.evidenceCache?.hitRate),
151
+ estimatedHostedCalls,
152
+ directTraceabilityRate: finiteNumber(benchmark.traceability?.directParameterTraceabilityRate),
153
+ parametersWithoutSourcePage: finiteNumber(benchmark.traceability?.parametersWithoutSourcePage),
154
+ groundModelReadinessScore: finiteNumber(benchmark.groundModelReadiness?.score),
155
+ groundModelReadinessStatus: benchmark.groundModelReadiness?.status ?? 'unknown',
156
+ preprocessingQualityScore: finiteNumber(benchmark.preprocessing?.averageQualityScore),
157
+ preprocessingRegionQualityScore: finiteNumber(benchmark.preprocessing?.averageRegionQualityScore),
158
+ pagesDeskewed: finiteNumber(benchmark.preprocessing?.pagesDeskewed),
159
+ preprocessingRegions: finiteNumber(benchmark.preprocessing?.preprocessingRegions),
160
+ persistedRegionAssets: finiteNumber(benchmark.preprocessing?.persistedRegionAssets),
161
+ latencyMs,
162
+ boreholeIds: Array.isArray(benchmark.groundModelReadiness?.boreholeIds)
163
+ ? benchmark.groundModelReadiness.boreholeIds
164
+ : [],
165
+ reviewGates: collectReviewGates(benchmark),
166
+ };
167
+ const failures = [
168
+ ...validateRunExpectations(input.fixture, run),
169
+ ...(input.fixture.expectations.requireFemExecutionBoundarySafe
170
+ ? validateFemExecutionBoundary(benchmark)
171
+ : []),
172
+ ];
173
+ const warnings = buildRunWarnings(input.fixture, run);
174
+ return {
175
+ ...run,
176
+ passed: failures.length === 0,
177
+ failures,
178
+ warnings,
179
+ };
180
+ }
181
+ function validateRunExpectations(fixture, run) {
182
+ const expected = fixture.expectations;
183
+ return [
184
+ expected.minSuccessfulPageRate != null && run.successfulPageRate < expected.minSuccessfulPageRate
185
+ ? `successful page rate ${formatRatio(run.successfulPageRate)} below ${formatRatio(expected.minSuccessfulPageRate)}`
186
+ : null,
187
+ expected.maxFailedPages != null && run.failedPages > expected.maxFailedPages
188
+ ? `failed pages ${run.failedPages} above ${expected.maxFailedPages}`
189
+ : null,
190
+ expected.minCacheHitRate != null && run.cacheHitRate < expected.minCacheHitRate
191
+ ? `cache hit rate ${formatRatio(run.cacheHitRate)} below ${formatRatio(expected.minCacheHitRate)}`
192
+ : null,
193
+ expected.minTraceabilityRate != null && run.directTraceabilityRate < expected.minTraceabilityRate
194
+ ? `traceability ${formatRatio(run.directTraceabilityRate)} below ${formatRatio(expected.minTraceabilityRate)}`
195
+ : null,
196
+ expected.minGroundModelReadinessScore != null && run.groundModelReadinessScore < expected.minGroundModelReadinessScore
197
+ ? `GroundModel readiness ${run.groundModelReadinessScore} below ${expected.minGroundModelReadinessScore}`
198
+ : null,
199
+ expected.minAverageQualityScore != null && run.preprocessingQualityScore < expected.minAverageQualityScore
200
+ ? `preprocessing quality ${formatRatio(run.preprocessingQualityScore)} below ${formatRatio(expected.minAverageQualityScore)}`
201
+ : null,
202
+ expected.maxEstimatedHostedCalls != null && run.estimatedHostedCalls > expected.maxEstimatedHostedCalls
203
+ ? `estimated hosted calls ${run.estimatedHostedCalls} above ${expected.maxEstimatedHostedCalls}`
204
+ : null,
205
+ expected.maxParametersWithoutSourcePage != null && run.parametersWithoutSourcePage > expected.maxParametersWithoutSourcePage
206
+ ? `parameters without source page ${run.parametersWithoutSourcePage} above ${expected.maxParametersWithoutSourcePage}`
207
+ : null,
208
+ ...(expected.expectedBoreholeIds ?? []).flatMap((id) => run.boreholeIds.includes(id) ? [] : [`expected borehole ${id} missing`]),
209
+ ].filter((value) => value != null);
210
+ }
211
+ function validateFixtureCoverage(fixtures, runs) {
212
+ const failures = [];
213
+ for (const fixture of fixtures) {
214
+ const fixtureRuns = runs.filter((run) => run.fixtureId === fixture.id);
215
+ for (const mode of fixture.expectations.requiredPreprocessingModes ?? []) {
216
+ if (!fixtureRuns.some((run) => run.preprocessingMode === mode)) {
217
+ failures.push(`${fixture.id}: missing preprocessing mode ${mode}`);
218
+ }
219
+ }
220
+ for (const profile of fixture.expectations.requiredProviderProfiles ?? []) {
221
+ if (!fixtureRuns.some((run) => run.providerProfile === profile)) {
222
+ failures.push(`${fixture.id}: missing provider profile ${profile}`);
223
+ }
224
+ }
225
+ }
226
+ return failures;
227
+ }
228
+ function validateFemExecutionBoundary(benchmark) {
229
+ const fem = benchmark.femDraftReadiness;
230
+ if (!fem) {
231
+ return ['FEM draft readiness block missing from benchmark output'];
232
+ }
233
+ const agentRunAllowedRoutes = fem.agentRunAllowedRoutes ?? [];
234
+ const agentWebglAllowedRoutes = fem.agentWebglAllowedRoutes ?? [];
235
+ const agentResultManifestAllowedRoutes = fem.agentResultManifestAllowedRoutes ?? [];
236
+ const caseOutputAvailableRoutes = fem.caseOutputAvailableRoutes ?? [];
237
+ const humanRunCommandAvailableRoutes = fem.humanRunCommandAvailableRoutes ?? [];
238
+ const staleRunCommandRoutes = fem.staleRunCommandRoutes ?? [];
239
+ const failures = [
240
+ fem.canAutoProceed
241
+ ? 'FEM draft readiness became auto-proceedable'
242
+ : null,
243
+ agentRunAllowedRoutes.length > 0
244
+ ? `FEM benchmark exposed agent-run routes: ${routeList(agentRunAllowedRoutes)}`
245
+ : null,
246
+ agentWebglAllowedRoutes.length > 0
247
+ ? `FEM benchmark exposed agent WebGL routes: ${routeList(agentWebglAllowedRoutes)}`
248
+ : null,
249
+ agentResultManifestAllowedRoutes.length > 0
250
+ ? `FEM benchmark exposed agent result-manifest routes: ${routeList(agentResultManifestAllowedRoutes)}`
251
+ : null,
252
+ caseOutputAvailableRoutes.length > 0
253
+ ? `FEM benchmark exposed unreviewed case-output routes: ${routeList(caseOutputAvailableRoutes)}`
254
+ : null,
255
+ humanRunCommandAvailableRoutes.length > 0
256
+ ? `FEM benchmark exposed unreviewed human-run routes: ${routeList(humanRunCommandAvailableRoutes)}`
257
+ : null,
258
+ staleRunCommandRoutes.length > 0
259
+ ? `FEM benchmark recommended stale run commands: ${routeList(staleRunCommandRoutes)}`
260
+ : null,
261
+ ];
262
+ for (const route of fem.routes ?? []) {
263
+ const boundary = route.executionBoundary;
264
+ if (!boundary) {
265
+ failures.push(`FEM route ${route.objective} has no execution boundary`);
266
+ continue;
267
+ }
268
+ failures.push(route.agentRunAllowed || boundary.agentRunAllowed
269
+ ? `FEM route ${route.objective} exposed agent solver execution`
270
+ : null, boundary.agentWebglRenderAllowed
271
+ ? `FEM route ${route.objective} exposed agent WebGL rendering`
272
+ : null, boundary.agentResultManifestAllowed
273
+ ? `FEM route ${route.objective} exposed agent result-manifest creation`
274
+ : null, boundary.caseOutputAvailable
275
+ ? `FEM route ${route.objective} exposed unreviewed case output`
276
+ : null, boundary.humanRunCommandAvailable
277
+ ? `FEM route ${route.objective} exposed an unreviewed human run command`
278
+ : null, !boundary.humanReviewRequired
279
+ ? `FEM route ${route.objective} no longer requires human review`
280
+ : null, /\bfem run\b/i.test(route.recommendedCommand ?? '')
281
+ ? `FEM route ${route.objective} recommended a run command instead of a draft command`
282
+ : null);
283
+ }
284
+ return [...new Set(failures.filter((value) => value != null))];
285
+ }
286
+ function buildRunWarnings(fixture, run) {
287
+ return [
288
+ run.preprocessingMode === 'unknown' ? 'preprocessing mode unavailable' : null,
289
+ run.providerProfile === 'unknown' ? 'provider profile unavailable' : null,
290
+ run.sourceType === 'synthetic' ? 'synthetic benchmark fixture; use for guardrail logic, not production accuracy claims' : null,
291
+ fixture.sourceType === 'local-private' ? 'local private fixture; do not commit source report bytes' : null,
292
+ ].filter((value) => value != null);
293
+ }
294
+ function collectReviewGates(benchmark) {
295
+ return uniqueSorted([
296
+ ...(Array.isArray(benchmark.document?.confidenceBreakdown?.reviewGates)
297
+ ? benchmark.document.confidenceBreakdown.reviewGates
298
+ : []),
299
+ ...(Array.isArray(benchmark.provider?.reviewGates)
300
+ ? benchmark.provider.reviewGates
301
+ : []),
302
+ ]);
303
+ }
304
+ function buildPreprocessingComparisons(runs) {
305
+ const grouped = new Map();
306
+ for (const run of runs) {
307
+ const key = `${run.fixtureId}::${run.providerProfile}`;
308
+ grouped.set(key, [...(grouped.get(key) ?? []), run]);
309
+ }
310
+ const comparisons = [];
311
+ for (const group of grouped.values()) {
312
+ const baseline = group.find((run) => run.preprocessingMode === 'none') ?? group[0];
313
+ if (!baseline) {
314
+ continue;
315
+ }
316
+ const candidates = group
317
+ .filter((run) => run.preprocessingMode !== baseline.preprocessingMode)
318
+ .sort((left, right) => preprocessingModeRank(left.preprocessingMode) - preprocessingModeRank(right.preprocessingMode));
319
+ for (const current of candidates) {
320
+ comparisons.push({
321
+ fixtureId: current.fixtureId,
322
+ providerProfile: current.providerProfile,
323
+ baselineMode: baseline.preprocessingMode,
324
+ currentMode: current.preprocessingMode,
325
+ traceabilityDelta: roundRatio(current.directTraceabilityRate - baseline.directTraceabilityRate),
326
+ readinessDelta: current.groundModelReadinessScore - baseline.groundModelReadinessScore,
327
+ qualityDelta: roundRatio(current.preprocessingQualityScore - baseline.preprocessingQualityScore),
328
+ regionQualityDelta: roundRatio(current.preprocessingRegionQualityScore - baseline.preprocessingRegionQualityScore),
329
+ hostedCallDelta: current.estimatedHostedCalls - baseline.estimatedHostedCalls,
330
+ pagesDeskewedDelta: current.pagesDeskewed - baseline.pagesDeskewed,
331
+ persistedRegionAssetsDelta: current.persistedRegionAssets - baseline.persistedRegionAssets,
332
+ });
333
+ }
334
+ }
335
+ return comparisons.sort((left, right) => left.fixtureId.localeCompare(right.fixtureId)
336
+ || left.providerProfile.localeCompare(right.providerProfile)
337
+ || preprocessingModeRank(left.currentMode) - preprocessingModeRank(right.currentMode));
338
+ }
339
+ function preprocessingModeRank(mode) {
340
+ if (mode === 'none')
341
+ return 0;
342
+ if (mode === 'ocr-optimized')
343
+ return 1;
344
+ if (mode === 'region-v2')
345
+ return 2;
346
+ return 10;
347
+ }
348
+ function summarizeCorpus(fixtures, runs, failures) {
349
+ return {
350
+ fixtureCount: fixtures.length,
351
+ runCount: runs.length,
352
+ passedRuns: runs.filter((run) => run.passed).length,
353
+ failedRuns: runs.filter((run) => !run.passed).length,
354
+ passed: failures.length === 0,
355
+ categories: countBy(fixtures.map((fixture) => fixture.category)),
356
+ providerProfiles: uniqueSorted(runs.map((run) => run.providerProfile)),
357
+ preprocessingModes: uniqueSorted(runs.map((run) => run.preprocessingMode)),
358
+ averageConfidence: average(runs.map((run) => run.documentConfidence)),
359
+ averageTraceabilityRate: average(runs.map((run) => run.directTraceabilityRate)),
360
+ averageGroundModelReadinessScore: Math.round(average(runs.map((run) => run.groundModelReadinessScore))),
361
+ averagePreprocessingQualityScore: average(runs.map((run) => run.preprocessingQualityScore)),
362
+ totalEstimatedHostedCalls: runs.reduce((sum, run) => sum + run.estimatedHostedCalls, 0),
363
+ };
364
+ }
365
+ function normalizeFixtures(fixtures) {
366
+ const lookup = new Map();
367
+ for (const fixture of fixtures) {
368
+ lookup.set(fixture.id, {
369
+ ...fixture,
370
+ expectations: {
371
+ ...fixture.expectations,
372
+ knownLimitations: [...new Set(fixture.expectations.knownLimitations ?? [])],
373
+ },
374
+ });
375
+ }
376
+ return [...lookup.values()].sort((left, right) => left.id.localeCompare(right.id));
377
+ }
378
+ function totalHostedCalls(benchmark) {
379
+ return finiteNumber(benchmark.hostedCallEstimate?.pageExtraction)
380
+ + finiteNumber(benchmark.hostedCallEstimate?.layoutOcr)
381
+ + finiteNumber(benchmark.hostedCallEstimate?.vision);
382
+ }
383
+ function successfulPageRate(benchmark) {
384
+ const totalPages = finiteNumber(benchmark.source?.totalPages);
385
+ const successfulPages = finiteNumber(benchmark.source?.successfulPages);
386
+ return totalPages > 0 ? roundRatio(successfulPages / totalPages) : 0;
387
+ }
388
+ function routeList(values) {
389
+ return values && values.length > 0 ? values.join(', ') : 'none';
390
+ }
391
+ function formatReviewGates(values) {
392
+ return values.length > 0 ? values.join(', ') : 'none';
393
+ }
394
+ function countBy(values) {
395
+ const counts = {};
396
+ for (const value of values) {
397
+ counts[value] = (counts[value] ?? 0) + 1;
398
+ }
399
+ return Object.fromEntries(Object.entries(counts).sort(([left], [right]) => left.localeCompare(right)));
400
+ }
401
+ function uniqueSorted(values) {
402
+ return [...new Set(values.filter(Boolean))].sort((left, right) => left.localeCompare(right));
403
+ }
404
+ function average(values) {
405
+ const finite = values.filter((value) => Number.isFinite(value));
406
+ return finite.length > 0 ? roundRatio(finite.reduce((sum, value) => sum + value, 0) / finite.length) : 0;
407
+ }
408
+ function finiteNumber(value) {
409
+ return typeof value === 'number' && Number.isFinite(value) ? value : 0;
410
+ }
411
+ function roundRatio(value) {
412
+ return Math.round(value * 1000) / 1000;
413
+ }
414
+ function normalizeGeneratedAt(value) {
415
+ if (value instanceof Date) {
416
+ return value.toISOString();
417
+ }
418
+ return typeof value === 'string' && value.trim() ? value.trim() : new Date().toISOString();
419
+ }
420
+ function formatRatio(value) {
421
+ return `${Math.round(value * 100)}%`;
422
+ }
423
+ function signedPercent(value) {
424
+ const sign = value > 0 ? '+' : '';
425
+ return `${sign}${Math.round(value * 100)}%`;
426
+ }
427
+ function escapeHtml(value) {
428
+ return value
429
+ .replaceAll('&', '&amp;')
430
+ .replaceAll('<', '&lt;')
431
+ .replaceAll('>', '&gt;')
432
+ .replaceAll('"', '&quot;');
433
+ }
434
+ function escapeSvg(value) {
435
+ return escapeHtml(value).replaceAll("'", '&apos;');
436
+ }
437
+ //# sourceMappingURL=geotech-benchmark-corpus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geotech-benchmark-corpus.js","sourceRoot":"","sources":["../../src/ingest/geotech-benchmark-corpus.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import type { PdfPageClassification } from './pdf.js';
2
2
  import type { GeotechDocumentIngestResult, GeotechDocumentPageAudit, GeotechDocumentPageEvidenceCacheStatus } from './geotech-document.js';
3
+ import type { LLMConfig, ProviderCapabilityProfile } from '../llm/types.js';
3
4
  import type { DocumentTextHintSource } from '../vision/ocr.js';
4
5
  import { type DocumentEvidenceMethod } from './document-evidence-packet.js';
6
+ import { type FemRouteObjective } from '../fem/index.js';
5
7
  export interface GeotechDocumentBenchmarkJobContext {
6
8
  jobId?: string;
7
9
  createdAt?: string;
@@ -14,6 +16,13 @@ export interface GeotechDocumentBenchmarkOptions {
14
16
  job?: GeotechDocumentBenchmarkJobContext;
15
17
  label?: string;
16
18
  generatedAt?: string | Date;
19
+ providerConfig?: Pick<LLMConfig, 'provider' | 'modelId' | 'visionModelId'>;
20
+ fixture?: {
21
+ id?: string;
22
+ category?: string;
23
+ source?: string;
24
+ description?: string;
25
+ };
17
26
  }
18
27
  export interface GeotechDocumentBenchmark {
19
28
  kind: 'geotech-document-benchmark';
@@ -21,6 +30,23 @@ export interface GeotechDocumentBenchmark {
21
30
  generatedAt: string;
22
31
  label?: string;
23
32
  job?: GeotechDocumentBenchmarkJobContext;
33
+ provider?: {
34
+ provider: LLMConfig['provider'];
35
+ profile: ProviderCapabilityProfile['id'];
36
+ modelId: string | null;
37
+ visionModelId: string | null;
38
+ capabilities: ProviderCapabilityProfile['capabilities'];
39
+ likelyFreeRoute: boolean;
40
+ contextStrategy: ProviderCapabilityProfile['contextStrategy'];
41
+ reviewGates: string[];
42
+ preprocessingPolicy: ProviderCapabilityProfile['preprocessingPolicy'];
43
+ };
44
+ fixture?: {
45
+ id?: string;
46
+ category?: string;
47
+ source?: string;
48
+ description?: string;
49
+ };
24
50
  source: {
25
51
  fileName?: string;
26
52
  filePath?: string;
@@ -69,6 +95,40 @@ export interface GeotechDocumentBenchmark {
69
95
  preprocessingVersions: string[];
70
96
  schemaVersions: number[];
71
97
  };
98
+ preprocessing: {
99
+ versions: string[];
100
+ modes: string[];
101
+ pagesWithPreprocessing: number;
102
+ pagesWithoutPreprocessing: number;
103
+ pagesWithRegions: number;
104
+ totalRegions: number;
105
+ preprocessingRegions: number;
106
+ layoutRegions: number;
107
+ pageRegionCoverage: number;
108
+ pagesWithPreprocessingMetadata: number;
109
+ operationCounts: Record<string, number>;
110
+ regionLabelCounts: Record<string, number>;
111
+ persistedRegionAssets: number;
112
+ persistedRegionAssetBytes: number;
113
+ pagesDeskewed: number;
114
+ averageDeskewAngleDeg: number;
115
+ averageQualityScore: number;
116
+ averageRegionQualityScore: number;
117
+ lowQualityRegions: number;
118
+ qualityWarningCounts: Record<string, number>;
119
+ sourceCategories: Record<'native-text' | 'layout-ocr' | 'vision' | 'none', number>;
120
+ };
121
+ latency: {
122
+ pageLatencyMs: {
123
+ count: number;
124
+ total: number;
125
+ average: number;
126
+ max: number;
127
+ };
128
+ totalKnownLatencyMs: number;
129
+ jobDurationMs?: number;
130
+ synthesisLatencyMs?: number;
131
+ };
72
132
  retainedSignals: {
73
133
  materials: number;
74
134
  classifications: number;
@@ -99,6 +159,55 @@ export interface GeotechDocumentBenchmark {
99
159
  missingCriticalData: string[];
100
160
  gates: string[];
101
161
  };
162
+ femDraftReadiness?: {
163
+ schemaVersion: 1;
164
+ providerNeutral: true;
165
+ canAutoProceed: false;
166
+ candidateRoutes: number;
167
+ implementedPreviewRoutes: FemRouteObjective[];
168
+ contractOnlyRoutes: FemRouteObjective[];
169
+ agentRunAllowedRoutes: FemRouteObjective[];
170
+ agentWebglAllowedRoutes: FemRouteObjective[];
171
+ agentResultManifestAllowedRoutes: FemRouteObjective[];
172
+ caseOutputAvailableRoutes: FemRouteObjective[];
173
+ humanRunCommandAvailableRoutes: FemRouteObjective[];
174
+ draftCommandRoutes: FemRouteObjective[];
175
+ runCommandRoutes: FemRouteObjective[];
176
+ staleRunCommandRoutes: FemRouteObjective[];
177
+ gates: string[];
178
+ routes: Array<{
179
+ objective: FemRouteObjective;
180
+ status: string;
181
+ executionMode: string;
182
+ agentRunAllowed: false;
183
+ executionBoundary: {
184
+ schemaVersion: 'fem-benchmark-execution-boundary.v1';
185
+ agentRunAllowed: false;
186
+ agentWebglRenderAllowed: false;
187
+ agentResultManifestAllowed: false;
188
+ humanReviewRequired: true;
189
+ caseOutputAvailable: false;
190
+ humanRunCommandAvailable: false;
191
+ draftCommand?: string;
192
+ humanRunCommandTemplate?: string;
193
+ blockedReasons: string[];
194
+ };
195
+ recommendedCommand?: string;
196
+ runCommandTemplate?: string;
197
+ readinessStatus: GeotechDocumentBenchmark['groundModelReadiness']['status'];
198
+ readinessScore: number;
199
+ requiredEvidence: string[];
200
+ requiredUserInputs: string[];
201
+ reviewGates: string[];
202
+ limitations: string[];
203
+ contractReadiness?: {
204
+ nonRunnableReason: string;
205
+ blockedUntil: string[];
206
+ allowedAgentActions: string[];
207
+ disallowedAgentActions: string[];
208
+ };
209
+ }>;
210
+ };
102
211
  evidenceContract: {
103
212
  schemaVersion: number;
104
213
  providerNeutral: true;
@@ -130,6 +239,23 @@ export interface GeotechDocumentBenchmarkPage {
130
239
  cacheEntryId?: string;
131
240
  modelVersion?: string;
132
241
  preprocessingVersion?: string;
242
+ preprocessingPipelineVersion?: string;
243
+ preprocessingPolicy?: string;
244
+ preprocessingQualityScore?: number;
245
+ preprocessingDeskewAngleDeg?: number;
246
+ preprocessingDeskewApplied?: boolean;
247
+ preprocessingQualityWarnings: string[];
248
+ preprocessingOperations: string[];
249
+ preprocessingRegionLabels: string[];
250
+ preprocessingRegionQualityScores: number[];
251
+ preprocessingOperationCount: number;
252
+ preprocessingRegionCount: number;
253
+ preprocessingAssetCount: number;
254
+ preprocessingAssetBytes: number;
255
+ preprocessingLowQualityRegionCount: number;
256
+ layoutRegionCount: number;
257
+ latencyMs?: number;
258
+ regionCount: number;
133
259
  }
134
260
  export interface GeotechDocumentBenchmarkComparison {
135
261
  kind: 'geotech-document-benchmark-comparison';
@@ -144,6 +270,13 @@ export interface GeotechDocumentBenchmarkComparison {
144
270
  estimatedHostedCalls: number;
145
271
  traceabilityRate: number;
146
272
  groundModelReadinessScore: number;
273
+ preprocessing: {
274
+ modeChanged: boolean;
275
+ averageQualityScore: number;
276
+ averageRegionQualityScore: number;
277
+ pagesDeskewed: number;
278
+ persistedRegionAssets: number;
279
+ };
147
280
  };
148
281
  passed: boolean;
149
282
  regressions: string[];