@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,1049 @@
1
+ # Current State
2
+
3
+ v0.8.1 is released and published as `@dailephd/my-frontend-observer@0.8.1`.
4
+ Project aliases, `init`, `capture`, project-aware `view`, and `check`
5
+ orchestration are implemented and MIT licensed.
6
+
7
+ The project is published at package version `0.8.1` (roadmap v0.8.1,
8
+ Interactive Local Observation Viewer; observation schema `1.2.0`; comparison
9
+ schema `1.0.0`; frontend contract schema `1.0.0`; evaluation artifact schema
10
+ `1.0.0`; bounded-agent-context schema `1.0.0`; external-reference schema
11
+ `1.0.0` - no schema version changed for v0.8) - see "v0.8 status" below for
12
+ the final, complete v0.8 state.
13
+
14
+ v0.8 (Interactive Local Observation Viewer) is fully implemented, tested,
15
+ formally cross-platform/security validated, and released. All eight v0.8
16
+ implementation batches, the hardened documentation/implementation-
17
+ completeness audit, and formal pre-release readiness (Windows/Linux/macOS
18
+ cross-platform packed-candidate validation, security audit, code-rot audit)
19
+ all passed - see
20
+ `docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md`
21
+ and
22
+ `docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md`.
23
+
24
+ ## Greenfield foundation established
25
+
26
+ The retained repository contains:
27
+
28
+ - Node.js 24+ and TypeScript ESM package configuration;
29
+ - TypeScript build and typecheck configuration;
30
+ - ESLint configuration;
31
+ - a Vitest runner configured to report honestly when no tests exist;
32
+ - a safe `dist/` clean script;
33
+ - documentation validation;
34
+ - package allowlisting;
35
+ - `src/cli.ts` and `src/index.ts`, the package/library entry points originally
36
+ established by the selected TypeScript CLI starter profile;
37
+ - complete repository-local Project Description, Project Milestones, ROADMAP,
38
+ and standardized documentation.
39
+
40
+ The package bin (`src/cli.ts`) now exposes the real current public CLI
41
+ surface described below - the five commands released through `0.6.0`
42
+ (`observe`, `compare`, `approve-baseline`, `save-change-contract`,
43
+ `evaluate-contract`) plus three additional commands released as part of
44
+ `0.7.0` (`import-reference`, `approve-reference`,
45
+ `evaluate-reference-fidelity` - see "v0.7 Prompt 1/6 status" below) - while
46
+ remaining a thin parsing/dispatch/presentation boundary; it is no longer the
47
+ not-implemented placeholder.
48
+
49
+ ## v0.1 progress (Batch 1–6; implemented and released as 0.1.0)
50
+
51
+ - Batch 1 froze and implemented the observation request contract, evidence
52
+ states/sources, schema 1.0.0, observation/request identity, bounded
53
+ readiness semantics, diagnostic/completion semantics, browser/network
54
+ safety policy, and portable path normalization, with 40 passing unit tests.
55
+ - Batch 2 added a Playwright Chromium browser boundary (`src/browser/`) and a
56
+ minimal application seam (`src/application/`) that launches a real
57
+ Chromium browser, enforces the Batch 1 loopback/redirect/subresource
58
+ safety policy at runtime, applies the requested viewport, waits for the
59
+ approved bounded readiness condition, captures a real viewport PNG
60
+ screenshot, returns observer-owned browser provenance, and reliably closes
61
+ the browser on every exit path. Deterministic local HTTP fixtures live
62
+ under `tests/fixtures/`; the real-Chromium integration tests live under
63
+ `tests/browser/` and run via `npm run test:browser` (kept separate from
64
+ `npm test`, which continues to run only the fast unit suite).
65
+ - Batch 3 extended the same single browser observation (no second Chromium
66
+ lifecycle) to also capture the v0.1 minimum page evidence (requested/final
67
+ URL, title, viewport, device pixel ratio, document scroll/client
68
+ dimensions plus a derived overall document width/height, window scroll
69
+ position) and explicit-target evidence (tag, geometry, computed
70
+ display/position/overflow, scroll/client metrics, initial visibility, and
71
+ role/name where the browser reliably exposes them) for every configured
72
+ CSS target, honoring missing/ambiguous-target semantics honestly. This
73
+ additively extended `src/domain/schema.ts`'s `TargetEvidenceRecord` (new
74
+ `tag`/`layout`/`visibility`/`semantics` categories, and concrete shapes for
75
+ `geometry`/`style`) and `BrowserCaptureResult`; schema version stays
76
+ `1.0.0`.
77
+ - Batch 4 added a portable, atomic observation-artifact writer
78
+ (`src/artifacts/artifactWriter.ts`) and a minimal application persistence
79
+ seam (`src/application/observationPersistence.ts`) that assembles the
80
+ frozen `ObservationArtifact` shape from a Batch 2/3 browser capture (using
81
+ the existing Batch 1 identity/completion functions verbatim, no new logic
82
+ invented) and writes it to `<outputLocation>/<observationId>/manifest.json`
83
+ plus `screenshot.png`. Writing happens in a sibling temporary directory
84
+ first (screenshot before manifest), finalized only via one atomic
85
+ directory rename, so a consumer can never observe a partially-written
86
+ artifact under its real name; a filesystem failure anywhere in that
87
+ sequence reports the existing `artifact-write-failure` diagnostic and
88
+ leaves no completed artifact behind. Internal artifact references
89
+ (`screenshot.png`) are relative/portable; the observation's logical
90
+ identity is the existing Batch 1 `observationId`, not its filesystem
91
+ location. The writer has no Playwright dependency and does not modify the
92
+ observed target. Schema stays `1.0.0`.
93
+ - Batch 5 wired the existing owners into the real user-facing workflow:
94
+ `src/cli.ts` implements a real `observe` command (thin argument
95
+ parsing/output only - no Chromium, safety, evidence, or filesystem logic
96
+ of its own), and `src/application/observationPersistence.ts` gained one
97
+ `observe()` use case that runs the existing browser capture exactly once
98
+ and, only on success, persists it exactly once through the existing
99
+ artifact writer. CLI syntax errors (malformed `WIDTHxHEIGHT`, malformed
100
+ `id=selector`) are rejected before any browser launches; all domain bounds
101
+ and safety decisions still come from the existing Batch 1 request
102
+ validator and safety policy, not CLI-local logic. A successfully
103
+ persisted observation - including one whose completion state honestly
104
+ reports `partial` - exits `0`; invalid syntax/request, an unpersistable
105
+ browser failure, or a failed artifact write exits nonzero. Package version
106
+ is `0.1.0`; schema stays `1.0.0`.
107
+
108
+ So: `my-frontend-observer observe --url ... --viewport ... --target ...
109
+ --output ...` is a real, working, source-checkout command that launches
110
+ Chromium, produces bounded runtime evidence, and writes a portable local
111
+ artifact - proven both via `runCli()`-level tests and a built
112
+ `node dist/cli.js observe ...` smoke run against the deterministic fixture.
113
+
114
+ Batch 6 closed the remaining v0.1 coverage gap (a genuine real-Chromium
115
+ navigation failure - connection reset mid-navigation - distinct from a
116
+ readiness timeout or a pre-launch safety rejection) and proved the packaged
117
+ form of the implementation works independent of the source checkout: the
118
+ real `npm pack` tarball, installed fresh in a clean temporary consumer
119
+ directory outside the repository, exposes its `my-frontend-observer` bin,
120
+ reports the correct version/help text, installs its own Chromium binary via
121
+ the consumer-local Playwright toolchain, and performs a real observation
122
+ against a disposable local HTTP target - producing a `manifest.json` +
123
+ `screenshot.png` artifact identical in shape to the source-checkout result,
124
+ without modifying the observed target, and with the temporary consumer/
125
+ tarball/output fully cleaned up afterward. Documentation across the
126
+ repository was reconciled to this implemented state as part of the same
127
+ batch.
128
+
129
+ ## v0.1 status
130
+
131
+ `v0.1.0` was the first published release (see `CHANGELOG.md` and
132
+ `docs/RELEASE.md`). Everything above this section describes that released
133
+ state, still present unchanged in `v0.2.0`.
134
+
135
+ ## v0.2 status (Stable Semantic Targets and Region Identity) - released as 0.2.0
136
+
137
+ v0.2 is implemented and released as package version `0.2.0`, observation
138
+ schema `1.1.0`.
139
+
140
+ - **Canonical target/locator model.** Each configured target has a stable
141
+ observer-owned `name` plus an ordered, bounded `locators` array
142
+ (`src/request/request.ts#TargetLocator`, `NamedTarget`). This identity is
143
+ distinct from both the browser locator that resolves it and any
144
+ source-code symbol. The legacy `{name, selector}` shape remains accepted
145
+ and normalizes to a one-item `css` locator, so every v0.1 CLI invocation
146
+ continues to work unchanged. Bounds: 20 targets max, 5 locators per
147
+ target max (unchanged/new respectively from v0.1's target count bound).
148
+ - **Six frozen locator kinds, all resolved against real Chromium**: `role`
149
+ (Playwright's accessibility role/name locator, exact name matching),
150
+ `id` and `data-attribute` (exact CSS attribute-equals matching that never
151
+ reinterprets the configured value as selector syntax), `semantic-element`
152
+ (a frozen structural tag set: `header`, `nav`, `main`, `footer`,
153
+ `article`, `section`, `aside`, `form`, `dialog`), `css` (unchanged v0.1
154
+ behavior), and `text` (exact match only, no substring/fuzzy matching).
155
+ Locator order is the fallback order: 0 matches tries the next locator; 1
156
+ match selects and stops; more than 1 match is ambiguous and stops (never
157
+ falls through); an unevaluable locator is unavailable and stops (never
158
+ falls through). All six kinds converge on one measurement path
159
+ (`src/browser/evidenceCapture.ts#captureResolvedTargetRecord`) - locator
160
+ strategy never changes the resulting evidence shape.
161
+ - **Semantic region evidence**, added to every resolved target alongside
162
+ the existing v0.1 role/name capture: `semanticState` (a first bounded
163
+ family of `disabled`/`expanded`/`checked`/`selected`/`pressed`/`current`,
164
+ read from the element's own native/ARIA properties so an explicit `false`
165
+ is always distinguishable from "not applicable"; `checked`/`pressed` also
166
+ support the browser's `'mixed'` value); `landmark` (derived only from the
167
+ already-captured browser-exposed role - never from locator kind or HTML
168
+ tag - against the standard landmark role set `banner`/`navigation`/
169
+ `main`/`complementary`/`contentinfo`/`form`/`region`/`search`); and
170
+ `containment` (bounded DOM containment checked only among the other
171
+ explicitly configured targets in the same observation, in configured
172
+ order - `available`/`partial`/`unavailable`, never a layout/spatial-
173
+ relationship graph).
174
+ - **Proven identity stability**: the same target configuration produces the
175
+ same `requestId` across repeated observations (with a fresh
176
+ `observationId` every time); changing a target's locator strategy while
177
+ keeping its stable name changes `requestId` but not the `targetEvidence`
178
+ key; actual runtime disappearance of a still-configured target changes
179
+ only its resolution status, never the `requestId`.
180
+ - **Public CLI**: `my-frontend-observer observe --targets-file <json-file>`
181
+ supplies a structured `{ "targets": [...] }` collection as an alternative
182
+ to one or more `--target id=css-selector` flags; the two are mutually
183
+ exclusive per invocation. `--targets-file` only validates its own root
184
+ wrapper (readable file, valid JSON, object root with exactly a `targets`
185
+ field); all target/locator-internal validation stays owned by the
186
+ existing `normalizeRequest()`. The file path is operational input only -
187
+ never part of request identity, never persisted into `manifest.json`.
188
+ - **Observation schema `1.1.0`** (`src/domain/schema.ts#SCHEMA_VERSION`):
189
+ additive over the published `1.0.0` - extends `TargetEvidenceRecord` with
190
+ `semanticState`/`landmark`/`containment` and extends `TargetResolution`
191
+ with `selectedLocatorKind`/`selectedLocatorIndex`/`usedFallback`/
192
+ `confidence`/`attempts`. Artifact kind, directory structure, atomic
193
+ persistence, and evidence-state/source vocabularies are unchanged.
194
+ - **Validation on this branch**: `npm run typecheck`, `npm run lint`,
195
+ `npm test`, `npm run test:browser`, `npm run build`, and
196
+ `npm run check:docs` all pass (106 unit tests, 69 real-Chromium tests as
197
+ of this reconciliation; see `docs/DEVELOPMENT.md` for how to reproduce).
198
+ `scripts/dev/builtCliTargetsFileSmoke.mjs` additionally proves the built
199
+ `dist/cli.js` (not just the imported `runCli()` function) performs a real
200
+ semantic `--targets-file` observation end to end.
201
+
202
+ ## v0.3 status (Runtime Scrolling, Overflow, and Visibility Behavior) - released as 0.3.0
203
+
204
+ v0.3 is implemented and released as package version `0.3.0`, observation
205
+ schema `1.2.0`. It was validated as a packed npm tarball in a clean
206
+ consumer environment on Windows, Linux, and macOS before release.
207
+
208
+ - **Batch 1** froze the `scrollScenario` request/identity/schema contract:
209
+ `ScrollScenario { action }` with exactly two action kinds
210
+ (`window-scroll-by`, `target-scroll-by`), signed-integer deltas bounded to
211
+ `[-20000, 20000]`, `target-scroll-by.target` referencing an existing stable
212
+ configured target name, scenario configuration participating in
213
+ `requestId` (runtime results never do), and the full bounded runtime
214
+ evidence model (`ScrollRuntimeSnapshot`, `ViewportRelationEvidence`,
215
+ `OverflowEvidence`, scenario transitions, `ScrollOwnerInterpretation`) in
216
+ schema `1.2.0` (up from `1.1.0`).
217
+ - **Batch 2** implemented real `window-scroll-by` execution
218
+ (`src/browser/scrollCapture.ts`, `src/domain/scrollEvidence.ts`): initial/
219
+ final runtime snapshots around an immediate `window.scrollBy({behavior:
220
+ 'instant'})` and exactly two `requestAnimationFrame` cycles, real vertical/
221
+ horizontal document scrolling, actual-vs-computed overflow, real viewport
222
+ relation, `enteredViewport`/`leftViewport`, and `document`/`none`
223
+ scroll-owner evidence - with ordinary final `pageEvidence`/`targetEvidence`
224
+ and the screenshot always describing the same final post-action state.
225
+ - **Batch 3** implemented real `target-scroll-by` execution against the same
226
+ canonical `resolveConfiguredTargets` resolution already used by every v0.2
227
+ locator kind: real nested vertical/horizontal element scrolling, boundary
228
+ clamping, non-scrollable/no-movement targets, and the completed
229
+ `document`/`target:<name>`/`none`/`indeterminate` scroll-owner derivation
230
+ (`src/domain/scrollEvidence.ts#deriveScrollOwner`) - proven never to
231
+ attribute ownership from bounding-rectangle movement alone in either
232
+ direction. An unresolved/ambiguous/hidden action target is never scrolled
233
+ and never fabricated as moved; the existing target diagnostics explain it
234
+ honestly and the observation still persists.
235
+ - **Batch 4** exposed the existing contract through the real public CLI:
236
+ `my-frontend-observer observe --scroll-scenario-file <json-file>` (see
237
+ `docs/COMMANDS.md`). The file supplies the `scrollScenario` value directly
238
+ (no wrapper field); the CLI/input layer only validates file readability,
239
+ JSON validity, and a non-array object root - every scenario/action rule
240
+ stays owned by the existing `normalizeRequest()`. Usable with either
241
+ `--target` or `--targets-file` (independent of target configuration, never
242
+ a third mutually-exclusive mode); the scenario-file path is operational
243
+ input only, never persisted and never part of request identity, exactly
244
+ like `--targets-file`'s path. CLI output/exit-code semantics are
245
+ unchanged. Proven via real Chromium (`tests/browser/cliObserve.test.ts`)
246
+ and the built `dist/cli.js` (`scripts/dev/builtCliScrollScenarioSmoke.mjs`).
247
+
248
+ ## v0.4 status (Layout Relationships, Dependency Evidence, and Before/After Comparison) - released as 0.4.0
249
+
250
+ v0.4 is implemented and released as package version `0.4.0`; observation
251
+ schema remains `1.2.0`; comparison schema is `1.0.0`. It was validated as a
252
+ packed npm tarball in a clean consumer environment on Windows, Linux, and
253
+ macOS - covering the legacy CSS-shorthand `--target` path, the structured
254
+ `--targets-file` path, both `--scroll-scenario-file` action kinds, and the
255
+ installed `compare` command (comparable and incomparable cases) - before
256
+ release.
257
+
258
+ - **Batch 1** froze the `my-frontend-observer/comparison` artifact contract
259
+ (schema `1.0.0`, independent of and never reused for the observation
260
+ schema): `ComparisonConfig` (geometry tolerance, default `0.5`px, bounded
261
+ `[0, 10]`px), the bounded layout-relationship vocabulary (horizontal/
262
+ vertical order, area overlap, relative width, geometric fit, vertical
263
+ sequencing, page-width fit, clipping), comparability states, the
264
+ before/after difference vocabulary, and the non-causal explicit
265
+ dependency-evidence contract, plus `comparisonRequestId`/`comparisonId`
266
+ identity (`src/domain/relationships.ts`, `src/domain/comparison.ts`,
267
+ `src/domain/comparisonIdentity.ts`). No derivation, comparison, or
268
+ persistence.
269
+ - **Batch 2** implemented the one canonical pure derivation engine,
270
+ `deriveLayoutRelationships(observation, options?)`
271
+ (`src/domain/relationships.ts`): consumes an existing `ObservationArtifact`
272
+ only (no Chromium, no re-resolution, no DOM access) and derives a bounded,
273
+ traceable `LayoutRelationshipGraph` among configured targets - stable
274
+ target identity, deterministic configured-target ordering, honest
275
+ unresolved-target handling (not-found/ambiguous/unavailable/hidden, never
276
+ a fabricated zero-sized region), and evidence-reference provenance for
277
+ every derived relationship. DOM containment is read directly from the
278
+ existing `TargetContainment` evidence rather than re-derived, and stays
279
+ distinct from geometric fit. A standalone `deriveTargetClipping(record)`
280
+ derives the frozen clipping concept per target from existing layout/style
281
+ evidence.
282
+ - **Batch 3** implemented the pure before/after comparison engine,
283
+ `compareObservations(before, after, config?)`
284
+ (`src/domain/comparisonEngine.ts`): validates both source observations,
285
+ evaluates comparability before any rendered difference is calculated
286
+ (hard page-URL/viewport/browser-engine/scroll-scenario mismatches;
287
+ producer/browser-version and target-configuration warnings), reuses
288
+ `deriveLayoutRelationships` unchanged for both sides, and derives target/
289
+ page differences (appeared/disappeared, moved, resized, visibility,
290
+ clipping, actual overflow, DOM containment, page size, scroll-owner) and
291
+ relationship changes (matched by family + subject/related target, never
292
+ array position) - all without launching Chromium, re-resolving targets, or
293
+ mutating either input observation. Explicit `ComparisonConfig.
294
+ expectedDependencies` are evaluated into non-causal
295
+ consistent/not-observed/contradictory-to-declaration/unavailable outcomes
296
+ only; the observer never infers a dependency from co-change. Comparison
297
+ identity reuses the existing Batch 1 `buildComparisonRequestIdentity`/
298
+ `buildComparisonIdentity` verbatim. Persistence
299
+ (`src/artifacts/comparisonArtifactWriter.ts#writeComparisonArtifact`,
300
+ atomic, `<outputLocation>/<comparisonId>/manifest.json` only, no copied
301
+ screenshots) and the application-level `compareAndPersist` use case
302
+ (`src/application/comparisonService.ts`) are implemented; a narrow
303
+ `readObservationArtifact` reader
304
+ (`src/artifacts/artifactReader.ts`) is established ahead of the Batch 4
305
+ CLI.
306
+ - **Batch 4** exposed the existing comparison workflow through the real
307
+ public CLI: `my-frontend-observer compare --before <observation-artifact-
308
+ root> --after <observation-artifact-root> --output <directory>
309
+ [--config-file <json-file>]` (see `docs/COMMANDS.md`). The CLI stays thin
310
+ - `src/cli.ts` parses arguments, optionally loads a config file (file
311
+ readability/JSON validity/object-root only, exactly like
312
+ `--targets-file`/`--scroll-scenario-file`), and delegates to one new
313
+ thin application-layer orchestration function,
314
+ `compareAndPersistFromArtifactRoots`
315
+ (`src/application/comparisonService.ts`), which reads both observation
316
+ roots through the existing `readObservationArtifact` reader and calls the
317
+ existing `compareAndPersist` exactly once - no comparability/geometry/
318
+ relationship/dependency logic lives in the CLI, and comparison itself
319
+ never launches Chromium (`src/cli.ts` still imports nothing from
320
+ `src/artifacts/` or `src/browser/`, matching the pre-existing observe-CLI
321
+ import-boundary test). `comparable`, `comparable-with-warnings`, and
322
+ `incomparable` all exit `0` - each is a successful comparison outcome;
323
+ only a genuine parse/read/domain/persistence failure exits nonzero.
324
+ Operational paths (`--before`/`--after`/`--config-file`/`--output`) never
325
+ affect `comparisonRequestId` and are never written into the persisted
326
+ manifest. Proven end-to-end via real Chromium
327
+ (`tests/browser/cliCompare.test.ts`) and the built `dist/cli.js`
328
+ (`scripts/dev/builtCliCompareSmoke.mjs`): unchanged/moved/resized/
329
+ appeared/disappeared/configuration-only-change/overlap/geometric-fit/
330
+ page-overflow/clipping/scroll-owner cases, plus an explicit
331
+ `--config-file` dependency-evidence case, all through the public command
332
+ surface.
333
+
334
+ v0.4's canonical relationship derivation, before/after comparison,
335
+ comparability, differences, relationship changes, explicit dependency
336
+ evidence, comparison persistence, and public `compare` CLI are all
337
+ implemented, exercised end-to-end, packed-validated cross-platform, and
338
+ released.
339
+
340
+ v0.5 frontend contract model, identity, and evaluation engine are released
341
+ as part of `0.5.0`: `src/domain/frontendContracts.ts` (persistent baseline /
342
+ per-change contract types, the four authored change-scope categories plus
343
+ the derived `unexpected` classification, the 15-primitive bounded
344
+ vocabulary, contract tolerance, and the clause-result/overall-verdict
345
+ vocabulary), `src/domain/frontendContractIdentity.ts` (deterministic
346
+ contract/baseline/clause identity), and
347
+ `src/domain/frontendContractEvaluation.ts#evaluateFrontendContract`
348
+ (the one canonical pure evaluator: active-baseline/supersession calculation,
349
+ bounded conflict detection, per-category clause evaluation, difference-to-
350
+ scope matching, unexpected-change derivation, and overall PASS/FAIL) - all
351
+ covered by focused unit tests. Observation schema stays `1.2.0`, comparison
352
+ schema stays `1.0.0`.
353
+
354
+ v0.5 contract and evaluation persistence are also released as part of
355
+ `0.5.0`: `src/artifacts/frontendContractArtifactWriter.ts`/`frontendContractArtifactReader.ts`
356
+ (symmetric baseline/per-change contract persistence, atomic write, no
357
+ overwrite of existing history), `src/artifacts/comparisonArtifactReader.ts`
358
+ (new - no comparison reader existed before this batch; comparison schema
359
+ still `1.0.0`), `src/domain/frontendContractEvaluationArtifact.ts` (minimal
360
+ additive persisted envelope around the frozen evaluation-result vocabulary,
361
+ its own independent schema family `1.0.0`) with
362
+ `src/artifacts/frontendContractEvaluationArtifactWriter.ts`/`...Reader.ts`,
363
+ and `src/application/frontendContractEvaluationService.ts#evaluateAndPersist`/
364
+ `evaluateAndPersistFromArtifactRoots` (calls `evaluateFrontendContract`
365
+ exactly once, persists exactly one evaluation artifact for both `PASS` and
366
+ `FAIL` verdicts, never persists a fabricated artifact when evaluation
367
+ construction itself fails). `evaluateFrontendContract` itself is unmodified.
368
+
369
+ v0.5 public contract/baseline-approval/evaluation CLI is also released as
370
+ part of `0.5.0`:
371
+ `approve-baseline` (the only baseline-approval act - explicit only, never
372
+ inferred from `compare` or a `PASS` evaluation; verifies the contract's
373
+ `sourceObservation` matches the supplied observation before persisting),
374
+ `save-change-contract` (persistence only), and `evaluate-contract`
375
+ (evaluates already-persisted before/after/comparison/baseline/change
376
+ evidence exactly once and persists exactly one evaluation artifact;
377
+ `--enforce` makes a `FAIL` verdict exit nonzero without changing the
378
+ verdict, its identity, or its persisted content - a `FAIL` without
379
+ `--enforce` still exits `0`). `src/application/frontendContractPersistenceService.ts`
380
+ adds the two new thin application seams (`approveAndPersistBaseline`,
381
+ `persistPerChangeContract`); `src/cli.ts` gained no browser or artifact-
382
+ writer import. Covered by `tests/unit/cliFrontendContracts.test.ts` and the
383
+ Chromium-free `scripts/dev/builtCliFrontendContractsSmoke.mjs` dev smoke.
384
+ Observation schema `1.2.0`; comparison schema `1.0.0`; frontend contract
385
+ schema `1.0.0`; evaluation artifact schema `1.0.0` - no schema was bumped
386
+ to add this CLI.
387
+
388
+ v0.5 proved the complete public contract workflow (`observe` →
389
+ `approve-baseline` → `save-change-contract` → `observe` → `compare` →
390
+ `evaluate-contract`) against real Chromium observations, not hand-constructed
391
+ artifacts: a fully successful contract change (all clauses `pass`, overall
392
+ `PASS`), and the "milestone signature" case - a locally successful requested
393
+ change (navigation shrinks, workspace expands, both real and both `pass`)
394
+ coexisting with a genuine protected-property regression (real right-rail
395
+ `resized` difference) and a genuine preserved-invariant regression (real
396
+ `clipping-changed` difference, `not-clipped` → `clipped`) - producing overall
397
+ `FAIL`. Both scenarios are covered by `tests/browser/cliFrontendContracts.test.ts`
398
+ (real Chromium, via `tests/fixtures/server.ts`'s new `/contract` route) and by
399
+ the built-CLI dev smoke `scripts/dev/builtCliFrontendContractsBrowserSmoke.mjs`
400
+ (the built `dist/cli.js`, not the imported `runCli()`, against its own
401
+ disposable local HTTP fixture). Both confirm `--enforce` behavior (`FAIL`
402
+ persists and exits `0` without it, exits nonzero with it, identical
403
+ `evaluationRequestId` and `clauseResults` in both cases), full source
404
+ observation/comparison immutability, no screenshot copied into the
405
+ evaluation artifact, and no operational filesystem path leaked into any
406
+ persisted manifest.
407
+
408
+ The packed-readiness coverage gap this left (`V0_5_READINESS_VALIDATION_GAP_EXISTS`)
409
+ was corrected and proven cross-platform before release:
410
+ `scripts/ci/runPackedObservationSmoke.mjs` also exercises the installed
411
+ packed candidate's `approve-baseline`/`save-change-contract`/
412
+ `evaluate-contract` commands against real installed-candidate `observe`/
413
+ `compare` evidence, proving the same successful-change and milestone-
414
+ signature scenarios through the installed tarball rather than the source
415
+ checkout. v0.5 pre-release readiness passed on the validation branch
416
+ `validation/v0.5-pre-release` (GitHub Actions run `31727856546`, one shared
417
+ hash-verified candidate tarball on Windows, Linux, and macOS - see
418
+ `docs/CI_CD.md` for full evidence) before the version `0.5.0` release below.
419
+
420
+ ## v0.6 status (Bounded Agent Context and Native my-dev-kit Ecosystem Integration) - released as `0.6.0`
421
+
422
+ v0.6 is published as package version `0.6.0`, tagged `v0.6.0`, from the
423
+ canonical `canonicalization/v0.6` lineage (product commit
424
+ `514bf3bb513764815a0a5b9e508d5836aa7d7fd8`). Observation schema stays
425
+ `1.2.0`; comparison schema `1.0.0`; frontend contract schema `1.0.0`;
426
+ evaluation artifact schema `1.0.0`; new bounded-agent-context schema
427
+ `1.0.0` (artifact kind `my-frontend-observer/bounded-agent-context`).
428
+
429
+ - **Bounded runtime projection** (`src/domain/boundedAgentContext.ts`,
430
+ `src/domain/boundedAgentContextProjection.ts#projectBoundedAgentContext`):
431
+ page/viewport identity, stable target identities, geometry, runtime
432
+ behavior, relationships, before/after differences, contract results, and
433
+ requested/expected-dependent/protected/preserved scope - reusing the
434
+ existing v0.5 `frontendContracts.ts` types directly rather than
435
+ reimplementing them - plus diagnostics, screenshot/artifact references,
436
+ provenance, and explicit truncation/omission metadata.
437
+ - **Adequacy, omission, and truncation** (`Adequacy`/`ADEQUACY_REASON_CODES`,
438
+ `OmissionRecord`/`TruncationRecord`, bounded aggregate-cap summarization):
439
+ distinguishes required from optional loss and reports whether captured
440
+ evidence is adequate for the task rather than merely present.
441
+ - **Runtime/static correlation**
442
+ (`src/domain/boundedAgentContextCorrelation.ts#deriveRuntimeStaticCorrelations`/
443
+ `attachRuntimeStaticCorrelations`): correlation outcomes are exactly
444
+ `correlated`/`ambiguous`/`unavailable`; competing candidate identities
445
+ remain visible; a stable runtime target identity is never silently
446
+ reported as source ownership. This module has no dependency on
447
+ `@dailephd/my-dev-kit` - it accepts only plain, already-retrieved
448
+ candidate evidence, since no generic static-side retrieval capability was
449
+ found missing.
450
+ - **Deterministic identity** (`src/domain/boundedAgentContextIdentity.ts`):
451
+ a logical identity distinct from a fresh per-execution instance identity.
452
+ - **Export/public boundary**: `src/index.ts` exports the complete
453
+ bounded-agent-context and correlation type/function surface as a
454
+ programmatic library contract. There is no new CLI command and no disk
455
+ artifact writer/reader for this artifact family - it is a pure contract-
456
+ and-derivation layer, consistent with the frozen module documentation
457
+ describing it as a foundation for orchestrator/lab consumption rather than
458
+ a persisted artifact kind.
459
+ - **Validated on the canonical worktree**: `npm run typecheck`, `npm run
460
+ lint`, `npm test` (32 files, 627 tests), `npm run test:browser` (9 files,
461
+ 120 tests), `npm run test:security`, `npm run build`, and `npm run
462
+ check:docs` all pass. Cross-repository neutral verification (observer
463
+ `514bf3b`, orchestrator `9473e4c`, lab `271e72c`) passed with 6/6
464
+ requirement coverage and no known product blockers.
465
+ - **Not Observer-owned / correctly out of scope for this repository**: no
466
+ `my-dev-kit` static-side change was made (none was proven necessary); no
467
+ orchestrator bounded-evidence consumption or lab reader/fixture/evaluation
468
+ code lives in this repository - those are separate sibling-repository
469
+ deliverables, not part of `my-frontend-observer`'s v0.6 surface.
470
+
471
+ ## v0.7 Prompt 1 status (External Visual Reference Foundation) - released as `0.7.0`
472
+
473
+ Only the foundation layer of the v0.7 external-reference architecture is
474
+ implemented: an observer-owned `ExternalReferenceArtifact` family
475
+ representing one externally supplied design-reference image plus
476
+ deterministic identity, provenance, bounded image metadata, and an explicit
477
+ two-state lifecycle. This is not the full v0.7 coding-agent workflow.
478
+
479
+ - **Domain** (`src/domain/externalReferenceImage.ts`): pure, dependency-free
480
+ PNG/JPEG/WebP header-byte format detection and dimension parsing (no
481
+ decode, no OCR, no computer vision), bounded to
482
+ `EXTERNAL_REFERENCE_MAX_IMAGE_BYTES` (20,000,000 bytes) and
483
+ `[EXTERNAL_REFERENCE_MIN_DIMENSION_PX, EXTERNAL_REFERENCE_MAX_DIMENSION_PX]`
484
+ (`[1, 8192]`) pixels per side.
485
+ - **Domain** (`src/domain/externalReference.ts`): `ExternalReferenceArtifact`
486
+ is a discriminated union of `ImportedExternalReferenceArtifact` (owns its
487
+ image file) and `ApprovedExternalReferenceArtifact` (carries a
488
+ `sourceReference` back to the imported artifact's image instead of copying
489
+ it) under `EXTERNAL_REFERENCE_ARTIFACT_KIND` /
490
+ `EXTERNAL_REFERENCE_SCHEMA_VERSION` (`'1.0.0'`, independent of the
491
+ observation/comparison/contract schema versions). Lifecycle has exactly two
492
+ persisted states, `'imported'` and `'approved'` - there is no literal
493
+ `'superseded'` state; supersession is represented only as a forward
494
+ pointer (`supersedesReferenceId` on the newer artifact), so an existing
495
+ persisted artifact's own manifest is never rewritten.
496
+ - **Identity** (`src/domain/externalReferenceIdentity.ts`): the same
497
+ canonicalize-then-sha256 request identity plus nonce-based fresh instance
498
+ identity pattern used by every other artifact family, duplicated per-family
499
+ per existing convention. `referenceRequestId` is a pure function of
500
+ `{imageSha256, format, width, height, supersedesReferenceId}` only - never
501
+ a filesystem path, output location, label, or timestamp.
502
+ - **Persistence** (`src/artifacts/externalReferenceArtifactWriter.ts` /
503
+ `externalReferenceArtifactReader.ts`): same atomic temp-dir-then-rename
504
+ discipline as the observation/comparison writers; an `'imported'`
505
+ artifact's directory contains `manifest.json` plus its owned image file;
506
+ an `'approved'` artifact's directory contains only `manifest.json`.
507
+ - **Application** (`src/application/externalReferencePersistenceService.ts`):
508
+ `importExternalReference()` (never approves; fails closed on an
509
+ unsupported/undetectable format, invalid or out-of-bound dimensions, an
510
+ over-limit file, or an unresolvable `--supersedes` target) and
511
+ `approveExternalReference()` (the only explicit approval act; refuses to
512
+ approve anything not currently in the `'imported'` state; never mutates the
513
+ imported artifact it approves).
514
+ - **CLI**: `import-reference <image-file> --output <dir> [--label] [--supersedes]`
515
+ and `approve-reference --reference <root> --output <dir> [--supersedes]`.
516
+ - **Export/public boundary**: `src/index.ts` exports the complete new type,
517
+ constant, validator, identity, writer, reader, and application-service
518
+ surface, following the same grouping order as every existing family.
519
+ - **Validated on the canonical worktree**: `npm run typecheck`, `npm run
520
+ lint`, `npm test` (38 files, 668 tests), `npm run test:browser` (9 files,
521
+ 120 tests), `npm run test:security`, `npm run build`, `npm run check:docs`,
522
+ `git diff --check`, and `npm pack --dry-run` all pass with zero changes to
523
+ any pre-existing test.
524
+ - **Not implemented in this stage** (explicitly deferred to later v0.7
525
+ prompts): reference regions, geometry, relationships, design requirements,
526
+ tolerances, reference-region/runtime-target binding, reference-vs-candidate
527
+ fidelity evaluation, theme/application-state compatibility evaluation,
528
+ viewer, and annotation.
529
+
530
+ ## v0.7 Prompt 2 status (Explicit Reference Regions, Geometry, and Reusable Reference Relationships) - released as `0.7.0`
531
+
532
+ Additive extension of the Prompt 1 foundation above. Still not the full v0.7
533
+ coding-agent workflow - no design requirements, tolerances, adequacy,
534
+ binding, or fidelity evaluation yet.
535
+
536
+ - **Domain** (`src/domain/externalReferenceRegions.ts`): explicit,
537
+ user/configuration-authored reference-image rectangles
538
+ (`ReferenceRegion { id, rectangle: {x, y, width, height} }`), origin at the
539
+ reference image's top-left corner, unit reference-image pixels. Pure
540
+ derived geometry (`right`/`bottom`/`centerX`/`centerY`) is always
541
+ recomputed from the canonical rectangle, never separately stored. Bounded
542
+ at `MAX_REFERENCE_REGIONS` (20, matching `request/request.ts`'s
543
+ `MAX_TARGETS`), region ids validated against the same
544
+ `^[A-Za-z0-9_-]{1,64}$` pattern as target names, unique
545
+ case-insensitively, and rejected outright (never clamped) if any rectangle
546
+ extends outside the owning image's bounds.
547
+ - **Domain** (`src/domain/externalReferenceRegionRelationships.ts`): reuses
548
+ the exact pure geometry predicates `deriveLayoutRelationships` uses for
549
+ runtime targets (now exported additively from `relationships.ts`, formulas
550
+ unchanged) to derive the six geometry-only relationship families
551
+ (horizontal order, vertical order, area overlap, relative width, geometric
552
+ fit, vertical sequencing) between reference regions. Not persisted -
553
+ `deriveReferenceRegionRelationships()` is a pure function callers invoke
554
+ on demand against an artifact's own `regions`, bounded at
555
+ `MAX_REFERENCE_REGION_RELATIONSHIP_RECORDS`.
556
+ - **Schema**: `ExternalReferenceArtifact` gained one additive, optional
557
+ `regions?: ReferenceRegion[]` field. No schema version bump
558
+ (`EXTERNAL_REFERENCE_SCHEMA_VERSION` remains `'1.0.0'`) - every Prompt 1
559
+ artifact remains valid with no `regions` key at all.
560
+ - **Identity**: `buildExternalReferenceRequestIdentity` gained an additive,
561
+ optional trailing `regions` parameter, omitted from the hashed view
562
+ entirely (not defaulted to `null`) when absent, so every Prompt 1 call
563
+ site keeps producing byte-identical identity. Region content (including
564
+ authored order) is identity-bearing when present.
565
+ - **Application**: `importExternalReference()` validates an optional
566
+ `regions` option and fails closed with the new `invalid-reference-region`
567
+ diagnostic; `approveExternalReference()` carries an imported artifact's
568
+ `regions` forward verbatim, never re-validating or re-deriving them.
569
+ - **CLI**: `import-reference` gained an optional
570
+ `--regions-file <json-file>` (`{ "regions": [...] }`, same object-root-
571
+ wrapper convention as `--targets-file`); legacy invocations without it are
572
+ unchanged from Prompt 1. Both commands now print a `Regions: <count>` line.
573
+ - **Export/public boundary**: `src/index.ts` exports the complete new region
574
+ and relationship type/constant/validator/function surface, following the
575
+ same grouping order as every existing family.
576
+ - **Validated on the canonical worktree**: `npm run typecheck`, `npm run
577
+ lint`, `npm test` (40 files, 719 tests), `npm run test:browser` (9 files,
578
+ 120 tests, unchanged), `npm run test:security`, `npm run build`, `npm run
579
+ check:docs`, `git diff --check`, and `npm pack --dry-run` all pass with
580
+ zero changes to any pre-existing test.
581
+ - **Not implemented in this stage** (explicitly deferred to later v0.7
582
+ prompts): selected design requirements, design tolerance semantics,
583
+ reference-evidence adequacy, theme/application-state compatibility
584
+ evaluation, reference-region/runtime-target binding, reference-vs-candidate
585
+ fidelity evaluation, viewer, and annotation.
586
+
587
+ ## v0.7 Prompt 3 status (Selected Design Requirements, Tolerance Semantics, and Reference-Evidence Adequacy) - released as `0.7.0`
588
+
589
+ Additive extension of the Prompt 1/2 foundation above. Still not the full
590
+ v0.7 coding-agent workflow - no runtime binding or fidelity evaluation yet.
591
+
592
+ - **Domain** (`src/domain/externalReferenceRequirements.ts`): explicit,
593
+ user/configuration-selected design intent over Prompt 2's `regions` -
594
+ never inferred merely because a region property or relationship exists.
595
+ Requirement category reuses v0.5's `AuthoredChangeScopeCategory`
596
+ (`requested`/`expected-dependent`/`protected`/`preserved`) directly;
597
+ `'unexpected'` remains impossible to author. Three subject kinds:
598
+ `region-property` (one region + a `ReferenceRegionGeometry` field),
599
+ `region-relationship` (two regions + a reused `PairwiseRelationshipKind`,
600
+ geometry-only families only, no tolerance), `region-measurement` (two
601
+ regions + one of six pure derived measurements - `vertical-gap`,
602
+ `horizontal-gap`, `center-x-delta`, `center-y-delta`, `left-edge-delta`,
603
+ `right-edge-delta` - with a required tolerance). Tolerance is a new,
604
+ reference-owned type (`exact` | `absolute-reference-px` | `percent`),
605
+ deliberately not a reuse of v0.5's `ContractTolerance` (whose
606
+ `absolute-px` is implicitly runtime/CSS pixels). Bounded at
607
+ `MAX_REFERENCE_REQUIREMENTS` (50). A requirement's `requirementId` is
608
+ always system-computed from its content, never authored.
609
+ - **Reference-evidence adequacy**: `deriveReferenceRequirementAdequacy()`
610
+ asks only whether the reference definition itself supports every selected
611
+ requirement - never whether a runtime target/candidate exists. Its own
612
+ small vocabulary (`adequate`/`partial`/`inadequate`, two reason codes)
613
+ deliberately does not reuse `boundedAgentContext.ts`'s `Adequacy`, which
614
+ describes an unrelated runtime/static-correlation domain. Zero selected
615
+ requirements is explicitly `inadequate`. Never a numeric score; reasons
616
+ ordered deterministically by authored requirement position.
617
+ - **Validation**: a requirement referencing an unknown region id is a
618
+ construction-time failure (`invalid-reference-requirement`), never
619
+ "unavailable" evidence. Two requirements sharing the exact same structural
620
+ subject (regardless of category) are rejected as duplicates/conflicts -
621
+ v0.5's runtime-evaluation-time conflict detector
622
+ (`evaluateFrontendContract#primitivesConflict`) needs before/after
623
+ observation evidence that does not exist at this stage and could not be
624
+ reused safely.
625
+ - **Schema**: `ExternalReferenceArtifact` gained one additive, optional
626
+ `requirements?: ExternalReferenceRequirement[]` field. No schema version
627
+ bump - every Prompt 1/2 artifact remains valid with no `requirements` key.
628
+ - **Identity**: `buildExternalReferenceRequestIdentity` gained an additive,
629
+ optional trailing `requirements` parameter, omitted from the hashed view
630
+ entirely when absent, so every Prompt 1/2 call site keeps producing
631
+ byte-identical identity. Requirement content (category, subject,
632
+ tolerance, mode, authored order) is identity-bearing when present.
633
+ - **Application**: `importExternalReference()` validates an optional
634
+ `requirements` option (computing each requirement's identity from its raw
635
+ authored content) and fails closed on any invalid requirement;
636
+ `approveExternalReference()` carries `requirements` forward verbatim.
637
+ Both now also compute and return reference-evidence adequacy.
638
+ - **CLI**: `import-reference` gained an optional
639
+ `--requirements-file <json-file>` (`{ "requirements": [...] }`, same
640
+ object-root-wrapper convention as `--regions-file`); legacy invocations
641
+ without it are unchanged. Both commands now also print
642
+ `Requirements: <count>` and `Adequacy: <status>` lines.
643
+ - **Export/public boundary**: `src/index.ts` exports the complete new
644
+ requirement/tolerance/adequacy type/constant/validator/function surface,
645
+ following the same grouping order as every existing family.
646
+ - **Validated on the canonical worktree**: `npm run typecheck`, `npm run
647
+ lint`, `npm test` (42 files, 779 tests), `npm run test:browser` (9 files,
648
+ 120 tests, unchanged), `npm run test:security`, `npm run build`, `npm run
649
+ check:docs`, `git diff --check`, and `npm pack --dry-run` all pass with
650
+ zero changes to any pre-existing test.
651
+ - **Not implemented in this stage** (explicitly deferred to later v0.7
652
+ prompts): theme/application-state compatibility evaluation,
653
+ reference-region/runtime-target binding, reference-vs-candidate fidelity
654
+ evaluation, viewer, and annotation.
655
+
656
+ ## v0.7 Prompt 4 status (Reference Applicability and Candidate-State Compatibility) - released as `0.7.0`
657
+
658
+ Additive extension of the Prompt 1/2/3 foundation above. Still not the full
659
+ v0.7 coding-agent workflow - no runtime binding or fidelity evaluation yet.
660
+
661
+ - **Domain** (`src/domain/explicitState.ts`): a small, closed, caller/
662
+ configuration-supplied state model (`theme`, `applicationState`,
663
+ `authenticatedState`) shared by both `ObservationArtifact.requestConfig.explicitState`
664
+ and `ExternalReferenceArtifact.applicability` - never inferred from
665
+ screenshot pixels, CSS, DOM, URLs, or any other runtime signal. Labels are
666
+ bounded opaque identities (`^[A-Za-z0-9_-]{1,64}$`) compared by exact,
667
+ case-sensitive equality only. `authenticatedState` is a closed
668
+ `'authenticated' | 'unauthenticated'` vocabulary with no field capable of
669
+ holding a credential, token, or cookie.
670
+ - **Domain** (`src/domain/externalReferenceApplicability.ts`): adds an
671
+ optional CSS-pixel `viewport` to the shared state model - deliberately
672
+ distinct from the reference image's own pixel dimensions (`image.width`/
673
+ `height`), which a reference image may be captured at any resolution/DPI
674
+ relative to.
675
+ - **Domain** (`src/domain/externalReferenceCompatibility.ts`):
676
+ `evaluateReferenceCandidateCompatibility(reference, candidate)` answers
677
+ "does this reference describe the same frontend state as this candidate
678
+ observation?" by reusing v0.4's own `ComparabilityResult`/`ComparabilityReason`
679
+ vocabulary and a newly-extracted, shared pure helper
680
+ (`assessOptionalComparabilityDimension`, exported from
681
+ `comparisonEngine.ts`) rather than a parallel model. The same helper now
682
+ also drives v0.4's own `evaluateComparability`, which additionally assesses
683
+ theme/authenticated-state/application-state when both observations declare
684
+ `explicitState` - every historical observation pair without it keeps its
685
+ exact prior unassessed-only behavior (a frozen regression vector proves
686
+ this). A dimension the reference constrains but the candidate omits (or
687
+ vice versa) is `unassessed`, never fabricated as a match or a mismatch.
688
+ - **Schema**: `ExternalReferenceArtifact` gained one additive, optional
689
+ `applicability?: ExternalReferenceApplicability` field; `ObservationArtifact.requestConfig`
690
+ gained one additive, optional `explicitState?: ExplicitStateDimensions`
691
+ field. No schema version bump on either family.
692
+ - **Identity**: `buildExternalReferenceRequestIdentity` gained an additive,
693
+ optional trailing `applicability` parameter; `buildRequestIdentity` gained
694
+ an additive, optional trailing `explicitState` parameter - both omitted
695
+ from their hashed views (never `null`) when absent, so every earlier call
696
+ site keeps producing byte-identical identity.
697
+ - **CLI**: `import-reference` gained an optional `--applicability-file <json-file>`;
698
+ `observe` gained an optional `--state-file <json-file>` (both unwrapped
699
+ raw-object files, following `--scroll-scenario-file`'s exact convention).
700
+ `import-reference`/`approve-reference` now also print an
701
+ `Applicability: declared|none` line.
702
+ - **Export/public boundary**: `src/index.ts` exports the complete new
703
+ explicit-state/applicability/compatibility type/constant/validator/function
704
+ surface, following the same grouping order as every existing family.
705
+ - **Validated on the canonical worktree**: `npm run typecheck`, `npm run
706
+ lint`, `npm test` (45 files, 857 tests), `npm run test:browser` (9 files,
707
+ 120 tests, unchanged), `npm run test:security`, `npm run build`, `npm run
708
+ check:docs`, `git diff --check`, and `npm pack --dry-run` all pass with
709
+ zero changes to any pre-existing test.
710
+ - **Not implemented in this stage** (explicitly deferred to later v0.7
711
+ prompts): reference-region/runtime-target binding, reference-vs-candidate
712
+ fidelity evaluation, bounded fidelity context, the end-to-end correction
713
+ workflow, viewer, and annotation.
714
+
715
+ ## v0.7 Prompt 5 status (Explicit Reference-Region <-> Runtime-Target Binding) - released as `0.7.0`
716
+
717
+ Additive extension of the Prompt 1-4 foundation above. Still not the full
718
+ v0.7 coding-agent workflow - no fidelity evaluation yet.
719
+
720
+ - **Domain** (`src/domain/externalReferenceRuntimeBinding.ts`):
721
+ `evaluateReferenceRuntimeBindings(reference, candidate, declarations)`
722
+ answers "which stable v0.2 runtime target does this candidate resolve for
723
+ each explicitly declared reference region?" A binding declaration
724
+ (`{referenceRegion, runtimeTarget}`) is explicit user/configuration input
725
+ - never inferred from geometry, matching names, or source code; two
726
+ strings with the same textual value in the reference-region and
727
+ runtime-target identity domains never bind to each other merely because
728
+ they match. Reuses `evaluateReferenceCandidateCompatibility` (Prompt 4) as
729
+ a hard gate and `targetPresence` (v0.4, exported additively) as the sole
730
+ "how do I read a `TargetEvidenceRecord`'s resolution" rule - no second
731
+ target resolver, no browser launch. Status vocabulary: `bound` / `ambiguous`
732
+ / `unavailable`, each with closed reason codes. An unknown reference
733
+ region fails the whole evaluation closed (structural, candidate-independent);
734
+ an unknown/ambiguous/unavailable runtime target produces a per-declaration
735
+ `unavailable`/`ambiguous` result, never a guessed target. Bounded at
736
+ `MAX_REFERENCE_RUNTIME_BINDINGS` (20).
737
+ - **Persistence**: none - a pure, on-demand function over already-persisted/
738
+ in-memory evidence, no new artifact family.
739
+ - **CLI**: none added - deliberately deferred to Prompt 6, the capability's
740
+ first concrete consumer.
741
+ - **Export/public boundary**: `src/index.ts` exports the complete new
742
+ binding type/constant/validator/function surface.
743
+ - **Validated on the canonical worktree**: `npm run typecheck`, `npm run
744
+ lint`, `npm test` (46 files, 889 tests), `npm run test:browser` (9 files,
745
+ 120 tests, unchanged), `npm run test:security`, `npm run build`, `npm run
746
+ check:docs`, `git diff --check`, and `npm pack --dry-run` all pass with
747
+ zero changes to any pre-existing test.
748
+ - **Not implemented in this stage** (explicitly deferred to later v0.7
749
+ prompts): reference-vs-candidate fidelity evaluation, bounded fidelity
750
+ context, the end-to-end correction workflow, viewer, and annotation.
751
+
752
+ ## v0.7 Prompt 6 status (Structured Reference-vs-Candidate Fidelity Evaluation) - released as `0.7.0`
753
+
754
+ Additive extension of the Prompt 1-5 foundation above. The first point in
755
+ the v0.7 stack where a reference's authored expectation is actually
756
+ compared against live candidate evidence.
757
+
758
+ - **Domain** (`src/domain/externalReferenceFidelity.ts`):
759
+ `evaluateReferenceCandidateFidelity(reference, candidate, bindings)`
760
+ evaluates in a frozen order - reference/candidate structural validation ->
761
+ Prompt 3 adequacy -> Prompt 4 compatibility -> Prompt 5 binding ->
762
+ per-requirement evaluation - and never fabricates an ordinary PASS/FAIL
763
+ past an earlier blocking gate: overall `state` is `'not-evaluated'` /
764
+ `'pass'` / `'fail'`, with `blockedBy` preserved for the first two gates.
765
+ Establishes one explicit, deterministic reference-image-pixel <->
766
+ CSS-pixel coordinate scale from `reference.applicability.viewport` and the
767
+ image's own dimensions, gated by an independent (never a design-tolerance)
768
+ aspect-ratio coherence check. Reuses Prompt 3 tolerances
769
+ (`exact`/`absolute-reference-px`/`percent`) and v0.4's
770
+ `deriveLayoutRelationships` (family-scoped lookup, the same bug class
771
+ Prompt 3 already fixed) unchanged - no duplicated geometry or
772
+ comparability logic.
773
+ - **Persistence**: none - a pure, on-demand function; the CLI-facing
774
+ `evaluateReferenceCandidateFidelityFromArtifactRoots` application-service
775
+ wrapper only reads already-persisted artifacts, it does not write one.
776
+ - **CLI**: `evaluate-reference-fidelity --reference --candidate
777
+ [--bindings-file] [--enforce]` - the CLI surface Prompt 5 deferred,
778
+ following `evaluate-contract`'s exact `--enforce`/exit-code precedent.
779
+ Persists nothing; there is no `--output` flag.
780
+ - **Export/public boundary**: `src/index.ts` exports the complete new
781
+ fidelity-result type/constant/validator/function surface plus the
782
+ application-service wrapper.
783
+ - **Validated on the canonical worktree**: `npm run typecheck`, `npm run
784
+ lint`, `npm test` (48 files, 927 tests), `npm run test:browser` (9 files,
785
+ 120 tests, unchanged), `npm run test:security`, `npm run build`, `npm run
786
+ check:docs`, `git diff --check`, and `npm pack --dry-run` all pass with
787
+ zero changes to any pre-existing test.
788
+ - **Not implemented in this stage** (explicitly deferred to later v0.7
789
+ prompts): bounded fidelity context integration, the end-to-end correction
790
+ workflow, viewer, and annotation.
791
+
792
+ ## v0.7 Prompt 7 status (Bounded Reference-Fidelity Projection and v0.6 Bounded-Agent-Context Integration) - released as `0.7.0`
793
+
794
+ Additive extension of the v0.6 bounded-agent-context architecture and the
795
+ Prompt 1-6 foundation above.
796
+
797
+ - **Domain** (`src/domain/referenceFidelityProjection.ts`):
798
+ `projectReferenceFidelity()` selects, prioritizes (failed-required, then
799
+ unavailable-required, then other non-pass), and bounds Prompt 6's
800
+ non-passing requirement results (`MAX_FIDELITY_MISMATCHES`, 15) and
801
+ passing protected/preserved context (`MAX_FIDELITY_PROTECTED_CONTEXT`, 10)
802
+ for a coding agent's bounded context - passing requirements are never
803
+ dumped by default.
804
+ - **Integration**: `projectBoundedAgentContext` (v0.6) itself, not a second
805
+ context system, gained one new optional input (`fidelity`,
806
+ `fidelityRequired?`): fidelity-relevant runtime targets fold into the
807
+ exact same required/permitted-target allocation and omission/truncation/
808
+ adequacy machinery v0.5 contract clauses already compete in, so a
809
+ `not-evaluated` fidelity always degrades adequacy away from `'adequate'`,
810
+ never silently reported as "no problems". A new `fidelity?:
811
+ BoundedReferenceFidelityProjection` field on `BoundedAgentContextArtifact`
812
+ mirrors `correlations?`'s own additive precedent - no schema version bump.
813
+ v0.6's own runtime/static correlation is reused entirely unchanged.
814
+ - **Identity**: `buildBoundedAgentContextRequestIdentity` gained a final
815
+ optional `fidelity` parameter (omit-when-absent; verified byte-identical
816
+ for every pre-Prompt-7 call site).
817
+ - **Persistence / CLI**: none - bounded agent context remains
818
+ library-only, exactly as v0.6 established it.
819
+ - **Export/public boundary**: `src/index.ts` exports the complete new
820
+ fidelity-projection type/constant/function surface.
821
+ - **Validated on the canonical worktree**: `npm run typecheck`, `npm run
822
+ lint`, `npm test` (49 files, 981 tests), `npm run test:browser` (9 files,
823
+ 120 tests, unchanged), `npm run test:security`, `npm run build`, `npm run
824
+ check:docs`, `git diff --check`, and `npm pack --dry-run` all pass with
825
+ zero changes to any pre-existing test.
826
+ - **Not implemented in this stage** (explicitly deferred to Prompt 8):
827
+ the end-to-end coding-agent correction workflow, viewer, and annotation.
828
+
829
+ ## v0.7 Prompt 8 status (Controlled End-to-End External-Reference Coding-Agent Correction Workflow) - released as `0.7.0`
830
+
831
+ The first complete v0.7 correction cycle, composing every Prompt 1-7 and
832
+ v0.1/v0.4/v0.5/v0.6 owner - this completes the v0.7 (End-to-End Coding-Agent
833
+ Frontend Change Review) milestone's core workflow.
834
+
835
+ - **Domain** (`src/domain/referenceCorrectionWorkflow.ts`,
836
+ `referenceCorrectionIdentity.ts`): `prepareReferenceCorrection()`
837
+ evaluates the approved reference against the current (pre-change)
838
+ observation (Prompt 6) and, when evaluable, projects a bounded
839
+ coding-agent handoff (Prompt 7/v0.6) - a `not-evaluated` fidelity is
840
+ reported as `status: 'blocked-not-evaluated'`, never a fabricated
841
+ handoff. `reviewReferenceCorrectionAttempt()` composes one overall result
842
+ from a fresh post-edit candidate: `compareObservations` (v0.4) ->
843
+ `evaluateReferenceCandidateFidelity` (Prompt 6) -> `evaluateFrontendContract`
844
+ (v0.5) -> overall `'not-evaluated'`/`'pass'`/`'fail'`, where `'pass'`
845
+ requires *both* reference fidelity `'pass'` *and* v0.5 contract evaluation
846
+ `'PASS'` - matching the design reference is necessary but never
847
+ sufficient. Review identity is a deterministic hash of
848
+ `{referenceRequestId, baselineObservationId, baselineContractId,
849
+ baselineContractClauses, changeContractId, changeContractClauses,
850
+ bindingDeclarations}` (including actual contract *clause content*, not
851
+ merely the caller-authored contract id labels) - `reviewReferenceCorrectionAttempt`
852
+ recomputes and rejects any call whose supplied review id does not match,
853
+ enforcing "no hidden baseline change" structurally. Attempt identity is a
854
+ deterministic hash of `{reviewRequestId, candidateObservationId}`. Both
855
+ functions are pure, so no prior attempt can ever be overwritten.
856
+ - **External implementation boundary**: absolute - neither this module nor
857
+ anything it calls opens, parses, or writes any target source file; real
858
+ candidate capture remains the caller's own responsibility through the
859
+ existing, unmodified `runBrowserCapture`/`buildObservationArtifact`
860
+ pipeline. No automatic baseline/reference approval ever occurs.
861
+ - **Persistence / CLI**: none - both operations remain pure, in-memory,
862
+ programmatic functions; no `--output` flag, no new command.
863
+ - **Real-Chromium proof** (`tests/browser/referenceCorrectionWorkflow.test.ts`):
864
+ a deterministic, test-only "controlled external actor" (living entirely
865
+ outside `src/`) edits a disposable, repository-local copy of a tracked
866
+ HTML fixture template, proving a full success correction, a protected-
867
+ regression case (candidate visually matches the reference but a real
868
+ Chromium-observed element becomes hidden - still overall `FAIL`), a
869
+ two-attempt correction iteration (both attempts traceable to the same
870
+ baseline), and an incompatible-viewport blocking case that never produces
871
+ a handoff. The tracked template remains byte-identical before and after.
872
+ - **Export/public boundary**: `src/index.ts` exports the complete new
873
+ workflow/identity type/constant/function surface.
874
+ - **Validated on the canonical worktree**: `npm run typecheck`, `npm run
875
+ lint`, `npm test` (50 files, 1000 tests), `npm run test:browser` (10
876
+ files, 124 tests), `npm run test:security`, `npm run build`, `npm run
877
+ check:docs`, `git diff --check`, `npm pack --dry-run`, and a real
878
+ installed-packed-candidate smoke all pass with zero regressions to any
879
+ pre-existing test.
880
+ - **Not implemented in this stage** (remain future, v0.8+): interactive
881
+ viewer, structured visual annotation, and automatic baseline/reference
882
+ approval (approval remains an explicit, separate action through the
883
+ existing `approve-baseline`/`approve-reference` commands).
884
+
885
+ ## v0.8 status (Interactive Local Observation Viewer) - released as `0.8.0`
886
+
887
+ All eight v0.8 implementation batches have passed
888
+ (`IMPLEMENTATION_BATCHES_STATUS: ALL_8_IMPLEMENTATION_BATCHES_PASS`), followed
889
+ by a hardened documentation/implementation-completeness audit and formal
890
+ pre-release readiness (cross-platform Windows/Linux/macOS packed-candidate
891
+ validation, security audit, code-rot audit - see
892
+ `docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md`).
893
+ No schema version changed for v0.8, and no CLI command from v0.1-v0.7 was
894
+ altered.
895
+
896
+ - **Batch 1** (`docs/reports/v0.8-viewer-runtime-pwa-batch1.md`) froze the
897
+ version-start architecture decisions (React + TypeScript + Vite; normal
898
+ browser + Node-backed loopback server + installable PWA using the same
899
+ application; ephemeral viewer adapters over existing canonical readers,
900
+ never a new persisted viewer artifact) and implemented the `view` CLI
901
+ command (`--root`, `--port`, `--no-open`), the loopback-only (`127.0.0.1`)
902
+ Node viewer server, the built React/Vite/PWA shell (service worker,
903
+ manifest, app-shell precache with an `/api/` cache-boundary denylist), and
904
+ one minimal read-only status endpoint. `npm run build` gained the
905
+ `dist/viewer` build step.
906
+ - **Batch 2** (`v0.8-evidence-index-readers-batch2.md`) added bounded,
907
+ metadata-first evidence discovery (`GET /api/index`) across every existing
908
+ artifact family, honest support-state classification
909
+ (supported/unsupported-version/invalid-structure/unrecognized-kind/
910
+ malformed-json/unreadable), and on-demand full-artifact/media loading
911
+ (`GET /api/artifacts/<handle>`, `GET /api/media/<handle>/<role>`) with
912
+ path-containment/traversal safety.
913
+ - **Batch 3** (`v0.8-observation-svg-inspection-batch3.md`) added the
914
+ observation screenshot/SVG-overlay workspace: runtime target geometry,
915
+ semantics, visibility, overflow, scroll evidence, and on-demand layout
916
+ relationships (`GET /api/observations/<handle>/relationships`, reusing the
917
+ existing canonical `deriveLayoutRelationships` at its one sanctioned
918
+ viewer-server call site).
919
+ - **Batch 4** (`v0.8-comparison-contract-inspection-batch4.md`) added
920
+ before/after comparison and contract/change-scope inspection
921
+ (`GET /api/comparisons/<handle>/view`, `GET /api/evaluations/<handle>/view`),
922
+ exact-identity linked-evidence resolution (never fuzzy matching), and the
923
+ required protected/preserved-failure safety case (a locally successful
924
+ requested change alongside a genuine protected/preserved regression,
925
+ shown as overall `FAIL`, never masked).
926
+ - **Batch 5** (`v0.8-reference-candidate-inspection-batch5.md`) added
927
+ external-reference and reference/candidate inspection: reference image and
928
+ region overlays in the reference's own pixel coordinate domain, explicit
929
+ (never auto-selected) candidate selection, reference/candidate
930
+ compatibility, adequacy, and applicability display.
931
+ - **Batch 6** (`v0.8-binding-fidelity-interaction-batch6.md`) added
932
+ explicit-binding cross-selection (reference region ↔ runtime target, only
933
+ through an explicit `--bindings-file` declaration, never inferred from
934
+ matching names), independent bounded (`1x`-`8x`) zoom/pan per pane,
935
+ conditional view lock (enabled only when compatibility/coordinate-mapping
936
+ genuinely permit it), and on-demand reference-fidelity evaluation
937
+ (`not-evaluated`/`pass`/`fail`) shown alongside, never merged into, any
938
+ selected contract evaluation's own verdict.
939
+ - **Batch 7** (`v0.8-bounded-context-correlation-batch7.md`) added the
940
+ `--context-file` input and a dedicated "Bounded context" mode: session-only
941
+ bounded-agent-context display (identity, adequacy, omissions/truncations
942
+ with required loss visually distinguished from optional loss,
943
+ runtime/static correlation - `correlated`/`ambiguous`/`unavailable`,
944
+ never "owner" language), safe raw-evidence navigation, and explicit
945
+ non-ownership/non-rebuild language. The viewer never calls
946
+ `projectBoundedAgentContext`, `deriveRuntimeStaticCorrelations`, or
947
+ `attachRuntimeStaticCorrelations` - it only displays the exact context it
948
+ was started with.
949
+ - **Batch 8** (`v0.8-integrated-viewer-acceptance-batch8.md`, the final
950
+ implementation batch) integrated and hardened the above rather than adding
951
+ new features: closed three named real-browser coverage gaps (many
952
+ reference regions bound to one runtime target must all cross-highlight;
953
+ reference-fidelity FAIL alongside a genuine frontend-contract PASS for the
954
+ same candidate must display independently with no hidden precedence; a
955
+ bounded context whose sources include two observations sharing a stable
956
+ target id must list every matching source observation, never one); fixed a
957
+ real accessibility gap (a cross-highlighted, non-selected region/target
958
+ rect now exposes `data-highlighted` plus an `aria-label` suffix to
959
+ assistive technology, without disturbing `aria-pressed`'s existing
960
+ single-selection semantics); added the first live-browser PWA proof suite
961
+ (real service-worker registration, zero `/api/` cache-storage entries, and
962
+ a hard server-down "stale evidence must never be presented as current"
963
+ gate, which held); and proved the actual packed-and-installed npm
964
+ candidate (not just the source checkout) works end-to-end through a real
965
+ browser, with read-only evidence-root integrity confirmed via before/after
966
+ content hashing. Standalone/installed-PWA proof did not exceed CDP
967
+ command-acceptance (the emulated display-mode feature was not observed to
968
+ take effect) - recorded honestly as a residual gap, not overstated as
969
+ actual OS-level installation verification.
970
+
971
+ **Architectural invariants proven across all eight batches** (re-audited in
972
+ this documentation/completeness stage): no second observer, relationship
973
+ engine, comparison engine, contract engine, reference model,
974
+ reference-evaluation engine, correlation implementation, or bounded-context
975
+ builder exists anywhere in `src/viewerServer` or `viewer/src` - every
976
+ canonical engine function the viewer displays results from is called from at
977
+ most one designated server-side call site, and several (`compareObservations`,
978
+ `evaluateFrontendContract`, `projectBoundedAgentContext`,
979
+ `deriveRuntimeStaticCorrelations`, `attachRuntimeStaticCorrelations`) are
980
+ never called by the viewer at all. The viewer never runs
981
+ `@dailephd/my-dev-kit`, never mutates target source or any Observer
982
+ artifact, never persists a new viewer-owned evidence family, and every route
983
+ rejects non-`GET`/`HEAD` methods.
984
+
985
+ **Validated on the canonical worktree**: `npm run typecheck`, `npm run
986
+ lint`, `npm test`, `npm run build`, `npm run check:docs`, `npm run
987
+ test:browser`, and `npm run test:security` all pass - see "Post-edit
988
+ validation" in
989
+ `docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md`
990
+ for the completeness-stage counts, and
991
+ `docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md`
992
+ for the formal cross-platform/security readiness stage that followed.
993
+
994
+ Formal Windows/Linux/macOS cross-platform pre-release validation of the
995
+ viewer/PWA surface (through `.github/workflows/pre-release-readiness.yml`,
996
+ now covering v0.1-v0.8) and formal pre-release security review of the
997
+ viewer surface both passed - see the readiness report above, including the
998
+ one security finding it found and fixed (a symlinked-media evidence-root
999
+ escape in the viewer's media route).
1000
+
1001
+ ## Not implemented
1002
+
1003
+ - v0.5 baseline-selection/discovery policy (the caller must supply which
1004
+ baseline to approve/evaluate against; there is no "find the current
1005
+ baseline" command), source ownership, orchestrator/lab product
1006
+ integration, and annotation all remain unimplemented in this repository.
1007
+ (v0.6's bounded runtime projection and runtime/static correlation, the
1008
+ complete v0.7 external-reference correction workflow described above, and
1009
+ the v0.8 interactive viewer described in "v0.8 status" above, *are* now
1010
+ implemented.) A CLI surface for Prompt 8's correction workflow specifically
1011
+ remains unimplemented by design (programmatic-only, library-level use is
1012
+ the current supported entry point) - see "v0.7 Prompt 8 status" above.
1013
+ Structured visual annotation (v0.9) and the full graphical human-LLM
1014
+ workflow (v0.10) remain future and unimplemented.
1015
+
1016
+ ## Next target
1017
+
1018
+ v0.1-v0.8 are implemented, validated, and released (`0.1.0`, `0.2.0`,
1019
+ `0.3.0`, `0.4.0`, `0.5.0`, `0.6.0`, `0.7.0`, `0.8.0`). v0.7 (End-to-End
1020
+ Coding-Agent Frontend Change Review) is fully implemented and released: the
1021
+ external-reference artifact foundation, explicit reference
1022
+ regions/relationships, selected design requirements/tolerance
1023
+ semantics/reference-evidence adequacy, reference applicability
1024
+ and candidate-state compatibility, explicit reference-region/
1025
+ runtime-target binding, structured reference-vs-candidate
1026
+ fidelity evaluation, bounded reference-fidelity projection into
1027
+ the existing v0.6 bounded-agent-context, and the controlled
1028
+ end-to-end correction workflow with real-Chromium proof are all
1029
+ implemented and released as package version `0.7.0`, following a completed
1030
+ pre-release readiness, cross-platform, and security validation stage - see
1031
+ `docs/ROADMAP.md` for v0.7's full scope,
1032
+ `docs/reports/v0.7-implementation-completeness-documentation-reconciliation.md`
1033
+ for the completeness audit, and
1034
+ `docs/reports/v0.7-pre-release-readiness.md` for the cross-platform
1035
+ readiness validation that preceded this release.
1036
+
1037
+ v0.8 (Interactive Local Observation Viewer) is fully implemented, tested,
1038
+ and released - see "v0.8 status" above. v0.8.1 is the current package
1039
+ release: `@dailephd/my-frontend-observer@0.8.1`. All
1040
+ eight implementation batches, the hardened documentation/implementation-
1041
+ completeness audit, and formal pre-release readiness (cross-platform and
1042
+ security validation) have passed - see `docs/ROADMAP.md` for v0.8's full
1043
+ scope,
1044
+ `docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md`
1045
+ for the completeness audit, and
1046
+ `docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md`
1047
+ for the cross-platform readiness validation that preceded this release. v0.9
1048
+ (structured visual annotation) and v0.10 (full graphical human-LLM workflow)
1049
+ remain future - see `docs/ROADMAP.md`.