@dailephd/my-frontend-observer 0.8.1

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 (316) hide show
  1. package/CHANGELOG.md +397 -0
  2. package/LICENSE +21 -0
  3. package/README.md +255 -0
  4. package/dist/application/browserCaptureService.d.ts +11 -0
  5. package/dist/application/browserCaptureService.js +12 -0
  6. package/dist/application/browserCaptureService.js.map +1 -0
  7. package/dist/application/comparisonService.d.ts +56 -0
  8. package/dist/application/comparisonService.js +77 -0
  9. package/dist/application/comparisonService.js.map +1 -0
  10. package/dist/application/externalReferencePersistenceService.d.ts +75 -0
  11. package/dist/application/externalReferencePersistenceService.js +182 -0
  12. package/dist/application/externalReferencePersistenceService.js.map +1 -0
  13. package/dist/application/frontendContractEvaluationService.d.ts +49 -0
  14. package/dist/application/frontendContractEvaluationService.js +112 -0
  15. package/dist/application/frontendContractEvaluationService.js.map +1 -0
  16. package/dist/application/frontendContractPersistenceService.d.ts +56 -0
  17. package/dist/application/frontendContractPersistenceService.js +91 -0
  18. package/dist/application/frontendContractPersistenceService.js.map +1 -0
  19. package/dist/application/observationPersistence.d.ts +59 -0
  20. package/dist/application/observationPersistence.js +79 -0
  21. package/dist/application/observationPersistence.js.map +1 -0
  22. package/dist/application/projectCheckService.d.ts +3 -0
  23. package/dist/application/projectCheckService.js +169 -0
  24. package/dist/application/projectCheckService.js.map +1 -0
  25. package/dist/application/projectWorkflowService.d.ts +46 -0
  26. package/dist/application/projectWorkflowService.js +92 -0
  27. package/dist/application/projectWorkflowService.js.map +1 -0
  28. package/dist/application/referenceFidelityEvaluationService.d.ts +28 -0
  29. package/dist/application/referenceFidelityEvaluationService.js +45 -0
  30. package/dist/application/referenceFidelityEvaluationService.js.map +1 -0
  31. package/dist/artifacts/artifactReader.d.ts +19 -0
  32. package/dist/artifacts/artifactReader.js +36 -0
  33. package/dist/artifacts/artifactReader.js.map +1 -0
  34. package/dist/artifacts/artifactWriter.d.ts +25 -0
  35. package/dist/artifacts/artifactWriter.js +68 -0
  36. package/dist/artifacts/artifactWriter.js.map +1 -0
  37. package/dist/artifacts/comparisonArtifactReader.d.ts +18 -0
  38. package/dist/artifacts/comparisonArtifactReader.js +35 -0
  39. package/dist/artifacts/comparisonArtifactReader.js.map +1 -0
  40. package/dist/artifacts/comparisonArtifactWriter.d.ts +41 -0
  41. package/dist/artifacts/comparisonArtifactWriter.js +67 -0
  42. package/dist/artifacts/comparisonArtifactWriter.js.map +1 -0
  43. package/dist/artifacts/externalReferenceArtifactReader.d.ts +18 -0
  44. package/dist/artifacts/externalReferenceArtifactReader.js +35 -0
  45. package/dist/artifacts/externalReferenceArtifactReader.js.map +1 -0
  46. package/dist/artifacts/externalReferenceArtifactWriter.d.ts +44 -0
  47. package/dist/artifacts/externalReferenceArtifactWriter.js +77 -0
  48. package/dist/artifacts/externalReferenceArtifactWriter.js.map +1 -0
  49. package/dist/artifacts/frontendContractArtifactReader.d.ts +24 -0
  50. package/dist/artifacts/frontendContractArtifactReader.js +47 -0
  51. package/dist/artifacts/frontendContractArtifactReader.js.map +1 -0
  52. package/dist/artifacts/frontendContractArtifactWriter.d.ts +34 -0
  53. package/dist/artifacts/frontendContractArtifactWriter.js +70 -0
  54. package/dist/artifacts/frontendContractArtifactWriter.js.map +1 -0
  55. package/dist/artifacts/frontendContractEvaluationArtifactReader.d.ts +17 -0
  56. package/dist/artifacts/frontendContractEvaluationArtifactReader.js +34 -0
  57. package/dist/artifacts/frontendContractEvaluationArtifactReader.js.map +1 -0
  58. package/dist/artifacts/frontendContractEvaluationArtifactWriter.d.ts +32 -0
  59. package/dist/artifacts/frontendContractEvaluationArtifactWriter.js +58 -0
  60. package/dist/artifacts/frontendContractEvaluationArtifactWriter.js.map +1 -0
  61. package/dist/artifacts/types.d.ts +17 -0
  62. package/dist/artifacts/types.js +2 -0
  63. package/dist/artifacts/types.js.map +1 -0
  64. package/dist/browser/chromiumAdapter.d.ts +21 -0
  65. package/dist/browser/chromiumAdapter.js +204 -0
  66. package/dist/browser/chromiumAdapter.js.map +1 -0
  67. package/dist/browser/evidenceCapture.d.ts +62 -0
  68. package/dist/browser/evidenceCapture.js +500 -0
  69. package/dist/browser/evidenceCapture.js.map +1 -0
  70. package/dist/browser/scrollCapture.d.ts +32 -0
  71. package/dist/browser/scrollCapture.js +163 -0
  72. package/dist/browser/scrollCapture.js.map +1 -0
  73. package/dist/browser/types.d.ts +24 -0
  74. package/dist/browser/types.js +2 -0
  75. package/dist/browser/types.js.map +1 -0
  76. package/dist/cli.d.ts +8 -0
  77. package/dist/cli.js +2411 -0
  78. package/dist/cli.js.map +1 -0
  79. package/dist/domain/boundedAgentContext.d.ts +226 -0
  80. package/dist/domain/boundedAgentContext.js +355 -0
  81. package/dist/domain/boundedAgentContext.js.map +1 -0
  82. package/dist/domain/boundedAgentContextCorrelation.d.ts +74 -0
  83. package/dist/domain/boundedAgentContextCorrelation.js +441 -0
  84. package/dist/domain/boundedAgentContextCorrelation.js.map +1 -0
  85. package/dist/domain/boundedAgentContextIdentity.d.ts +26 -0
  86. package/dist/domain/boundedAgentContextIdentity.js +69 -0
  87. package/dist/domain/boundedAgentContextIdentity.js.map +1 -0
  88. package/dist/domain/boundedAgentContextProjection.d.ts +71 -0
  89. package/dist/domain/boundedAgentContextProjection.js +477 -0
  90. package/dist/domain/boundedAgentContextProjection.js.map +1 -0
  91. package/dist/domain/comparison.d.ts +220 -0
  92. package/dist/domain/comparison.js +350 -0
  93. package/dist/domain/comparison.js.map +1 -0
  94. package/dist/domain/comparisonEngine.d.ts +76 -0
  95. package/dist/domain/comparisonEngine.js +734 -0
  96. package/dist/domain/comparisonEngine.js.map +1 -0
  97. package/dist/domain/comparisonIdentity.d.ts +13 -0
  98. package/dist/domain/comparisonIdentity.js +46 -0
  99. package/dist/domain/comparisonIdentity.js.map +1 -0
  100. package/dist/domain/completion.d.ts +30 -0
  101. package/dist/domain/completion.js +22 -0
  102. package/dist/domain/completion.js.map +1 -0
  103. package/dist/domain/diagnostics.d.ts +17 -0
  104. package/dist/domain/diagnostics.js +77 -0
  105. package/dist/domain/diagnostics.js.map +1 -0
  106. package/dist/domain/evidence.d.ts +29 -0
  107. package/dist/domain/evidence.js +59 -0
  108. package/dist/domain/evidence.js.map +1 -0
  109. package/dist/domain/explicitState.d.ts +40 -0
  110. package/dist/domain/explicitState.js +54 -0
  111. package/dist/domain/explicitState.js.map +1 -0
  112. package/dist/domain/externalReference.d.ts +158 -0
  113. package/dist/domain/externalReference.js +167 -0
  114. package/dist/domain/externalReference.js.map +1 -0
  115. package/dist/domain/externalReferenceApplicability.d.ts +43 -0
  116. package/dist/domain/externalReferenceApplicability.js +52 -0
  117. package/dist/domain/externalReferenceApplicability.js.map +1 -0
  118. package/dist/domain/externalReferenceCompatibility.d.ts +40 -0
  119. package/dist/domain/externalReferenceCompatibility.js +48 -0
  120. package/dist/domain/externalReferenceCompatibility.js.map +1 -0
  121. package/dist/domain/externalReferenceFidelity.d.ts +171 -0
  122. package/dist/domain/externalReferenceFidelity.js +419 -0
  123. package/dist/domain/externalReferenceFidelity.js.map +1 -0
  124. package/dist/domain/externalReferenceIdentity.d.ts +38 -0
  125. package/dist/domain/externalReferenceIdentity.js +70 -0
  126. package/dist/domain/externalReferenceIdentity.js.map +1 -0
  127. package/dist/domain/externalReferenceImage.d.ts +35 -0
  128. package/dist/domain/externalReferenceImage.js +160 -0
  129. package/dist/domain/externalReferenceImage.js.map +1 -0
  130. package/dist/domain/externalReferenceRegionRelationships.d.ts +63 -0
  131. package/dist/domain/externalReferenceRegionRelationships.js +98 -0
  132. package/dist/domain/externalReferenceRegionRelationships.js.map +1 -0
  133. package/dist/domain/externalReferenceRegions.d.ts +65 -0
  134. package/dist/domain/externalReferenceRegions.js +105 -0
  135. package/dist/domain/externalReferenceRegions.js.map +1 -0
  136. package/dist/domain/externalReferenceRequirementIdentity.d.ts +12 -0
  137. package/dist/domain/externalReferenceRequirementIdentity.js +35 -0
  138. package/dist/domain/externalReferenceRequirementIdentity.js.map +1 -0
  139. package/dist/domain/externalReferenceRequirements.d.ts +215 -0
  140. package/dist/domain/externalReferenceRequirements.js +401 -0
  141. package/dist/domain/externalReferenceRequirements.js.map +1 -0
  142. package/dist/domain/externalReferenceRuntimeBinding.d.ts +146 -0
  143. package/dist/domain/externalReferenceRuntimeBinding.js +183 -0
  144. package/dist/domain/externalReferenceRuntimeBinding.js.map +1 -0
  145. package/dist/domain/frontendContractEvaluation.d.ts +57 -0
  146. package/dist/domain/frontendContractEvaluation.js +454 -0
  147. package/dist/domain/frontendContractEvaluation.js.map +1 -0
  148. package/dist/domain/frontendContractEvaluationArtifact.d.ts +65 -0
  149. package/dist/domain/frontendContractEvaluationArtifact.js +108 -0
  150. package/dist/domain/frontendContractEvaluationArtifact.js.map +1 -0
  151. package/dist/domain/frontendContractIdentity.d.ts +39 -0
  152. package/dist/domain/frontendContractIdentity.js +70 -0
  153. package/dist/domain/frontendContractIdentity.js.map +1 -0
  154. package/dist/domain/frontendContracts.d.ts +188 -0
  155. package/dist/domain/frontendContracts.js +260 -0
  156. package/dist/domain/frontendContracts.js.map +1 -0
  157. package/dist/domain/identity.d.ts +21 -0
  158. package/dist/domain/identity.js +47 -0
  159. package/dist/domain/identity.js.map +1 -0
  160. package/dist/domain/referenceCorrectionIdentity.d.ts +40 -0
  161. package/dist/domain/referenceCorrectionIdentity.js +77 -0
  162. package/dist/domain/referenceCorrectionIdentity.js.map +1 -0
  163. package/dist/domain/referenceCorrectionWorkflow.d.ts +160 -0
  164. package/dist/domain/referenceCorrectionWorkflow.js +165 -0
  165. package/dist/domain/referenceCorrectionWorkflow.js.map +1 -0
  166. package/dist/domain/referenceFidelityProjection.d.ts +65 -0
  167. package/dist/domain/referenceFidelityProjection.js +135 -0
  168. package/dist/domain/referenceFidelityProjection.js.map +1 -0
  169. package/dist/domain/relationships.d.ts +210 -0
  170. package/dist/domain/relationships.js +352 -0
  171. package/dist/domain/relationships.js.map +1 -0
  172. package/dist/domain/schema.d.ts +269 -0
  173. package/dist/domain/schema.js +442 -0
  174. package/dist/domain/schema.js.map +1 -0
  175. package/dist/domain/scrollEvidence.d.ts +51 -0
  176. package/dist/domain/scrollEvidence.js +134 -0
  177. package/dist/domain/scrollEvidence.js.map +1 -0
  178. package/dist/index.d.ts +114 -0
  179. package/dist/index.js +64 -0
  180. package/dist/index.js.map +1 -0
  181. package/dist/projectWorkflow/aliasCatalog.d.ts +21 -0
  182. package/dist/projectWorkflow/aliasCatalog.js +67 -0
  183. package/dist/projectWorkflow/aliasCatalog.js.map +1 -0
  184. package/dist/projectWorkflow/checkAcceptance.d.ts +25 -0
  185. package/dist/projectWorkflow/checkAcceptance.js +55 -0
  186. package/dist/projectWorkflow/checkAcceptance.js.map +1 -0
  187. package/dist/projectWorkflow/checkResult.d.ts +85 -0
  188. package/dist/projectWorkflow/checkResult.js +101 -0
  189. package/dist/projectWorkflow/checkResult.js.map +1 -0
  190. package/dist/projectWorkflow/projectConfig.d.ts +43 -0
  191. package/dist/projectWorkflow/projectConfig.js +84 -0
  192. package/dist/projectWorkflow/projectConfig.js.map +1 -0
  193. package/dist/projectWorkflow/projectDiscovery.d.ts +9 -0
  194. package/dist/projectWorkflow/projectDiscovery.js +20 -0
  195. package/dist/projectWorkflow/projectDiscovery.js.map +1 -0
  196. package/dist/projectWorkflow/projectPaths.d.ts +8 -0
  197. package/dist/projectWorkflow/projectPaths.js +23 -0
  198. package/dist/projectWorkflow/projectPaths.js.map +1 -0
  199. package/dist/request/paths.d.ts +14 -0
  200. package/dist/request/paths.js +33 -0
  201. package/dist/request/paths.js.map +1 -0
  202. package/dist/request/request.d.ts +111 -0
  203. package/dist/request/request.js +464 -0
  204. package/dist/request/request.js.map +1 -0
  205. package/dist/safety/policy.d.ts +14 -0
  206. package/dist/safety/policy.js +81 -0
  207. package/dist/safety/policy.js.map +1 -0
  208. package/dist/viewer/assets/index-CN_yb9Uf.css +1 -0
  209. package/dist/viewer/assets/index-D98S1_2d.js +9 -0
  210. package/dist/viewer/icons/icon-192.png +0 -0
  211. package/dist/viewer/icons/icon-512.png +0 -0
  212. package/dist/viewer/index.html +15 -0
  213. package/dist/viewer/manifest.webmanifest +1 -0
  214. package/dist/viewer/registerSW.js +1 -0
  215. package/dist/viewer/sw.js +1 -0
  216. package/dist/viewer/workbox-9c191d2f.js +1 -0
  217. package/dist/viewerServer/context.d.ts +48 -0
  218. package/dist/viewerServer/context.js +60 -0
  219. package/dist/viewerServer/context.js.map +1 -0
  220. package/dist/viewerServer/evidence/classify.d.ts +59 -0
  221. package/dist/viewerServer/evidence/classify.js +124 -0
  222. package/dist/viewerServer/evidence/classify.js.map +1 -0
  223. package/dist/viewerServer/evidence/comparisonView.d.ts +28 -0
  224. package/dist/viewerServer/evidence/comparisonView.js +43 -0
  225. package/dist/viewerServer/evidence/comparisonView.js.map +1 -0
  226. package/dist/viewerServer/evidence/contextSourceView.d.ts +25 -0
  227. package/dist/viewerServer/evidence/contextSourceView.js +20 -0
  228. package/dist/viewerServer/evidence/contextSourceView.js.map +1 -0
  229. package/dist/viewerServer/evidence/discovery.d.ts +31 -0
  230. package/dist/viewerServer/evidence/discovery.js +78 -0
  231. package/dist/viewerServer/evidence/discovery.js.map +1 -0
  232. package/dist/viewerServer/evidence/evaluationView.d.ts +32 -0
  233. package/dist/viewerServer/evidence/evaluationView.js +50 -0
  234. package/dist/viewerServer/evidence/evaluationView.js.map +1 -0
  235. package/dist/viewerServer/evidence/handles.d.ts +21 -0
  236. package/dist/viewerServer/evidence/handles.js +43 -0
  237. package/dist/viewerServer/evidence/handles.js.map +1 -0
  238. package/dist/viewerServer/evidence/index.d.ts +41 -0
  239. package/dist/viewerServer/evidence/index.js +82 -0
  240. package/dist/viewerServer/evidence/index.js.map +1 -0
  241. package/dist/viewerServer/evidence/limits.d.ts +27 -0
  242. package/dist/viewerServer/evidence/limits.js +28 -0
  243. package/dist/viewerServer/evidence/limits.js.map +1 -0
  244. package/dist/viewerServer/evidence/linkedEvidence.d.ts +43 -0
  245. package/dist/viewerServer/evidence/linkedEvidence.js +151 -0
  246. package/dist/viewerServer/evidence/linkedEvidence.js.map +1 -0
  247. package/dist/viewerServer/evidence/mediaResolver.d.ts +16 -0
  248. package/dist/viewerServer/evidence/mediaResolver.js +85 -0
  249. package/dist/viewerServer/evidence/mediaResolver.js.map +1 -0
  250. package/dist/viewerServer/evidence/observationView.d.ts +29 -0
  251. package/dist/viewerServer/evidence/observationView.js +46 -0
  252. package/dist/viewerServer/evidence/observationView.js.map +1 -0
  253. package/dist/viewerServer/evidence/pathSafety.d.ts +11 -0
  254. package/dist/viewerServer/evidence/pathSafety.js +31 -0
  255. package/dist/viewerServer/evidence/pathSafety.js.map +1 -0
  256. package/dist/viewerServer/evidence/projection.d.ts +55 -0
  257. package/dist/viewerServer/evidence/projection.js +152 -0
  258. package/dist/viewerServer/evidence/projection.js.map +1 -0
  259. package/dist/viewerServer/evidence/referenceView.d.ts +133 -0
  260. package/dist/viewerServer/evidence/referenceView.js +169 -0
  261. package/dist/viewerServer/evidence/referenceView.js.map +1 -0
  262. package/dist/viewerServer/httpServer.d.ts +27 -0
  263. package/dist/viewerServer/httpServer.js +381 -0
  264. package/dist/viewerServer/httpServer.js.map +1 -0
  265. package/dist/viewerServer/openBrowser.d.ts +7 -0
  266. package/dist/viewerServer/openBrowser.js +32 -0
  267. package/dist/viewerServer/openBrowser.js.map +1 -0
  268. package/dist/viewerServer/port.d.ts +16 -0
  269. package/dist/viewerServer/port.js +19 -0
  270. package/dist/viewerServer/port.js.map +1 -0
  271. package/dist/viewerServer/viewerService.d.ts +62 -0
  272. package/dist/viewerServer/viewerService.js +88 -0
  273. package/dist/viewerServer/viewerService.js.map +1 -0
  274. package/docs/ARCHITECTURE.md +1286 -0
  275. package/docs/CI_CD.md +250 -0
  276. package/docs/COMMANDS.md +972 -0
  277. package/docs/CONTRACTS.md +1856 -0
  278. package/docs/CURRENT_STATE.md +1049 -0
  279. package/docs/DEVELOPMENT.md +202 -0
  280. package/docs/DOCUMENTATION_PRESERVATION_POLICY.md +50 -0
  281. package/docs/PROJECT_DESCRIPTION.md +2221 -0
  282. package/docs/PROJECT_MILESTONES.md +2526 -0
  283. package/docs/PROJECT_OVERVIEW.md +150 -0
  284. package/docs/QUICKSTART.md +83 -0
  285. package/docs/RELEASE.md +27 -0
  286. package/docs/ROADMAP.md +641 -0
  287. package/docs/SECURITY.md +218 -0
  288. package/docs/WORKFLOWS.md +642 -0
  289. package/docs/plans/v0.8-implementation-plan.md +655 -0
  290. package/docs/plans/v0.8.1-cli-usability-patch-plan.md +505 -0
  291. package/docs/reports/v0.7-bounded-fidelity-context-prompt7.md +243 -0
  292. package/docs/reports/v0.7-implementation-completeness-documentation-reconciliation.md +497 -0
  293. package/docs/reports/v0.7-pre-release-readiness.md +337 -0
  294. package/docs/reports/v0.7-reference-binding-prompt5.md +223 -0
  295. package/docs/reports/v0.7-reference-compatibility-prompt4.md +234 -0
  296. package/docs/reports/v0.7-reference-correction-workflow-prompt8.md +222 -0
  297. package/docs/reports/v0.7-reference-fidelity-prompt6.md +216 -0
  298. package/docs/reports/v0.7-reference-foundation-prompt1.md +151 -0
  299. package/docs/reports/v0.7-reference-regions-prompt2.md +195 -0
  300. package/docs/reports/v0.7-reference-requirements-prompt3.md +217 -0
  301. package/docs/reports/v0.7-release-prep.md +423 -0
  302. package/docs/reports/v0.8-binding-fidelity-interaction-batch6.md +279 -0
  303. package/docs/reports/v0.8-bounded-context-correlation-batch7.md +233 -0
  304. package/docs/reports/v0.8-comparison-contract-inspection-batch4.md +279 -0
  305. package/docs/reports/v0.8-evidence-index-readers-batch2.md +247 -0
  306. package/docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md +741 -0
  307. package/docs/reports/v0.8-integrated-viewer-acceptance-batch8.md +128 -0
  308. package/docs/reports/v0.8-observation-svg-inspection-batch3.md +223 -0
  309. package/docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md +687 -0
  310. package/docs/reports/v0.8-reference-candidate-inspection-batch5.md +232 -0
  311. package/docs/reports/v0.8-viewer-runtime-pwa-batch1.md +278 -0
  312. package/docs/reports/v0.8.1-check-orchestration-prompt2.md +69 -0
  313. package/docs/reports/v0.8.1-implementation-completeness-documentation-reconciliation.md +114 -0
  314. package/docs/reports/v0.8.1-prerelease-readiness-cross-platform-security-code-rot.md +170 -0
  315. package/docs/reports/v0.8.1-project-workflow-foundation-prompt1.md +66 -0
  316. package/package.json +58 -0
