@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,220 @@
1
+ /**
2
+ * v0.4 Batch 1 comparison contract. Frozen here as pure
3
+ * types/constants/structural validators only - comparison is downstream of
4
+ * observation (real Chromium -> ObservationArtifact -> relationship
5
+ * derivation -> comparability analysis -> comparison -> ComparisonArtifact,
6
+ * see docs/ARCHITECTURE.md) and this batch implements neither relationship
7
+ * derivation, real comparison, nor persistence. Batch 2 owns relationship
8
+ * derivation; Batch 3 owns `compareObservations()` and comparison
9
+ * persistence; Batch 4 owns CLI exposure.
10
+ *
11
+ * Comparison and observation are different evidence products: this module
12
+ * never reuses `ARTIFACT_KIND`/`SCHEMA_VERSION` from `./schema.js`, and
13
+ * `isValidComparisonArtifact` never delegates to `isValidObservationArtifact`.
14
+ */
15
+ import { PRODUCER_NAME, SCHEMA_VERSION as OBSERVATION_SCHEMA_VERSION } from './schema.js';
16
+ import type { Diagnostic } from './diagnostics.js';
17
+ import type { EvidenceReference, LayoutRelationshipGraph, PageLevelRelationshipKind, PairwiseRelationshipKind } from './relationships.js';
18
+ export declare const COMPARISON_ARTIFACT_KIND: "my-frontend-observer/comparison";
19
+ export declare const COMPARISON_SCHEMA_VERSION: "1.0.0";
20
+ /**
21
+ * Geometry tolerance is owned by domain/relationships.ts (the relationship
22
+ * derivation engine needs it directly, and that module must not import this
23
+ * one back - relationships.ts is the lower-level module). Re-exported here
24
+ * unchanged so every pre-Batch-2 consumer of these names from
25
+ * domain/comparison.ts keeps working.
26
+ */
27
+ export { GEOMETRY_TOLERANCE_DEFAULT_PX, GEOMETRY_TOLERANCE_MIN_PX, GEOMETRY_TOLERANCE_MAX_PX, isValidGeometryTolerancePx } from './relationships.js';
28
+ export declare const DEPENDENCY_PROPERTIES: readonly ["x", "y", "width", "height"];
29
+ export type DependencyProperty = (typeof DEPENDENCY_PROPERTIES)[number];
30
+ export declare const DEPENDENCY_DIRECTIONS: readonly ["increase", "decrease", "change", "unchanged"];
31
+ export type DependencyDirection = (typeof DEPENDENCY_DIRECTIONS)[number];
32
+ /** The observer never generates a dependency declaration from co-change; every declaration must explicitly identify that it was supplied externally. */
33
+ export declare const EXPECTED_DEPENDENCY_SOURCES: readonly ["explicit-config"];
34
+ export type ExpectedDependencySource = (typeof EXPECTED_DEPENDENCY_SOURCES)[number];
35
+ export interface DependencyTermDeclaration {
36
+ target: string;
37
+ property: DependencyProperty;
38
+ direction: DependencyDirection;
39
+ }
40
+ /** A bounded, explicitly-declared expected layout dependency (e.g. "navigation.width decreases -> workspace.width increases") - never inferred from co-change. */
41
+ export interface ExpectedDependencyDeclaration {
42
+ cause: DependencyTermDeclaration;
43
+ effect: DependencyTermDeclaration;
44
+ source: ExpectedDependencySource;
45
+ }
46
+ export declare function isValidExpectedDependencyDeclaration(value: unknown): value is ExpectedDependencyDeclaration;
47
+ /**
48
+ * Non-causal evaluation outcomes only - describes the relationship between a
49
+ * declared expectation and observed differences, never an implementation
50
+ * verdict (no PASS/FAIL/approved/regression/allowed/protected vocabulary).
51
+ */
52
+ export declare const DEPENDENCY_EVIDENCE_OUTCOMES: readonly ["consistent", "not-observed", "contradictory-to-declaration", "unavailable"];
53
+ export type DependencyEvidenceOutcome = (typeof DEPENDENCY_EVIDENCE_OUTCOMES)[number];
54
+ export interface ExpectedDependencyEvidence {
55
+ declaration: ExpectedDependencyDeclaration;
56
+ outcome: DependencyEvidenceOutcome;
57
+ supportingEvidence: EvidenceReference[];
58
+ }
59
+ export declare function isValidExpectedDependencyEvidence(value: unknown): value is ExpectedDependencyEvidence;
60
+ /** Deliberately excludes any v0.5+ contract/change-scope field (requestedChanges, protected, preserved, allowedChanges, passThreshold, failThreshold, baseline, approval). */
61
+ export interface ComparisonConfig {
62
+ geometryTolerancePx: number;
63
+ expectedDependencies?: ExpectedDependencyDeclaration[];
64
+ }
65
+ export declare function isValidComparisonConfig(value: unknown): value is ComparisonConfig;
66
+ export declare const COMPARABILITY_STATES: readonly ["comparable", "comparable-with-warnings", "incomparable"];
67
+ export type ComparabilityState = (typeof COMPARABILITY_STATES)[number];
68
+ /**
69
+ * Hard-incompatibility reason codes are `blocking` (force `incomparable`
70
+ * unless the repository can prove a dimension cannot be evaluated
71
+ * reliably); warning-only differences are `warning` (do not by themselves
72
+ * prevent useful page-level comparison); dimensions the observer does not
73
+ * yet model (theme/authenticated-state/application-state identity) are
74
+ * `unassessed` and never claimed identical without evidence.
75
+ */
76
+ export declare const COMPARABILITY_REASON_CODES: readonly ["artifact-kind-mismatch", "schema-version-mismatch", "page-url-mismatch", "viewport-mismatch", "viewport-unassessed", "scroll-scenario-mismatch", "browser-engine-mismatch", "producer-version-mismatch", "browser-version-mismatch", "target-set-mismatch", "target-locator-mismatch", "theme-mismatch", "theme-unassessed", "authenticated-state-mismatch", "authenticated-state-unassessed", "application-state-mismatch", "application-state-unassessed"];
77
+ export type ComparabilityReasonCode = (typeof COMPARABILITY_REASON_CODES)[number];
78
+ export type ComparabilityReasonSeverity = 'blocking' | 'warning' | 'unassessed';
79
+ /**
80
+ * v0.7 Prompt 4 additions: `viewport-unassessed` (a reference need not
81
+ * declare an applicable viewport - see externalReferenceApplicability.ts -
82
+ * whereas an ObservationArtifact's viewport is always present, so v0.4's own
83
+ * comparability never needed this variant before), `theme-mismatch`,
84
+ * `authenticated-state-mismatch`, `application-state-mismatch` (blocking -
85
+ * these three dimensions are now assessed, not merely unassessed, whenever
86
+ * explicit state is present on both sides being compared - see
87
+ * comparisonEngine.ts#assessOptionalComparabilityDimension). The
88
+ * corresponding `-unassessed` variants are unchanged and still apply
89
+ * whenever explicit state is missing from either side.
90
+ */
91
+ export declare const COMPARABILITY_REASON_SEVERITY: Record<ComparabilityReasonCode, ComparabilityReasonSeverity>;
92
+ export interface ComparabilityReason {
93
+ code: ComparabilityReasonCode;
94
+ severity: ComparabilityReasonSeverity;
95
+ message: string;
96
+ /**
97
+ * v0.7 Prompt 4 addition (additive, optional - existing v0.4
98
+ * before/after-observation reasons never set these; they already embed
99
+ * both values in `message`). Used by reference/candidate compatibility
100
+ * reasons (externalReferenceCompatibility.ts) to expose the two compared
101
+ * values structurally, not just as prose - e.g. `"one-dark"`/`"one-light"`
102
+ * for a theme mismatch, or `"480x620"` for a viewport dimension.
103
+ */
104
+ referenceValue?: string;
105
+ candidateValue?: string;
106
+ }
107
+ export interface ComparabilityResult {
108
+ state: ComparabilityState;
109
+ reasons: ComparabilityReason[];
110
+ }
111
+ /** `incomparable` requires at least one `blocking` reason; a `blocking` reason forces `incomparable` - the two invariants are enforced together. */
112
+ export declare function isValidComparabilityResult(value: unknown): value is ComparabilityResult;
113
+ export declare const TARGET_CONFIGURATION_CHANGE_KINDS: readonly ["added", "removed", "locator-changed"];
114
+ export type TargetConfigurationChangeKind = (typeof TARGET_CONFIGURATION_CHANGE_KINDS)[number];
115
+ export interface TargetConfigurationChange {
116
+ kind: TargetConfigurationChangeKind;
117
+ target: string;
118
+ }
119
+ export declare function isValidTargetConfigurationChange(value: unknown): value is TargetConfigurationChange;
120
+ export declare const DIFFERENCE_KINDS: readonly ["appeared", "disappeared", "moved", "resized", "visibility-changed", "clipping-changed", "containment-changed", "horizontal-overflow-changed", "vertical-overflow-changed", "page-size-changed", "scroll-owner-changed", "relative-position-changed", "relationship-changed"];
121
+ export type DifferenceKind = (typeof DIFFERENCE_KINDS)[number];
122
+ export type ComparisonDifferenceSubject = {
123
+ type: 'target';
124
+ target: string;
125
+ } | {
126
+ type: 'relationship';
127
+ kind: PairwiseRelationshipKind | PageLevelRelationshipKind;
128
+ subjectTarget?: string;
129
+ relatedTarget?: string;
130
+ } | {
131
+ type: 'page';
132
+ };
133
+ /**
134
+ * Bounded structured difference record - never prose-only, never a
135
+ * severity/pass-fail score (there is no severity model yet). `before`/
136
+ * `after`/`delta` are intentionally untyped here: their shape depends on
137
+ * `kind` (e.g. numeric geometry for `moved`/`resized`, boolean for
138
+ * `visibility-changed`) and is validated at the point of construction by
139
+ * whichever batch actually produces these records.
140
+ */
141
+ export interface ComparisonDifference {
142
+ kind: DifferenceKind;
143
+ subject: ComparisonDifferenceSubject;
144
+ before: unknown;
145
+ after: unknown;
146
+ delta?: unknown;
147
+ classification: string;
148
+ beforeObservationId: string;
149
+ afterObservationId: string;
150
+ evidence: EvidenceReference[];
151
+ }
152
+ export declare function isValidComparisonDifference(value: unknown): value is ComparisonDifference;
153
+ /** One before/after transition of a single derived relationship - distinct from `ComparisonDifference` so the relationship graph's own vocabulary stays authoritative. `'unavailable'` covers a pair/page relationship that could not be evaluated on one side. */
154
+ export interface RelationshipChangeRecord {
155
+ scope: 'pairwise' | 'page';
156
+ kind: PairwiseRelationshipKind | PageLevelRelationshipKind;
157
+ subjectTarget?: string;
158
+ relatedTarget?: string;
159
+ before: PairwiseRelationshipKind | PageLevelRelationshipKind | 'unavailable';
160
+ after: PairwiseRelationshipKind | PageLevelRelationshipKind | 'unavailable';
161
+ beforeObservationId: string;
162
+ afterObservationId: string;
163
+ }
164
+ /**
165
+ * Enough logical identity to trace a comparison back to its authoritative
166
+ * source observations without embedding the full ObservationArtifact,
167
+ * copying screenshot bytes, or persisting a filesystem path as semantic
168
+ * identity.
169
+ */
170
+ export interface ComparisonSourceObservationReference {
171
+ observationId: string;
172
+ requestId: string;
173
+ producer: {
174
+ name: typeof PRODUCER_NAME;
175
+ version: string;
176
+ };
177
+ observationSchemaVersion: typeof OBSERVATION_SCHEMA_VERSION;
178
+ screenshot: {
179
+ path: string;
180
+ };
181
+ }
182
+ export declare function isValidComparisonSourceObservationReference(value: unknown): value is ComparisonSourceObservationReference;
183
+ /** Comparison is ordered: `before`/`after` are distinct fields (never a swappable pair) so `compare(A, B) !== compare(B, A)` for both identity and difference direction. */
184
+ export interface ComparisonArtifact {
185
+ artifactKind: typeof COMPARISON_ARTIFACT_KIND;
186
+ schemaVersion: typeof COMPARISON_SCHEMA_VERSION;
187
+ comparisonId: string;
188
+ comparisonRequestId: string;
189
+ producer: {
190
+ name: typeof PRODUCER_NAME;
191
+ version: string;
192
+ };
193
+ provenance: {
194
+ comparedAt: string;
195
+ };
196
+ before: ComparisonSourceObservationReference;
197
+ after: ComparisonSourceObservationReference;
198
+ config: ComparisonConfig;
199
+ comparability: ComparabilityResult;
200
+ configurationChanges: TargetConfigurationChange[];
201
+ relationshipsBefore: LayoutRelationshipGraph;
202
+ relationshipsAfter: LayoutRelationshipGraph;
203
+ differences: ComparisonDifference[];
204
+ relationshipChanges: RelationshipChangeRecord[];
205
+ expectedDependencyEvidence: ExpectedDependencyEvidence[];
206
+ diagnostics: Diagnostic[];
207
+ limits: {
208
+ truncated: boolean;
209
+ omittedFields: string[];
210
+ omittedTargetPairs: string[];
211
+ };
212
+ }
213
+ export type ComparisonSchemaValidationResult = {
214
+ valid: true;
215
+ } | {
216
+ valid: false;
217
+ reason: string;
218
+ };
219
+ /** Structural validator for the frozen ComparisonArtifact contract. Never delegates to `isValidObservationArtifact` - comparison and observation are different artifact kinds/schemas. */
220
+ export declare function isValidComparisonArtifact(value: unknown): ComparisonSchemaValidationResult;
@@ -0,0 +1,350 @@
1
+ /**
2
+ * v0.4 Batch 1 comparison contract. Frozen here as pure
3
+ * types/constants/structural validators only - comparison is downstream of
4
+ * observation (real Chromium -> ObservationArtifact -> relationship
5
+ * derivation -> comparability analysis -> comparison -> ComparisonArtifact,
6
+ * see docs/ARCHITECTURE.md) and this batch implements neither relationship
7
+ * derivation, real comparison, nor persistence. Batch 2 owns relationship
8
+ * derivation; Batch 3 owns `compareObservations()` and comparison
9
+ * persistence; Batch 4 owns CLI exposure.
10
+ *
11
+ * Comparison and observation are different evidence products: this module
12
+ * never reuses `ARTIFACT_KIND`/`SCHEMA_VERSION` from `./schema.js`, and
13
+ * `isValidComparisonArtifact` never delegates to `isValidObservationArtifact`.
14
+ */
15
+ import { PRODUCER_NAME, SCHEMA_VERSION as OBSERVATION_SCHEMA_VERSION } from './schema.js';
16
+ import { DIAGNOSTIC_CODES, DIAGNOSTIC_SEVERITY } from './diagnostics.js';
17
+ import { PAGE_LEVEL_RELATIONSHIP_KINDS, PAIRWISE_RELATIONSHIP_KINDS, isValidEvidenceReference, isValidLayoutRelationshipGraph, isValidGeometryTolerancePx, } from './relationships.js';
18
+ function isPlainObject(value) {
19
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
20
+ }
21
+ function isEvidenceReferenceArray(value) {
22
+ return Array.isArray(value) && value.every((entry) => isValidEvidenceReference(entry));
23
+ }
24
+ export const COMPARISON_ARTIFACT_KIND = 'my-frontend-observer/comparison';
25
+ export const COMPARISON_SCHEMA_VERSION = '1.0.0';
26
+ /**
27
+ * Geometry tolerance is owned by domain/relationships.ts (the relationship
28
+ * derivation engine needs it directly, and that module must not import this
29
+ * one back - relationships.ts is the lower-level module). Re-exported here
30
+ * unchanged so every pre-Batch-2 consumer of these names from
31
+ * domain/comparison.ts keeps working.
32
+ */
33
+ export { GEOMETRY_TOLERANCE_DEFAULT_PX, GEOMETRY_TOLERANCE_MIN_PX, GEOMETRY_TOLERANCE_MAX_PX, isValidGeometryTolerancePx } from './relationships.js';
34
+ // --- Expected dependency declarations (explicit, non-causal) ---------------
35
+ export const DEPENDENCY_PROPERTIES = ['x', 'y', 'width', 'height'];
36
+ export const DEPENDENCY_DIRECTIONS = ['increase', 'decrease', 'change', 'unchanged'];
37
+ /** The observer never generates a dependency declaration from co-change; every declaration must explicitly identify that it was supplied externally. */
38
+ export const EXPECTED_DEPENDENCY_SOURCES = ['explicit-config'];
39
+ const DEPENDENCY_TARGET_NAME_RE = /^[A-Za-z0-9_-]{1,64}$/;
40
+ function isValidDependencyTermDeclaration(value) {
41
+ if (!isPlainObject(value))
42
+ return false;
43
+ if (typeof value.target !== 'string' || !DEPENDENCY_TARGET_NAME_RE.test(value.target))
44
+ return false;
45
+ if (typeof value.property !== 'string' || !DEPENDENCY_PROPERTIES.includes(value.property))
46
+ return false;
47
+ return typeof value.direction === 'string' && DEPENDENCY_DIRECTIONS.includes(value.direction);
48
+ }
49
+ export function isValidExpectedDependencyDeclaration(value) {
50
+ if (!isPlainObject(value))
51
+ return false;
52
+ if (!isValidDependencyTermDeclaration(value.cause) || !isValidDependencyTermDeclaration(value.effect))
53
+ return false;
54
+ return typeof value.source === 'string' && EXPECTED_DEPENDENCY_SOURCES.includes(value.source);
55
+ }
56
+ /**
57
+ * Non-causal evaluation outcomes only - describes the relationship between a
58
+ * declared expectation and observed differences, never an implementation
59
+ * verdict (no PASS/FAIL/approved/regression/allowed/protected vocabulary).
60
+ */
61
+ export const DEPENDENCY_EVIDENCE_OUTCOMES = ['consistent', 'not-observed', 'contradictory-to-declaration', 'unavailable'];
62
+ export function isValidExpectedDependencyEvidence(value) {
63
+ if (!isPlainObject(value))
64
+ return false;
65
+ if (!isValidExpectedDependencyDeclaration(value.declaration))
66
+ return false;
67
+ if (typeof value.outcome !== 'string' || !DEPENDENCY_EVIDENCE_OUTCOMES.includes(value.outcome))
68
+ return false;
69
+ return isEvidenceReferenceArray(value.supportingEvidence);
70
+ }
71
+ const COMPARISON_CONFIG_KEYS = ['geometryTolerancePx', 'expectedDependencies'];
72
+ export function isValidComparisonConfig(value) {
73
+ if (!isPlainObject(value))
74
+ return false;
75
+ if (!Object.keys(value).every((key) => COMPARISON_CONFIG_KEYS.includes(key)))
76
+ return false;
77
+ if (!isValidGeometryTolerancePx(value.geometryTolerancePx))
78
+ return false;
79
+ if ('expectedDependencies' in value && value.expectedDependencies !== undefined) {
80
+ if (!Array.isArray(value.expectedDependencies) || !value.expectedDependencies.every((d) => isValidExpectedDependencyDeclaration(d))) {
81
+ return false;
82
+ }
83
+ }
84
+ return true;
85
+ }
86
+ // --- Comparability -----------------------------------------------------------
87
+ export const COMPARABILITY_STATES = ['comparable', 'comparable-with-warnings', 'incomparable'];
88
+ /**
89
+ * Hard-incompatibility reason codes are `blocking` (force `incomparable`
90
+ * unless the repository can prove a dimension cannot be evaluated
91
+ * reliably); warning-only differences are `warning` (do not by themselves
92
+ * prevent useful page-level comparison); dimensions the observer does not
93
+ * yet model (theme/authenticated-state/application-state identity) are
94
+ * `unassessed` and never claimed identical without evidence.
95
+ */
96
+ export const COMPARABILITY_REASON_CODES = [
97
+ 'artifact-kind-mismatch',
98
+ 'schema-version-mismatch',
99
+ 'page-url-mismatch',
100
+ 'viewport-mismatch',
101
+ 'viewport-unassessed',
102
+ 'scroll-scenario-mismatch',
103
+ 'browser-engine-mismatch',
104
+ 'producer-version-mismatch',
105
+ 'browser-version-mismatch',
106
+ 'target-set-mismatch',
107
+ 'target-locator-mismatch',
108
+ 'theme-mismatch',
109
+ 'theme-unassessed',
110
+ 'authenticated-state-mismatch',
111
+ 'authenticated-state-unassessed',
112
+ 'application-state-mismatch',
113
+ 'application-state-unassessed',
114
+ ];
115
+ /**
116
+ * v0.7 Prompt 4 additions: `viewport-unassessed` (a reference need not
117
+ * declare an applicable viewport - see externalReferenceApplicability.ts -
118
+ * whereas an ObservationArtifact's viewport is always present, so v0.4's own
119
+ * comparability never needed this variant before), `theme-mismatch`,
120
+ * `authenticated-state-mismatch`, `application-state-mismatch` (blocking -
121
+ * these three dimensions are now assessed, not merely unassessed, whenever
122
+ * explicit state is present on both sides being compared - see
123
+ * comparisonEngine.ts#assessOptionalComparabilityDimension). The
124
+ * corresponding `-unassessed` variants are unchanged and still apply
125
+ * whenever explicit state is missing from either side.
126
+ */
127
+ export const COMPARABILITY_REASON_SEVERITY = {
128
+ 'artifact-kind-mismatch': 'blocking',
129
+ 'schema-version-mismatch': 'blocking',
130
+ 'page-url-mismatch': 'blocking',
131
+ 'viewport-mismatch': 'blocking',
132
+ 'viewport-unassessed': 'unassessed',
133
+ 'scroll-scenario-mismatch': 'blocking',
134
+ 'browser-engine-mismatch': 'blocking',
135
+ 'producer-version-mismatch': 'warning',
136
+ 'browser-version-mismatch': 'warning',
137
+ 'target-set-mismatch': 'warning',
138
+ 'target-locator-mismatch': 'warning',
139
+ 'theme-mismatch': 'blocking',
140
+ 'theme-unassessed': 'unassessed',
141
+ 'authenticated-state-mismatch': 'blocking',
142
+ 'authenticated-state-unassessed': 'unassessed',
143
+ 'application-state-mismatch': 'blocking',
144
+ 'application-state-unassessed': 'unassessed',
145
+ };
146
+ function isValidComparabilityReason(value) {
147
+ if (!isPlainObject(value))
148
+ return false;
149
+ const code = value.code;
150
+ if (typeof code !== 'string' || !COMPARABILITY_REASON_CODES.includes(code))
151
+ return false;
152
+ if (value.severity !== COMPARABILITY_REASON_SEVERITY[code])
153
+ return false;
154
+ if (typeof value.message !== 'string')
155
+ return false;
156
+ if ('referenceValue' in value && value.referenceValue !== undefined && typeof value.referenceValue !== 'string')
157
+ return false;
158
+ if ('candidateValue' in value && value.candidateValue !== undefined && typeof value.candidateValue !== 'string')
159
+ return false;
160
+ return true;
161
+ }
162
+ /** `incomparable` requires at least one `blocking` reason; a `blocking` reason forces `incomparable` - the two invariants are enforced together. */
163
+ export function isValidComparabilityResult(value) {
164
+ if (!isPlainObject(value))
165
+ return false;
166
+ if (typeof value.state !== 'string' || !COMPARABILITY_STATES.includes(value.state))
167
+ return false;
168
+ if (!Array.isArray(value.reasons) || !value.reasons.every((r) => isValidComparabilityReason(r)))
169
+ return false;
170
+ const reasons = value.reasons;
171
+ const hasBlocking = reasons.some((r) => r.severity === 'blocking');
172
+ if (value.state === 'incomparable' && !hasBlocking)
173
+ return false;
174
+ if (value.state !== 'incomparable' && hasBlocking)
175
+ return false;
176
+ return true;
177
+ }
178
+ // --- Target-configuration change (never conflated with appeared/disappeared) --
179
+ export const TARGET_CONFIGURATION_CHANGE_KINDS = ['added', 'removed', 'locator-changed'];
180
+ export function isValidTargetConfigurationChange(value) {
181
+ if (!isPlainObject(value))
182
+ return false;
183
+ if (typeof value.kind !== 'string' || !TARGET_CONFIGURATION_CHANGE_KINDS.includes(value.kind))
184
+ return false;
185
+ return typeof value.target === 'string' && value.target.length > 0;
186
+ }
187
+ // --- Difference vocabulary ---------------------------------------------------
188
+ export const DIFFERENCE_KINDS = [
189
+ 'appeared',
190
+ 'disappeared',
191
+ 'moved',
192
+ 'resized',
193
+ 'visibility-changed',
194
+ 'clipping-changed',
195
+ 'containment-changed',
196
+ 'horizontal-overflow-changed',
197
+ 'vertical-overflow-changed',
198
+ 'page-size-changed',
199
+ 'scroll-owner-changed',
200
+ 'relative-position-changed',
201
+ 'relationship-changed',
202
+ ];
203
+ function isValidComparisonDifferenceSubject(value) {
204
+ if (!isPlainObject(value))
205
+ return false;
206
+ if (value.type === 'target')
207
+ return typeof value.target === 'string' && value.target.length > 0;
208
+ if (value.type === 'page')
209
+ return Object.keys(value).length === 1;
210
+ if (value.type === 'relationship') {
211
+ const allKinds = [...PAIRWISE_RELATIONSHIP_KINDS, ...PAGE_LEVEL_RELATIONSHIP_KINDS];
212
+ if (typeof value.kind !== 'string' || !allKinds.includes(value.kind))
213
+ return false;
214
+ if ('subjectTarget' in value && value.subjectTarget !== undefined && typeof value.subjectTarget !== 'string')
215
+ return false;
216
+ if ('relatedTarget' in value && value.relatedTarget !== undefined && typeof value.relatedTarget !== 'string')
217
+ return false;
218
+ return true;
219
+ }
220
+ return false;
221
+ }
222
+ export function isValidComparisonDifference(value) {
223
+ if (!isPlainObject(value))
224
+ return false;
225
+ if (typeof value.kind !== 'string' || !DIFFERENCE_KINDS.includes(value.kind))
226
+ return false;
227
+ if (!isValidComparisonDifferenceSubject(value.subject))
228
+ return false;
229
+ if (!('before' in value) || !('after' in value))
230
+ return false;
231
+ if (typeof value.classification !== 'string' || value.classification.length === 0)
232
+ return false;
233
+ if (typeof value.beforeObservationId !== 'string' || value.beforeObservationId.length === 0)
234
+ return false;
235
+ if (typeof value.afterObservationId !== 'string' || value.afterObservationId.length === 0)
236
+ return false;
237
+ return isEvidenceReferenceArray(value.evidence);
238
+ }
239
+ function isValidRelationshipChangeRecord(value) {
240
+ if (!isPlainObject(value))
241
+ return false;
242
+ if (value.scope !== 'pairwise' && value.scope !== 'page')
243
+ return false;
244
+ const allKinds = [...PAIRWISE_RELATIONSHIP_KINDS, ...PAGE_LEVEL_RELATIONSHIP_KINDS];
245
+ const allValues = [...allKinds, 'unavailable'];
246
+ if (typeof value.kind !== 'string' || !allKinds.includes(value.kind))
247
+ return false;
248
+ if (value.scope === 'pairwise') {
249
+ if (typeof value.subjectTarget !== 'string' || value.subjectTarget.length === 0)
250
+ return false;
251
+ if (typeof value.relatedTarget !== 'string' || value.relatedTarget.length === 0)
252
+ return false;
253
+ }
254
+ else if ('subjectTarget' in value || 'relatedTarget' in value) {
255
+ return false;
256
+ }
257
+ if (typeof value.before !== 'string' || !allValues.includes(value.before))
258
+ return false;
259
+ if (typeof value.after !== 'string' || !allValues.includes(value.after))
260
+ return false;
261
+ if (typeof value.beforeObservationId !== 'string' || value.beforeObservationId.length === 0)
262
+ return false;
263
+ return typeof value.afterObservationId === 'string' && value.afterObservationId.length > 0;
264
+ }
265
+ export function isValidComparisonSourceObservationReference(value) {
266
+ if (!isPlainObject(value))
267
+ return false;
268
+ if (typeof value.observationId !== 'string' || value.observationId.length === 0)
269
+ return false;
270
+ if (typeof value.requestId !== 'string' || value.requestId.length === 0)
271
+ return false;
272
+ if (!isPlainObject(value.producer) || value.producer.name !== PRODUCER_NAME || typeof value.producer.version !== 'string' || value.producer.version.length === 0) {
273
+ return false;
274
+ }
275
+ if (value.observationSchemaVersion !== OBSERVATION_SCHEMA_VERSION)
276
+ return false;
277
+ return isPlainObject(value.screenshot) && typeof value.screenshot.path === 'string' && value.screenshot.path.length > 0;
278
+ }
279
+ function isValidDiagnostic(value) {
280
+ if (!isPlainObject(value))
281
+ return false;
282
+ const code = value.code;
283
+ if (typeof code !== 'string' || !DIAGNOSTIC_CODES.includes(code))
284
+ return false;
285
+ if (value.severity !== DIAGNOSTIC_SEVERITY[code])
286
+ return false;
287
+ if (typeof value.message !== 'string')
288
+ return false;
289
+ if ('targetName' in value && value.targetName !== undefined && typeof value.targetName !== 'string')
290
+ return false;
291
+ return true;
292
+ }
293
+ /** Structural validator for the frozen ComparisonArtifact contract. Never delegates to `isValidObservationArtifact` - comparison and observation are different artifact kinds/schemas. */
294
+ export function isValidComparisonArtifact(value) {
295
+ if (!isPlainObject(value))
296
+ return { valid: false, reason: 'artifact must be an object' };
297
+ if (value.artifactKind !== COMPARISON_ARTIFACT_KIND)
298
+ return { valid: false, reason: 'artifactKind mismatch' };
299
+ if (value.schemaVersion !== COMPARISON_SCHEMA_VERSION)
300
+ return { valid: false, reason: 'schemaVersion mismatch' };
301
+ if (typeof value.comparisonId !== 'string' || value.comparisonId.length === 0)
302
+ return { valid: false, reason: 'comparisonId must be a non-empty string' };
303
+ if (typeof value.comparisonRequestId !== 'string' || value.comparisonRequestId.length === 0) {
304
+ return { valid: false, reason: 'comparisonRequestId must be a non-empty string' };
305
+ }
306
+ if (!isPlainObject(value.producer) || value.producer.name !== PRODUCER_NAME || typeof value.producer.version !== 'string' || value.producer.version.length === 0) {
307
+ return { valid: false, reason: 'producer must be { name: "my-frontend-observer", version: string }' };
308
+ }
309
+ if (!isPlainObject(value.provenance) || typeof value.provenance.comparedAt !== 'string' || value.provenance.comparedAt.length === 0) {
310
+ return { valid: false, reason: 'provenance.comparedAt must be a non-empty string' };
311
+ }
312
+ if (!isValidComparisonSourceObservationReference(value.before))
313
+ return { valid: false, reason: 'before source observation reference is invalid' };
314
+ if (!isValidComparisonSourceObservationReference(value.after))
315
+ return { valid: false, reason: 'after source observation reference is invalid' };
316
+ if (!isValidComparisonConfig(value.config))
317
+ return { valid: false, reason: 'config is invalid' };
318
+ if (!isValidComparabilityResult(value.comparability))
319
+ return { valid: false, reason: 'comparability is invalid' };
320
+ if (!Array.isArray(value.configurationChanges) || !value.configurationChanges.every((c) => isValidTargetConfigurationChange(c))) {
321
+ return { valid: false, reason: 'configurationChanges must be an array of valid TargetConfigurationChange values' };
322
+ }
323
+ if (!isValidLayoutRelationshipGraph(value.relationshipsBefore))
324
+ return { valid: false, reason: 'relationshipsBefore is invalid' };
325
+ if (!isValidLayoutRelationshipGraph(value.relationshipsAfter))
326
+ return { valid: false, reason: 'relationshipsAfter is invalid' };
327
+ if (!Array.isArray(value.differences) || !value.differences.every((d) => isValidComparisonDifference(d))) {
328
+ return { valid: false, reason: 'differences must be an array of valid ComparisonDifference values' };
329
+ }
330
+ if (!Array.isArray(value.relationshipChanges) || !value.relationshipChanges.every((r) => isValidRelationshipChangeRecord(r))) {
331
+ return { valid: false, reason: 'relationshipChanges must be an array of valid RelationshipChangeRecord values' };
332
+ }
333
+ if (!Array.isArray(value.expectedDependencyEvidence) || !value.expectedDependencyEvidence.every((e) => isValidExpectedDependencyEvidence(e))) {
334
+ return { valid: false, reason: 'expectedDependencyEvidence must be an array of valid ExpectedDependencyEvidence values' };
335
+ }
336
+ if (!Array.isArray(value.diagnostics) || !value.diagnostics.every((d) => isValidDiagnostic(d))) {
337
+ return { valid: false, reason: 'diagnostics must be an array of valid Diagnostic values' };
338
+ }
339
+ const limits = value.limits;
340
+ if (!isPlainObject(limits) ||
341
+ typeof limits.truncated !== 'boolean' ||
342
+ !Array.isArray(limits.omittedFields) ||
343
+ !limits.omittedFields.every((f) => typeof f === 'string') ||
344
+ !Array.isArray(limits.omittedTargetPairs) ||
345
+ !limits.omittedTargetPairs.every((f) => typeof f === 'string')) {
346
+ return { valid: false, reason: 'limits must be { truncated: boolean; omittedFields: string[]; omittedTargetPairs: string[] }' };
347
+ }
348
+ return { valid: true };
349
+ }
350
+ //# sourceMappingURL=comparison.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.js","sourceRoot":"","sources":["../../src/domain/comparison.ts"],"names":[],"mappings":"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"}