@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,218 @@
1
+ # Security
2
+
3
+ Project acceptance paths are portable, project-relative, and realpath-contained before use, including symlink/junction escape rejection. `current` alias replacement changes only catalog metadata and never deletes or overwrites canonical evidence. `check` adds no generic file-serving route, inferred binding, source mutation, persisted check artifact, or image bytes to JSON; configured references must be explicitly approved. JSON artifact paths are project-relative.
4
+
5
+ ## Current controls
6
+
7
+ `my-frontend-observer` launches a real, sandboxed Chromium browser
8
+ (`src/browser/chromiumAdapter.ts`) and enforces a conservative, local-first,
9
+ credential-free, non-destructive browser/network boundary
10
+ (`src/safety/policy.ts`) as actual product behavior, covered by real-Chromium
11
+ tests:
12
+
13
+ - allowed schemes are `http`/`https` only;
14
+ - allowed hosts are loopback only (`localhost`, `127.0.0.1`, `::1`, and any
15
+ `127.x.x.x` form) - no DNS resolution, no arbitrary "local dev host";
16
+ - credential-bearing URLs (`user:pass@host`) are rejected;
17
+ - the initial target, every navigation redirect, and every subresource
18
+ request are independently classified against the same loopback policy and
19
+ blocked before being contacted if unsafe;
20
+ - popups and downloads are never followed/saved (reported as non-fatal
21
+ diagnostics);
22
+ - navigation and readiness are bounded by explicit, request-configured
23
+ timeouts - no unbounded wait;
24
+ - the Chromium browser/context/page are reliably closed on every exit path
25
+ (success, safety rejection, navigation/readiness failure, or an
26
+ unexpected internal error);
27
+ - the observed target's own content/source is never modified by observation.
28
+
29
+ ## Comparison (`compare`, shipped as part of the published `0.4.0` package)
30
+
31
+ `my-frontend-observer compare` introduces no new network or browser
32
+ surface: it never
33
+ launches Chromium, never navigates, and never re-observes a target - it only
34
+ reads two local, already-persisted observation-artifact `manifest.json`
35
+ files (`src/artifacts/artifactReader.ts`) through the same structural
36
+ validator the observation writer uses, computes a pure in-memory
37
+ comparison, and writes one local comparison `manifest.json`
38
+ (`src/artifacts/comparisonArtifactWriter.ts`). Manifest content is parsed
39
+ as JSON only and is never executed (no `eval`, no dynamic code loading from
40
+ a manifest).
41
+
42
+ ## Frontend contracts (`approve-baseline`/`save-change-contract`/`evaluate-contract`, shipped as part of the published `0.5.0` package)
43
+
44
+ These three commands introduce no new browser or network surface:
45
+ `src/application/frontendContractPersistenceService.ts` and
46
+ `src/application/frontendContractEvaluationService.ts` import nothing from
47
+ `src/browser/` and never launch Chromium. `approve-baseline` and
48
+ `save-change-contract` validate and persist a local JSON contract file
49
+ (parsed as JSON only, never executed); `evaluate-contract` reads
50
+ already-persisted local observation/comparison/contract artifacts and runs
51
+ the pure `evaluateFrontendContract` function. None of the three navigates,
52
+ re-observes a target, or contacts a network resource.
53
+
54
+ ## Bounded agent context and correlation (v0.6, released as `0.6.0`)
55
+
56
+ `src/domain/boundedAgentContextProjection.ts` and
57
+ `src/domain/boundedAgentContextCorrelation.ts` introduce no new browser or
58
+ network surface: neither imports anything from `src/browser/`, neither
59
+ launches Chromium or navigates, and neither performs filesystem or network
60
+ I/O of its own. Both are pure, in-memory functions over already-captured
61
+ observation/comparison/contract evidence plus caller-supplied candidate
62
+ static-evidence records - the correlation module never reads a file path or
63
+ retrieves anything itself; the caller (outside this repository) is
64
+ responsible for however it obtained the candidate evidence it passes in.
65
+ Neither module embeds source code snippets, redacts anything, or invokes
66
+ another ecosystem tool (`@dailephd/my-dev-kit` is not a dependency of either
67
+ module). Bounded runtime projections may include existing screenshot *path
68
+ references* (never embedded bytes), consistent with every other artifact
69
+ family's existing reference-not-embed discipline.
70
+
71
+ ## External visual-reference security and privacy boundary (v0.7, released as `0.7.0`)
72
+
73
+ External visual-reference support (`import-reference`/`approve-reference`/
74
+ `evaluate-reference-fidelity`, plus the programmatic correction-workflow
75
+ coordinator) is released as part of the published `0.7.0` package. Imported reference images remain
76
+ local-first evidence: `import-reference` reads a local file path only,
77
+ never a URL, and no code path in this repository uploads a reference image,
78
+ a candidate screenshot, source code, or any derived evidence to an external
79
+ service. Reference/candidate compatibility and fidelity evaluation are pure,
80
+ in-process computations over already-loaded artifacts - neither launches a
81
+ network request.
82
+
83
+ Bounded local-file safety for reference images is a frozen, source-verified
84
+ policy, not an open decision: `EXTERNAL_REFERENCE_SUPPORTED_IMAGE_FORMATS`
85
+ (`png`/`jpeg`/`webp`, detected from header/magic bytes only, never from a
86
+ caller-declared file extension), `EXTERNAL_REFERENCE_MAX_IMAGE_BYTES`
87
+ (20,000,000 bytes), and `[EXTERNAL_REFERENCE_MIN_DIMENSION_PX,
88
+ EXTERNAL_REFERENCE_MAX_DIMENSION_PX]` (`[1, 8192]` pixels per side, parsed
89
+ from the same bounded header bytes, never a full pixel decode) are all
90
+ enforced before any artifact is persisted; an unsupported/undetectable
91
+ format, an over-limit file, or invalid/out-of-bound dimensions is rejected
92
+ outright (`unsupported-image-format`/`invalid-image-dimensions`/
93
+ `image-too-large`), never silently clamped or accepted.
94
+
95
+ Reference images are treated as untrusted data, not executable content: the
96
+ format/dimension detector never evaluates embedded code, never dynamically
97
+ loads a script, and never treats image metadata as an instruction source -
98
+ only bounded header-byte inspection is performed, no general-purpose image
99
+ or video codec is invoked. Explicit, caller-supplied state
100
+ (`--state-file`/`--applicability-file`, `theme`/`applicationState`/
101
+ `authenticatedState`) is a closed, bounded label vocabulary with no field
102
+ capable of holding a credential, token, cookie, session id, or authorization
103
+ header - `authenticatedState` accepts only the literal values
104
+ `'authenticated'`/`'unauthenticated'`.
105
+
106
+ Reference artifacts and the bounded correction handoff preserve path privacy
107
+ and boundedness: every reference/observation/binding/fidelity/context
108
+ identity function is a pure hash of semantic content only - an operational
109
+ file path (the image path, a `--regions-file`/`--requirements-file`/
110
+ `--applicability-file`/`--state-file`/`--bindings-file` path, or an artifact
111
+ root directory) is never included in any logical identity, and importing
112
+ the same semantic reference content from two different filesystem locations
113
+ produces the same `referenceRequestId`. The bounded coding-agent handoff
114
+ (`ReferenceCorrectionHandoff`) never embeds raw reference image bytes, a
115
+ full `ObservationArtifact`, or a source excerpt - only stable identifiers,
116
+ bounded fidelity mismatch records, and evidence path *references*.
117
+
118
+ Import never silently promotes an image to an approved reference: only the
119
+ explicit `approve-reference` command (or `approveExternalReference`
120
+ programmatically) transitions a reference out of the `'imported'` lifecycle
121
+ state, and the v0.7 correction workflow's `prepareReferenceCorrection`/
122
+ `reviewReferenceCorrectionAttempt` both fail closed if the supplied
123
+ reference is not already approved. Neither function - nor anything either
124
+ calls - ever invokes `approveExternalReference` or
125
+ `approveAndPersistBaseline` itself; a `'pass'` review result is reported as
126
+ `approvalEligible: true`, a plain flag, never an automatic approval action.
127
+
128
+ Reference/candidate comparison and fidelity evaluation do not broaden the
129
+ existing browser/network boundary: candidate rendering continues through the
130
+ existing loopback-only Chromium observation path unchanged, and reference
131
+ evaluation itself never launches a browser at all (it consumes only
132
+ already-captured `ObservationArtifact` evidence). The v0.7 correction
133
+ workflow never edits target source: `src/domain/referenceCorrectionWorkflow.ts`
134
+ and everything it imports contain no filesystem-write call, no
135
+ `child_process` invocation, and no patch-application mechanism - the actual
136
+ source edit between review attempts is always the responsibility of an
137
+ external implementation actor (a human or a coding agent), never this
138
+ package's own product code. No remote AI/model-provider dependency was
139
+ introduced anywhere in v0.7.
140
+
141
+ ## Interactive local viewer (v0.8, released as `0.8.0`)
142
+
143
+ `my-frontend-observer view` (`src/viewerServer/`, `viewer/`) is implemented,
144
+ tested, and formally security-reviewed. The properties below were verified
145
+ locally/manually during implementation (Batches 1-8) and then re-verified
146
+ through the formal pre-release security audit - see
147
+ `docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md`,
148
+ which also found and fixed one real finding: a media filename that is
149
+ itself a symlink/junction pointing outside the evidence root could
150
+ previously have had its linked-to file's content served. `checkExists()`
151
+ (`src/viewerServer/evidence/mediaResolver.ts`) now uses `lstat()` and
152
+ rejects any non-regular-file entry, closing that escape.
153
+
154
+ - **Loopback-only, fixed local origin**: the Node viewer server binds only
155
+ to `127.0.0.1` (never `0.0.0.0`), never a configurable remote host.
156
+ `--port` selects the TCP port only (default `4319`); an explicit alternate
157
+ port fails startup if already in use rather than silently falling back.
158
+ - **Explicit evidence root, path containment, traversal rejection**: `--root`
159
+ is the only filesystem root the server ever reads from. Every artifact/
160
+ media route resolves a caller-supplied handle against that root through
161
+ the existing canonical discovery/classification path and rejects any
162
+ handle that would resolve outside it - the server never exposes `--root`
163
+ as a generic static directory or arbitrary filesystem path, and never
164
+ interprets an `EvidenceReference` as a filesystem path to the browser.
165
+ - **No arbitrary filesystem browsing, no static-candidate path
166
+ interpretation**: the viewer offers no directory-listing or free-path
167
+ endpoint; every route addresses one specific, already-discovered handle.
168
+ - **Read-only API**: every `/api/*` route rejects non-`GET`/`HEAD` methods
169
+ with `405` at a single top-of-handler check
170
+ (`src/viewerServer/httpServer.ts`), covering every route uniformly,
171
+ including ones added in later batches.
172
+ - **No target-source or evidence mutation**: the viewer server has no
173
+ filesystem-write call anywhere in its own code path; it never edits
174
+ target source and never modifies, supersedes, or persists a new instance
175
+ of any existing Observer evidence artifact.
176
+ - **Binding/context files are explicit local session input, not persisted
177
+ evidence**: `--bindings-file`/`--context-file` are read once at startup,
178
+ validated through the existing canonical validators, held only in server
179
+ memory, and never written into any Observer artifact or exposed as a
180
+ filesystem path to the browser. The viewer never runs
181
+ `@dailephd/my-dev-kit` and never rebuilds a bounded context or its
182
+ correlation from these files - it only displays what it was given.
183
+ - **PWA shell cache scope**: the service worker precaches only the built
184
+ application shell (HTML/JS/CSS/icons/manifest); `navigateFallbackDenylist`
185
+ excludes every `/api/` route from the precache, verified both statically
186
+ (built `sw.js`) and live (real Chromium: zero Cache Storage entries under
187
+ any `/api/` pathname after normal use - see
188
+ `docs/reports/v0.8-integrated-viewer-acceptance-batch8.md`).
189
+ - **Server-down stale-evidence protection**: proven in real Chromium - after
190
+ the server is stopped and the page reloaded, the app shell may still
191
+ render from the precache, but the evidence-dependent surface shows an
192
+ explicit unavailable state, never previously-fetched evidence presented
193
+ as current.
194
+
195
+ ## Not yet addressed
196
+
197
+ Certificate-failure-specific handling, permission-prompt-specific handling
198
+ (Chromium's default deny-all applies; no permission is ever explicitly
199
+ granted), and any non-loopback/remote browsing mode remain unimplemented and
200
+ out of scope. `@dailephd/my-frontend-observer@0.8.1` is published to npm, and a
201
+ pre-release readiness CI workflow (Windows/Linux/macOS packed-candidate
202
+ validation, now covering the v0.8 viewer alongside every earlier version's
203
+ packed behavior) exists (see `docs/CI_CD.md`). The v0.7 external-reference/
204
+ correction-workflow security properties above are released as part of
205
+ `0.7.0`, following a completed cross-platform pre-release security
206
+ validation stage (see `docs/reports/v0.7-pre-release-readiness.md`). The
207
+ v0.8 interactive viewer's security boundary described above is released as
208
+ part of `0.8.0`, following a completed formal pre-release cross-platform
209
+ security validation stage (see
210
+ `docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md`).
211
+ Symlink/junction filesystem-escape handling for the viewer's raw-evidence
212
+ routes is now exercised by a dedicated regression test
213
+ (`tests/unit/viewerEvidenceServer.test.ts`), which caught and led to the fix
214
+ described above. Annotation (v0.9) remains a future, unimplemented concern
215
+ with its own security review still to come. None of this expands the
216
+ security scope above: remote browsing, certificate handling,
217
+ permission-prompt handling, and future annotation-specific file handling
218
+ remain separate, unimplemented concerns.