@@ -0,0 +1,105 @@
1
+ /**
2
+ * v0.7 Prompt 2 explicit reference-region geometry. A region is one
3
+ * user/configuration-authored rectangle in the coordinate system of an
4
+ * external reference image - origin at the image's top-left corner, x
5
+ * increasing rightward, y increasing downward, unit is reference-image
6
+ * pixels (never CSS pixels - this is a static image, not a rendered page).
7
+ * Coordinates may be fractional. This module never infers a region from
8
+ * pixel content: no OCR, no computer vision, no automatic segmentation.
9
+ *
10
+ * Only the rectangle {x, y, width, height} is canonical/authored; every
11
+ * other geometric fact (right, bottom, centerX, centerY) is a pure
12
+ * calculation over it (see deriveReferenceRegionGeometry) so that no
13
+ * redundant, potentially-drifting copy of the same fact is ever persisted.
14
+ */
15
+ function isPlainObject(value) {
16
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
17
+ }
18
+ function isFiniteNumber(value) {
19
+ return typeof value === 'number' && Number.isFinite(value);
20
+ }
21
+ /** Same character/length convention as request/request.ts's target-name pattern (`^[A-Za-z0-9_-]{1,64}$`) - reused directly, not reinvented, for the same "stable, portable, log/path-safe identifier" reason. */
22
+ export const REFERENCE_REGION_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
23
+ /** Same numeric bound as request/request.ts's MAX_TARGETS (20) - a coincidentally equal, independently-owned constant: reference regions are design-authoring input, not runtime targets, so the two are not structurally coupled even though they share a value and the same "bound the O(n^2) pairwise-relationship explosion" rationale (see externalReferenceRegionRelationships.ts). */
24
+ export const MAX_REFERENCE_REGIONS = 20;
25
+ export function deriveReferenceRegionGeometry(rectangle) {
26
+ return {
27
+ x: rectangle.x,
28
+ y: rectangle.y,
29
+ width: rectangle.width,
30
+ height: rectangle.height,
31
+ right: rectangle.x + rectangle.width,
32
+ bottom: rectangle.y + rectangle.height,
33
+ centerX: rectangle.x + rectangle.width / 2,
34
+ centerY: rectangle.y + rectangle.height / 2,
35
+ };
36
+ }
37
+ /**
38
+ * Structural + numeric validation of one rectangle only - does not know
39
+ * about image bounds (see isValidReferenceRegions for the boundary check,
40
+ * which needs the owning image's dimensions). Fails closed on non-finite,
41
+ * negative, or zero width/height: authored design geometry is never
42
+ * silently clamped into validity.
43
+ */
44
+ export function isValidReferenceRegionRectangle(value) {
45
+ if (!isPlainObject(value))
46
+ return { valid: false, reason: 'rectangle must be an object' };
47
+ if (!isFiniteNumber(value.x))
48
+ return { valid: false, reason: 'rectangle.x must be a finite number' };
49
+ if (!isFiniteNumber(value.y))
50
+ return { valid: false, reason: 'rectangle.y must be a finite number' };
51
+ if (!isFiniteNumber(value.width))
52
+ return { valid: false, reason: 'rectangle.width must be a finite number' };
53
+ if (!isFiniteNumber(value.height))
54
+ return { valid: false, reason: 'rectangle.height must be a finite number' };
55
+ if (value.x < 0)
56
+ return { valid: false, reason: 'rectangle.x must not be negative' };
57
+ if (value.y < 0)
58
+ return { valid: false, reason: 'rectangle.y must not be negative' };
59
+ if (value.width <= 0)
60
+ return { valid: false, reason: 'rectangle.width must be greater than 0' };
61
+ if (value.height <= 0)
62
+ return { valid: false, reason: 'rectangle.height must be greater than 0' };
63
+ return { valid: true };
64
+ }
65
+ export function isValidReferenceRegion(value) {
66
+ if (!isPlainObject(value))
67
+ return { valid: false, reason: 'region must be an object' };
68
+ if (typeof value.id !== 'string' || value.id.length === 0)
69
+ return { valid: false, reason: 'region.id must be a non-empty string' };
70
+ if (!REFERENCE_REGION_ID_PATTERN.test(value.id))
71
+ return { valid: false, reason: `region.id "${value.id}" must match ${REFERENCE_REGION_ID_PATTERN}` };
72
+ return isValidReferenceRegionRectangle(value.rectangle);
73
+ }
74
+ /**
75
+ * Collection-level validation: bounded count, unique IDs (case-insensitive,
76
+ * mirroring request/request.ts's target-name dedup convention), and every
77
+ * region's rectangle contained within the owning image's own dimensions -
78
+ * never silently clipped, rejected outright instead. `imageWidth`/
79
+ * `imageHeight` come from the artifact's own already-validated image
80
+ * metadata (ExternalReferenceImageReference or the approved artifact's
81
+ * sourceReference.image), never re-parsed here.
82
+ */
83
+ export function isValidReferenceRegions(value, imageWidth, imageHeight) {
84
+ if (!Array.isArray(value))
85
+ return { valid: false, reason: 'regions must be an array' };
86
+ if (value.length > MAX_REFERENCE_REGIONS)
87
+ return { valid: false, reason: `regions must contain at most ${MAX_REFERENCE_REGIONS} entries` };
88
+ const seenIds = new Set();
89
+ for (const entry of value) {
90
+ const regionValidation = isValidReferenceRegion(entry);
91
+ if (!regionValidation.valid)
92
+ return regionValidation;
93
+ const region = entry;
94
+ const lowerId = region.id.toLowerCase();
95
+ if (seenIds.has(lowerId))
96
+ return { valid: false, reason: `duplicate region id "${region.id}"` };
97
+ seenIds.add(lowerId);
98
+ const geometry = deriveReferenceRegionGeometry(region.rectangle);
99
+ if (geometry.right > imageWidth || geometry.bottom > imageHeight) {
100
+ return { valid: false, reason: `region "${region.id}" extends outside the reference image bounds (${imageWidth}x${imageHeight})` };
101
+ }
102
+ }
103
+ return { valid: true };
104
+ }
105
+ //# sourceMappingURL=externalReferenceRegions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalReferenceRegions.js","sourceRoot":"","sources":["../../src/domain/externalReferenceRegions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,kNAAkN;AAClN,MAAM,CAAC,MAAM,2BAA2B,GAAG,uBAAuB,CAAC;AAEnE,6XAA6X;AAC7X,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AA0BxC,MAAM,UAAU,6BAA6B,CAAC,SAAmC;IAC/E,OAAO;QACL,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK;QACpC,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM;QACtC,OAAO,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC;QAC1C,OAAO,EAAE,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;KAC5C,CAAC;AACJ,CAAC;AAID;;;;;;GAMG;AACH,MAAM,UAAU,+BAA+B,CAAC,KAAc;IAC5D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;IAC1F,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC;IACrG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC;IACrG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC;IAC7G,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,0CAA0C,EAAE,CAAC;IAC/G,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC;IACrF,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC;IACrF,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,wCAAwC,EAAE,CAAC;IAChG,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC;IAClG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACvF,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,sCAAsC,EAAE,CAAC;IACnI,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,KAAK,CAAC,EAAE,gBAAgB,2BAA2B,EAAE,EAAE,CAAC;IACtJ,OAAO,+BAA+B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc,EAAE,UAAkB,EAAE,WAAmB;IAC7F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;IACvF,IAAI,KAAK,CAAC,MAAM,GAAG,qBAAqB;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,qBAAqB,UAAU,EAAE,CAAC;IAE3I,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,gBAAgB,CAAC,KAAK;YAAE,OAAO,gBAAgB,CAAC;QACrD,MAAM,MAAM,GAAG,KAAwB,CAAC;QAExC,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAErB,MAAM,QAAQ,GAAG,6BAA6B,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,KAAK,GAAG,UAAU,IAAI,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YACjE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,MAAM,CAAC,EAAE,iDAAiD,UAAU,IAAI,WAAW,GAAG,EAAE,CAAC;QACrI,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Deterministic identity of a single reference requirement's own semantic
3
+ * content - independent of authoring order or which reference it belongs to.
4
+ * Mirrors domain/frontendContractIdentity.ts#buildClauseIdentity exactly
5
+ * (same canonicalize+sha256 shape over {subject, tolerance}), extended with
6
+ * `category`/`expectedDependentMode` because - unlike a v0.5 baseline
7
+ * clause, whose identity is deliberately category-independent - two
8
+ * reference requirements with the same subject/tolerance but different
9
+ * authored category are semantically distinct authored intents (see
10
+ * docs/CONTRACTS.md "v0.7 Prompt 3").
11
+ */
12
+ export declare function buildReferenceRequirementIdentity(subject: unknown, category: string, tolerance: unknown, expectedDependentMode?: string): string;
@@ -0,0 +1,35 @@
1
+ import { createHash } from 'node:crypto';
2
+ /**
3
+ * Deliberately duplicated from domain/identity.ts#canonicalize (itself
4
+ * duplicated across comparisonIdentity.ts/frontendContractIdentity.ts/
5
+ * externalReferenceIdentity.ts) rather than imported - each identity module
6
+ * owns its own private canonicalize per existing repository convention.
7
+ */
8
+ function canonicalize(value) {
9
+ if (Array.isArray(value))
10
+ return value.map(canonicalize);
11
+ if (value !== null && typeof value === 'object') {
12
+ const entries = Object.entries(value)
13
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
14
+ .map(([key, entryValue]) => [key, canonicalize(entryValue)]);
15
+ return Object.fromEntries(entries);
16
+ }
17
+ return value;
18
+ }
19
+ /**
20
+ * Deterministic identity of a single reference requirement's own semantic
21
+ * content - independent of authoring order or which reference it belongs to.
22
+ * Mirrors domain/frontendContractIdentity.ts#buildClauseIdentity exactly
23
+ * (same canonicalize+sha256 shape over {subject, tolerance}), extended with
24
+ * `category`/`expectedDependentMode` because - unlike a v0.5 baseline
25
+ * clause, whose identity is deliberately category-independent - two
26
+ * reference requirements with the same subject/tolerance but different
27
+ * authored category are semantically distinct authored intents (see
28
+ * docs/CONTRACTS.md "v0.7 Prompt 3").
29
+ */
30
+ export function buildReferenceRequirementIdentity(subject, category, tolerance, expectedDependentMode) {
31
+ const semanticView = { subject, category, expectedDependentMode: expectedDependentMode ?? null, tolerance: tolerance ?? null };
32
+ const serialized = JSON.stringify(canonicalize(semanticView));
33
+ return createHash('sha256').update(serialized).digest('hex');
34
+ }
35
+ //# sourceMappingURL=externalReferenceRequirementIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"externalReferenceRequirementIdentity.js","sourceRoot":"","sources":["../../src/domain/externalReferenceRequirementIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAChD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,UAAU,CAAC,CAAU,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iCAAiC,CAC/C,OAAgB,EAChB,QAAgB,EAChB,SAAkB,EAClB,qBAA8B;IAE9B,MAAM,YAAY,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,qBAAqB,IAAI,IAAI,EAAE,SAAS,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;IAC/H,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9D,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * v0.7 Prompt 3 selected design requirements, tolerance semantics, and
3
+ * reference-evidence adequacy. Builds only on Prompt 2's `ReferenceRegion`/
4
+ * `ReferenceRegionGeometry`/relationship-derivation - it does not implement
5
+ * runtime-target binding, candidate comparison, or fidelity PASS/FAIL (those
6
+ * remain later v0.7 prompts).
7
+ *
8
+ * Central distinction (see docs/CONTRACTS.md "v0.7 Prompt 3"): a reference
9
+ * region's geometry is REFERENCE EVIDENCE - everything visibly/measurably
10
+ * present in the supplied image. A requirement is SELECTED DESIGN INTENT -
11
+ * only what the user/configuration explicitly authored as mattering for
12
+ * later candidate evaluation. This module never infers a requirement merely
13
+ * because a property or relationship exists.
14
+ *
15
+ * Requirement categories are the exact v0.5 `AuthoredChangeScopeCategory`
16
+ * vocabulary (`requested`/`expected-dependent`/`protected`/`preserved`),
17
+ * imported directly rather than reinvented as a "reference-only" taxonomy -
18
+ * that type carries no runtime-only coupling in its own definition. As in
19
+ * v0.5, `'unexpected'` remains impossible to author here: it is not a member
20
+ * of `AuthoredChangeScopeCategory` at all.
21
+ */
22
+ import { AUTHORED_CHANGE_SCOPE_CATEGORIES, isAuthoredChangeScopeCategory, EXPECTED_DEPENDENT_MODES, isValidExpectedDependentMode } from './frontendContracts.js';
23
+ import type { AuthoredChangeScopeCategory, ExpectedDependentMode } from './frontendContracts.js';
24
+ import type { PairwiseRelationshipKind } from './relationships.js';
25
+ import type { ReferenceRegion, ReferenceRegionGeometry } from './externalReferenceRegions.js';
26
+ export { AUTHORED_CHANGE_SCOPE_CATEGORIES, isAuthoredChangeScopeCategory, EXPECTED_DEPENDENT_MODES, isValidExpectedDependentMode };
27
+ export type { AuthoredChangeScopeCategory, ExpectedDependentMode };
28
+ export declare const MAX_REFERENCE_REQUIREMENTS = 50;
29
+ /** Exactly the fields of ReferenceRegionGeometry - the smallest coherent vocabulary already available from Prompt 2, nothing invented (no separate "left"/"top" aliases - x/y already are the left/top edges of the canonical rectangle). */
30
+ export declare const REFERENCE_REQUIREMENT_REGION_PROPERTIES: readonly ["x", "y", "width", "height", "right", "bottom", "centerX", "centerY"];
31
+ export type ReferenceRequirementRegionProperty = (typeof REFERENCE_REQUIREMENT_REGION_PROPERTIES)[number];
32
+ export declare function isReferenceRequirementRegionProperty(value: unknown): value is ReferenceRequirementRegionProperty;
33
+ /** Smallest useful set of pure two-region derived measurements (request section 18) - not an unrestricted geometry expression language. */
34
+ export declare const REFERENCE_REQUIREMENT_MEASUREMENTS: readonly ["vertical-gap", "horizontal-gap", "center-x-delta", "center-y-delta", "left-edge-delta", "right-edge-delta"];
35
+ export type ReferenceRequirementMeasurement = (typeof REFERENCE_REQUIREMENT_MEASUREMENTS)[number];
36
+ export declare function isReferenceRequirementMeasurement(value: unknown): value is ReferenceRequirementMeasurement;
37
+ /**
38
+ * Pure derived two-region measurements. `vertical-gap`/`horizontal-gap`
39
+ * return `undefined` when the two regions overlap on that axis (the gap is
40
+ * geometrically undefined, never fabricated as 0 or negative) - direction is
41
+ * decided by actual geometry, mirroring relationships.ts's
42
+ * verticalSequenceOf/horizontalOrderOf convention. The delta measurements
43
+ * are always defined (a plain numeric distance, never negative).
44
+ */
45
+ export declare function deriveReferenceRequirementMeasurement(kind: ReferenceRequirementMeasurement, a: ReferenceRegionGeometry, b: ReferenceRegionGeometry): number | undefined;
46
+ /**
47
+ * Deliberately not a reuse of domain/frontendContracts.ts#ContractTolerance:
48
+ * that type's `'absolute-px'` member is implicitly runtime/CSS pixels
49
+ * (compared against `TargetGeometry` from a live ObservationArtifact).
50
+ * Reference-image pixels are a different, explicitly-labeled unit (see
51
+ * externalReferenceRegions.ts's coordinate-semantics doc comment) - Prompt 6
52
+ * will eventually need an explicit scale/compatibility mapping between the
53
+ * two; nothing here assumes 1 reference pixel = 1 CSS pixel. Numeric bounds
54
+ * intentionally mirror CONTRACT_TOLERANCE_ABSOLUTE_PX_MIN/MAX and
55
+ * CONTRACT_TOLERANCE_PERCENT_MIN/MAX (same values, independently owned
56
+ * constants) rather than importing them, for the same unit-labeling reason.
57
+ */
58
+ export declare const REFERENCE_REQUIREMENT_TOLERANCE_ABSOLUTE_PX_MIN = 0;
59
+ export declare const REFERENCE_REQUIREMENT_TOLERANCE_ABSOLUTE_PX_MAX = 100;
60
+ export declare const REFERENCE_REQUIREMENT_TOLERANCE_PERCENT_MIN = 0;
61
+ export declare const REFERENCE_REQUIREMENT_TOLERANCE_PERCENT_MAX = 100;
62
+ export type ReferenceRequirementTolerance = {
63
+ kind: 'exact';
64
+ } | {
65
+ kind: 'absolute-reference-px';
66
+ amount: number;
67
+ } | {
68
+ kind: 'percent';
69
+ amount: number;
70
+ };
71
+ export declare function isValidReferenceRequirementTolerance(value: unknown): value is ReferenceRequirementTolerance;
72
+ export interface RegionPropertyRequirementSubject {
73
+ kind: 'region-property';
74
+ region: string;
75
+ property: ReferenceRequirementRegionProperty;
76
+ }
77
+ export interface RegionRelationshipRequirementSubject {
78
+ kind: 'region-relationship';
79
+ subjectRegion: string;
80
+ relatedRegion: string;
81
+ relationship: PairwiseRelationshipKind;
82
+ }
83
+ export interface RegionMeasurementRequirementSubject {
84
+ kind: 'region-measurement';
85
+ subjectRegion: string;
86
+ relatedRegion: string;
87
+ measurement: ReferenceRequirementMeasurement;
88
+ }
89
+ export type ReferenceRequirementSubject = RegionPropertyRequirementSubject | RegionRelationshipRequirementSubject | RegionMeasurementRequirementSubject;
90
+ export declare function isValidReferenceRequirementSubjectShape(value: unknown): value is ReferenceRequirementSubject;
91
+ export interface ExternalReferenceRequirement {
92
+ /** Deterministic identity from {subject, category, expectedDependentMode, tolerance} only - see externalReferenceRequirementIdentity.ts. Never a timestamp or config path. */
93
+ requirementId: string;
94
+ category: AuthoredChangeScopeCategory;
95
+ expectedDependentMode?: ExpectedDependentMode;
96
+ subject: ReferenceRequirementSubject;
97
+ /** Required for region-property/region-measurement subjects (a numeric comparison needs a tolerance); must be absent for region-relationship subjects (a categorical fact - see docs/CONTRACTS.md). */
98
+ tolerance?: ReferenceRequirementTolerance;
99
+ }
100
+ export type ReferenceRequirementValidationResult = {
101
+ valid: true;
102
+ } | {
103
+ valid: false;
104
+ reason: string;
105
+ };
106
+ /**
107
+ * Raw authored input shape: exactly what a user/config supplies via
108
+ * `--requirements-file` - {category, expectedDependentMode?, subject,
109
+ * tolerance?}, deliberately with no `requirementId` field. Identity is
110
+ * always system-computed from this exact content (see
111
+ * buildReferenceRequirement below), never author-supplied - unlike v0.5's
112
+ * BaselineClause/PerChangeClause, which need an author-visible `clauseId` so
113
+ * separate documents can cross-reference it via `supersedesBaselineClauseIds`;
114
+ * Prompt 3 requirements have no cross-document reference need yet, so
115
+ * requiring (and trusting) an authored id would only invite drift between a
116
+ * user-typed id and the content it is supposed to identify.
117
+ */
118
+ export interface RawReferenceRequirement {
119
+ category: AuthoredChangeScopeCategory;
120
+ expectedDependentMode?: ExpectedDependentMode;
121
+ subject: ReferenceRequirementSubject;
122
+ tolerance?: ReferenceRequirementTolerance;
123
+ }
124
+ /** Validates one raw, not-yet-identified authored requirement - the shape accepted from `--requirements-file`. */
125
+ export declare function isValidRawReferenceRequirement(value: unknown): ReferenceRequirementValidationResult;
126
+ /** Computes the deterministic requirementId and returns a complete ExternalReferenceRequirement. Callers must validate via isValidRawReferenceRequirement first. */
127
+ export declare function buildReferenceRequirement(raw: RawReferenceRequirement): ExternalReferenceRequirement;
128
+ /** Validates one already-identified, fully-constructed requirement's own shape (category/mode/subject/tolerance-applicability, plus requirementId presence) - never region existence, which needs the owning reference's `regions` (see isValidReferenceRequirements). Used to defensively re-validate a persisted/about-to-be-persisted ExternalReferenceRequirement, mirroring how every other artifact family's writer re-validates via the same gate it will later read with. */
129
+ export declare function isValidReferenceRequirementShape(value: unknown): ReferenceRequirementValidationResult;
130
+ /**
131
+ * Collection-level validation: bounded count, every subject's region id(s)
132
+ * must exist among the owning artifact's own already-validated `regions`
133
+ * (an authored requirement pointing at a nonexistent region is a structural
134
+ * validation failure, never merely "unavailable" evidence - see
135
+ * docs/CONTRACTS.md), and no two requirements may share the same structural
136
+ * subject (the chosen conflict-handling rule - see the same doc section for
137
+ * why v0.5's runtime-evidence conflict detector could not be reused here).
138
+ */
139
+ export declare function isValidReferenceRequirements(value: unknown, regions: readonly ReferenceRegion[]): ReferenceRequirementValidationResult;
140
+ export type ReferenceRequirementExpectation = {
141
+ available: true;
142
+ kind: 'numeric';
143
+ value: number;
144
+ } | {
145
+ available: true;
146
+ kind: 'relationship';
147
+ matches: boolean;
148
+ } | {
149
+ available: false;
150
+ reason: string;
151
+ };
152
+ /**
153
+ * Derives what the reference itself shows for one requirement's subject,
154
+ * purely from the supplied regions - never stored on the requirement or the
155
+ * artifact (avoids the exact drift risk request section 14 warns about: a
156
+ * stored `width: 424` could silently disagree with the region's own
157
+ * rectangle after some future change). `geometryTolerancePx` is passed
158
+ * through to relationship derivation unchanged (Prompt 2's own default
159
+ * applies when omitted).
160
+ */
161
+ export declare function deriveReferenceRequirementExpectation(subject: ReferenceRequirementSubject, regions: readonly ReferenceRegion[], options?: {
162
+ geometryTolerancePx?: number;
163
+ }): ReferenceRequirementExpectation;
164
+ export declare const REFERENCE_REQUIREMENT_ADEQUACY_STATES: readonly ["adequate", "partial", "inadequate"];
165
+ export type ReferenceRequirementAdequacyState = (typeof REFERENCE_REQUIREMENT_ADEQUACY_STATES)[number];
166
+ /**
167
+ * Deliberately its own small, reference-owned vocabulary - not a reuse of
168
+ * domain/boundedAgentContext.ts#ADEQUACY_REASON_CODES, which describes
169
+ * runtime-target/static-correlation concerns that do not exist yet at this
170
+ * stage (see docs/CONTRACTS.md "v0.7 Prompt 3" for the full precedent
171
+ * review). Only two codes exist because only two conditions can make an
172
+ * already-*structurally-valid* requirement collection reference-inadequate:
173
+ * authoring zero requirements at all, or a validly-shaped relationship/
174
+ * measurement requirement whose evidence cannot actually be derived from the
175
+ * reference geometry. An unknown-region or malformed requirement is a
176
+ * construction-time validation failure (isValidReferenceRequirements) and
177
+ * never reaches adequacy at all.
178
+ */
179
+ export declare const REFERENCE_REQUIREMENT_ADEQUACY_REASON_CODES: readonly ["no-selected-requirements", "missing-reference-relationship-evidence"];
180
+ export type ReferenceRequirementAdequacyReasonCode = (typeof REFERENCE_REQUIREMENT_ADEQUACY_REASON_CODES)[number];
181
+ export interface ReferenceRequirementAdequacyReason {
182
+ code: ReferenceRequirementAdequacyReasonCode;
183
+ requirementId?: string;
184
+ detail?: string;
185
+ }
186
+ export interface ReferenceRequirementAdequacy {
187
+ status: ReferenceRequirementAdequacyState;
188
+ totalRequirements: number;
189
+ evaluableRequirements: number;
190
+ unavailableRequirements: number;
191
+ reasons: ReferenceRequirementAdequacyReason[];
192
+ }
193
+ /**
194
+ * REFERENCE-SIDE adequacy only: does the reference definition itself contain
195
+ * enough evidence to understand every selected requirement? This never asks
196
+ * whether a runtime target/candidate exists (that is Prompt 4/5's
197
+ * responsibility). A reference with zero authored requirements is explicitly
198
+ * `inadequate` (request section 24F's documented decision: an
199
+ * externally-valid, region-rich reference is still not usable for a
200
+ * correction task until the user has actually selected what matters).
201
+ * Deterministic: reasons are ordered by authored requirement index, never by
202
+ * object-key iteration order.
203
+ */
204
+ export declare function deriveReferenceRequirementAdequacy(regions: readonly ReferenceRegion[], requirements: readonly ExternalReferenceRequirement[], options?: {
205
+ geometryTolerancePx?: number;
206
+ }): ReferenceRequirementAdequacy;
207
+ /**
208
+ * v0.7 Prompt 7 addition (additive, previously no structural validator
209
+ * existed for this already-frozen Prompt 3 shape): a defense-in-depth
210
+ * structural check, reused by `boundedAgentContext.ts` when accepting an
211
+ * already-computed `ReferenceRequirementAdequacy` value as part of a bounded
212
+ * fidelity projection. No change to `deriveReferenceRequirementAdequacy`'s
213
+ * own logic or the `ReferenceRequirementAdequacy` contract itself.
214
+ */
215
+ export declare function isValidReferenceRequirementAdequacy(value: unknown): value is ReferenceRequirementAdequacy;