@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.
- package/CHANGELOG.md +397 -0
- package/LICENSE +21 -0
- package/README.md +255 -0
- package/dist/application/browserCaptureService.d.ts +11 -0
- package/dist/application/browserCaptureService.js +12 -0
- package/dist/application/browserCaptureService.js.map +1 -0
- package/dist/application/comparisonService.d.ts +56 -0
- package/dist/application/comparisonService.js +77 -0
- package/dist/application/comparisonService.js.map +1 -0
- package/dist/application/externalReferencePersistenceService.d.ts +75 -0
- package/dist/application/externalReferencePersistenceService.js +182 -0
- package/dist/application/externalReferencePersistenceService.js.map +1 -0
- package/dist/application/frontendContractEvaluationService.d.ts +49 -0
- package/dist/application/frontendContractEvaluationService.js +112 -0
- package/dist/application/frontendContractEvaluationService.js.map +1 -0
- package/dist/application/frontendContractPersistenceService.d.ts +56 -0
- package/dist/application/frontendContractPersistenceService.js +91 -0
- package/dist/application/frontendContractPersistenceService.js.map +1 -0
- package/dist/application/observationPersistence.d.ts +59 -0
- package/dist/application/observationPersistence.js +79 -0
- package/dist/application/observationPersistence.js.map +1 -0
- package/dist/application/projectCheckService.d.ts +3 -0
- package/dist/application/projectCheckService.js +169 -0
- package/dist/application/projectCheckService.js.map +1 -0
- package/dist/application/projectWorkflowService.d.ts +46 -0
- package/dist/application/projectWorkflowService.js +92 -0
- package/dist/application/projectWorkflowService.js.map +1 -0
- package/dist/application/referenceFidelityEvaluationService.d.ts +28 -0
- package/dist/application/referenceFidelityEvaluationService.js +45 -0
- package/dist/application/referenceFidelityEvaluationService.js.map +1 -0
- package/dist/artifacts/artifactReader.d.ts +19 -0
- package/dist/artifacts/artifactReader.js +36 -0
- package/dist/artifacts/artifactReader.js.map +1 -0
- package/dist/artifacts/artifactWriter.d.ts +25 -0
- package/dist/artifacts/artifactWriter.js +68 -0
- package/dist/artifacts/artifactWriter.js.map +1 -0
- package/dist/artifacts/comparisonArtifactReader.d.ts +18 -0
- package/dist/artifacts/comparisonArtifactReader.js +35 -0
- package/dist/artifacts/comparisonArtifactReader.js.map +1 -0
- package/dist/artifacts/comparisonArtifactWriter.d.ts +41 -0
- package/dist/artifacts/comparisonArtifactWriter.js +67 -0
- package/dist/artifacts/comparisonArtifactWriter.js.map +1 -0
- package/dist/artifacts/externalReferenceArtifactReader.d.ts +18 -0
- package/dist/artifacts/externalReferenceArtifactReader.js +35 -0
- package/dist/artifacts/externalReferenceArtifactReader.js.map +1 -0
- package/dist/artifacts/externalReferenceArtifactWriter.d.ts +44 -0
- package/dist/artifacts/externalReferenceArtifactWriter.js +77 -0
- package/dist/artifacts/externalReferenceArtifactWriter.js.map +1 -0
- package/dist/artifacts/frontendContractArtifactReader.d.ts +24 -0
- package/dist/artifacts/frontendContractArtifactReader.js +47 -0
- package/dist/artifacts/frontendContractArtifactReader.js.map +1 -0
- package/dist/artifacts/frontendContractArtifactWriter.d.ts +34 -0
- package/dist/artifacts/frontendContractArtifactWriter.js +70 -0
- package/dist/artifacts/frontendContractArtifactWriter.js.map +1 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.d.ts +17 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.js +34 -0
- package/dist/artifacts/frontendContractEvaluationArtifactReader.js.map +1 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.d.ts +32 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.js +58 -0
- package/dist/artifacts/frontendContractEvaluationArtifactWriter.js.map +1 -0
- package/dist/artifacts/types.d.ts +17 -0
- package/dist/artifacts/types.js +2 -0
- package/dist/artifacts/types.js.map +1 -0
- package/dist/browser/chromiumAdapter.d.ts +21 -0
- package/dist/browser/chromiumAdapter.js +204 -0
- package/dist/browser/chromiumAdapter.js.map +1 -0
- package/dist/browser/evidenceCapture.d.ts +62 -0
- package/dist/browser/evidenceCapture.js +500 -0
- package/dist/browser/evidenceCapture.js.map +1 -0
- package/dist/browser/scrollCapture.d.ts +32 -0
- package/dist/browser/scrollCapture.js +163 -0
- package/dist/browser/scrollCapture.js.map +1 -0
- package/dist/browser/types.d.ts +24 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +2411 -0
- package/dist/cli.js.map +1 -0
- package/dist/domain/boundedAgentContext.d.ts +226 -0
- package/dist/domain/boundedAgentContext.js +355 -0
- package/dist/domain/boundedAgentContext.js.map +1 -0
- package/dist/domain/boundedAgentContextCorrelation.d.ts +74 -0
- package/dist/domain/boundedAgentContextCorrelation.js +441 -0
- package/dist/domain/boundedAgentContextCorrelation.js.map +1 -0
- package/dist/domain/boundedAgentContextIdentity.d.ts +26 -0
- package/dist/domain/boundedAgentContextIdentity.js +69 -0
- package/dist/domain/boundedAgentContextIdentity.js.map +1 -0
- package/dist/domain/boundedAgentContextProjection.d.ts +71 -0
- package/dist/domain/boundedAgentContextProjection.js +477 -0
- package/dist/domain/boundedAgentContextProjection.js.map +1 -0
- package/dist/domain/comparison.d.ts +220 -0
- package/dist/domain/comparison.js +350 -0
- package/dist/domain/comparison.js.map +1 -0
- package/dist/domain/comparisonEngine.d.ts +76 -0
- package/dist/domain/comparisonEngine.js +734 -0
- package/dist/domain/comparisonEngine.js.map +1 -0
- package/dist/domain/comparisonIdentity.d.ts +13 -0
- package/dist/domain/comparisonIdentity.js +46 -0
- package/dist/domain/comparisonIdentity.js.map +1 -0
- package/dist/domain/completion.d.ts +30 -0
- package/dist/domain/completion.js +22 -0
- package/dist/domain/completion.js.map +1 -0
- package/dist/domain/diagnostics.d.ts +17 -0
- package/dist/domain/diagnostics.js +77 -0
- package/dist/domain/diagnostics.js.map +1 -0
- package/dist/domain/evidence.d.ts +29 -0
- package/dist/domain/evidence.js +59 -0
- package/dist/domain/evidence.js.map +1 -0
- package/dist/domain/explicitState.d.ts +40 -0
- package/dist/domain/explicitState.js +54 -0
- package/dist/domain/explicitState.js.map +1 -0
- package/dist/domain/externalReference.d.ts +158 -0
- package/dist/domain/externalReference.js +167 -0
- package/dist/domain/externalReference.js.map +1 -0
- package/dist/domain/externalReferenceApplicability.d.ts +43 -0
- package/dist/domain/externalReferenceApplicability.js +52 -0
- package/dist/domain/externalReferenceApplicability.js.map +1 -0
- package/dist/domain/externalReferenceCompatibility.d.ts +40 -0
- package/dist/domain/externalReferenceCompatibility.js +48 -0
- package/dist/domain/externalReferenceCompatibility.js.map +1 -0
- package/dist/domain/externalReferenceFidelity.d.ts +171 -0
- package/dist/domain/externalReferenceFidelity.js +419 -0
- package/dist/domain/externalReferenceFidelity.js.map +1 -0
- package/dist/domain/externalReferenceIdentity.d.ts +38 -0
- package/dist/domain/externalReferenceIdentity.js +70 -0
- package/dist/domain/externalReferenceIdentity.js.map +1 -0
- package/dist/domain/externalReferenceImage.d.ts +35 -0
- package/dist/domain/externalReferenceImage.js +160 -0
- package/dist/domain/externalReferenceImage.js.map +1 -0
- package/dist/domain/externalReferenceRegionRelationships.d.ts +63 -0
- package/dist/domain/externalReferenceRegionRelationships.js +98 -0
- package/dist/domain/externalReferenceRegionRelationships.js.map +1 -0
- package/dist/domain/externalReferenceRegions.d.ts +65 -0
- package/dist/domain/externalReferenceRegions.js +105 -0
- package/dist/domain/externalReferenceRegions.js.map +1 -0
- package/dist/domain/externalReferenceRequirementIdentity.d.ts +12 -0
- package/dist/domain/externalReferenceRequirementIdentity.js +35 -0
- package/dist/domain/externalReferenceRequirementIdentity.js.map +1 -0
- package/dist/domain/externalReferenceRequirements.d.ts +215 -0
- package/dist/domain/externalReferenceRequirements.js +401 -0
- package/dist/domain/externalReferenceRequirements.js.map +1 -0
- package/dist/domain/externalReferenceRuntimeBinding.d.ts +146 -0
- package/dist/domain/externalReferenceRuntimeBinding.js +183 -0
- package/dist/domain/externalReferenceRuntimeBinding.js.map +1 -0
- package/dist/domain/frontendContractEvaluation.d.ts +57 -0
- package/dist/domain/frontendContractEvaluation.js +454 -0
- package/dist/domain/frontendContractEvaluation.js.map +1 -0
- package/dist/domain/frontendContractEvaluationArtifact.d.ts +65 -0
- package/dist/domain/frontendContractEvaluationArtifact.js +108 -0
- package/dist/domain/frontendContractEvaluationArtifact.js.map +1 -0
- package/dist/domain/frontendContractIdentity.d.ts +39 -0
- package/dist/domain/frontendContractIdentity.js +70 -0
- package/dist/domain/frontendContractIdentity.js.map +1 -0
- package/dist/domain/frontendContracts.d.ts +188 -0
- package/dist/domain/frontendContracts.js +260 -0
- package/dist/domain/frontendContracts.js.map +1 -0
- package/dist/domain/identity.d.ts +21 -0
- package/dist/domain/identity.js +47 -0
- package/dist/domain/identity.js.map +1 -0
- package/dist/domain/referenceCorrectionIdentity.d.ts +40 -0
- package/dist/domain/referenceCorrectionIdentity.js +77 -0
- package/dist/domain/referenceCorrectionIdentity.js.map +1 -0
- package/dist/domain/referenceCorrectionWorkflow.d.ts +160 -0
- package/dist/domain/referenceCorrectionWorkflow.js +165 -0
- package/dist/domain/referenceCorrectionWorkflow.js.map +1 -0
- package/dist/domain/referenceFidelityProjection.d.ts +65 -0
- package/dist/domain/referenceFidelityProjection.js +135 -0
- package/dist/domain/referenceFidelityProjection.js.map +1 -0
- package/dist/domain/relationships.d.ts +210 -0
- package/dist/domain/relationships.js +352 -0
- package/dist/domain/relationships.js.map +1 -0
- package/dist/domain/schema.d.ts +269 -0
- package/dist/domain/schema.js +442 -0
- package/dist/domain/schema.js.map +1 -0
- package/dist/domain/scrollEvidence.d.ts +51 -0
- package/dist/domain/scrollEvidence.js +134 -0
- package/dist/domain/scrollEvidence.js.map +1 -0
- package/dist/index.d.ts +114 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/projectWorkflow/aliasCatalog.d.ts +21 -0
- package/dist/projectWorkflow/aliasCatalog.js +67 -0
- package/dist/projectWorkflow/aliasCatalog.js.map +1 -0
- package/dist/projectWorkflow/checkAcceptance.d.ts +25 -0
- package/dist/projectWorkflow/checkAcceptance.js +55 -0
- package/dist/projectWorkflow/checkAcceptance.js.map +1 -0
- package/dist/projectWorkflow/checkResult.d.ts +85 -0
- package/dist/projectWorkflow/checkResult.js +101 -0
- package/dist/projectWorkflow/checkResult.js.map +1 -0
- package/dist/projectWorkflow/projectConfig.d.ts +43 -0
- package/dist/projectWorkflow/projectConfig.js +84 -0
- package/dist/projectWorkflow/projectConfig.js.map +1 -0
- package/dist/projectWorkflow/projectDiscovery.d.ts +9 -0
- package/dist/projectWorkflow/projectDiscovery.js +20 -0
- package/dist/projectWorkflow/projectDiscovery.js.map +1 -0
- package/dist/projectWorkflow/projectPaths.d.ts +8 -0
- package/dist/projectWorkflow/projectPaths.js +23 -0
- package/dist/projectWorkflow/projectPaths.js.map +1 -0
- package/dist/request/paths.d.ts +14 -0
- package/dist/request/paths.js +33 -0
- package/dist/request/paths.js.map +1 -0
- package/dist/request/request.d.ts +111 -0
- package/dist/request/request.js +464 -0
- package/dist/request/request.js.map +1 -0
- package/dist/safety/policy.d.ts +14 -0
- package/dist/safety/policy.js +81 -0
- package/dist/safety/policy.js.map +1 -0
- package/dist/viewer/assets/index-CN_yb9Uf.css +1 -0
- package/dist/viewer/assets/index-D98S1_2d.js +9 -0
- package/dist/viewer/icons/icon-192.png +0 -0
- package/dist/viewer/icons/icon-512.png +0 -0
- package/dist/viewer/index.html +15 -0
- package/dist/viewer/manifest.webmanifest +1 -0
- package/dist/viewer/registerSW.js +1 -0
- package/dist/viewer/sw.js +1 -0
- package/dist/viewer/workbox-9c191d2f.js +1 -0
- package/dist/viewerServer/context.d.ts +48 -0
- package/dist/viewerServer/context.js +60 -0
- package/dist/viewerServer/context.js.map +1 -0
- package/dist/viewerServer/evidence/classify.d.ts +59 -0
- package/dist/viewerServer/evidence/classify.js +124 -0
- package/dist/viewerServer/evidence/classify.js.map +1 -0
- package/dist/viewerServer/evidence/comparisonView.d.ts +28 -0
- package/dist/viewerServer/evidence/comparisonView.js +43 -0
- package/dist/viewerServer/evidence/comparisonView.js.map +1 -0
- package/dist/viewerServer/evidence/contextSourceView.d.ts +25 -0
- package/dist/viewerServer/evidence/contextSourceView.js +20 -0
- package/dist/viewerServer/evidence/contextSourceView.js.map +1 -0
- package/dist/viewerServer/evidence/discovery.d.ts +31 -0
- package/dist/viewerServer/evidence/discovery.js +78 -0
- package/dist/viewerServer/evidence/discovery.js.map +1 -0
- package/dist/viewerServer/evidence/evaluationView.d.ts +32 -0
- package/dist/viewerServer/evidence/evaluationView.js +50 -0
- package/dist/viewerServer/evidence/evaluationView.js.map +1 -0
- package/dist/viewerServer/evidence/handles.d.ts +21 -0
- package/dist/viewerServer/evidence/handles.js +43 -0
- package/dist/viewerServer/evidence/handles.js.map +1 -0
- package/dist/viewerServer/evidence/index.d.ts +41 -0
- package/dist/viewerServer/evidence/index.js +82 -0
- package/dist/viewerServer/evidence/index.js.map +1 -0
- package/dist/viewerServer/evidence/limits.d.ts +27 -0
- package/dist/viewerServer/evidence/limits.js +28 -0
- package/dist/viewerServer/evidence/limits.js.map +1 -0
- package/dist/viewerServer/evidence/linkedEvidence.d.ts +43 -0
- package/dist/viewerServer/evidence/linkedEvidence.js +151 -0
- package/dist/viewerServer/evidence/linkedEvidence.js.map +1 -0
- package/dist/viewerServer/evidence/mediaResolver.d.ts +16 -0
- package/dist/viewerServer/evidence/mediaResolver.js +85 -0
- package/dist/viewerServer/evidence/mediaResolver.js.map +1 -0
- package/dist/viewerServer/evidence/observationView.d.ts +29 -0
- package/dist/viewerServer/evidence/observationView.js +46 -0
- package/dist/viewerServer/evidence/observationView.js.map +1 -0
- package/dist/viewerServer/evidence/pathSafety.d.ts +11 -0
- package/dist/viewerServer/evidence/pathSafety.js +31 -0
- package/dist/viewerServer/evidence/pathSafety.js.map +1 -0
- package/dist/viewerServer/evidence/projection.d.ts +55 -0
- package/dist/viewerServer/evidence/projection.js +152 -0
- package/dist/viewerServer/evidence/projection.js.map +1 -0
- package/dist/viewerServer/evidence/referenceView.d.ts +133 -0
- package/dist/viewerServer/evidence/referenceView.js +169 -0
- package/dist/viewerServer/evidence/referenceView.js.map +1 -0
- package/dist/viewerServer/httpServer.d.ts +27 -0
- package/dist/viewerServer/httpServer.js +381 -0
- package/dist/viewerServer/httpServer.js.map +1 -0
- package/dist/viewerServer/openBrowser.d.ts +7 -0
- package/dist/viewerServer/openBrowser.js +32 -0
- package/dist/viewerServer/openBrowser.js.map +1 -0
- package/dist/viewerServer/port.d.ts +16 -0
- package/dist/viewerServer/port.js +19 -0
- package/dist/viewerServer/port.js.map +1 -0
- package/dist/viewerServer/viewerService.d.ts +62 -0
- package/dist/viewerServer/viewerService.js +88 -0
- package/dist/viewerServer/viewerService.js.map +1 -0
- package/docs/ARCHITECTURE.md +1286 -0
- package/docs/CI_CD.md +250 -0
- package/docs/COMMANDS.md +972 -0
- package/docs/CONTRACTS.md +1856 -0
- package/docs/CURRENT_STATE.md +1049 -0
- package/docs/DEVELOPMENT.md +202 -0
- package/docs/DOCUMENTATION_PRESERVATION_POLICY.md +50 -0
- package/docs/PROJECT_DESCRIPTION.md +2221 -0
- package/docs/PROJECT_MILESTONES.md +2526 -0
- package/docs/PROJECT_OVERVIEW.md +150 -0
- package/docs/QUICKSTART.md +83 -0
- package/docs/RELEASE.md +27 -0
- package/docs/ROADMAP.md +641 -0
- package/docs/SECURITY.md +218 -0
- package/docs/WORKFLOWS.md +642 -0
- package/docs/plans/v0.8-implementation-plan.md +655 -0
- package/docs/plans/v0.8.1-cli-usability-patch-plan.md +505 -0
- package/docs/reports/v0.7-bounded-fidelity-context-prompt7.md +243 -0
- package/docs/reports/v0.7-implementation-completeness-documentation-reconciliation.md +497 -0
- package/docs/reports/v0.7-pre-release-readiness.md +337 -0
- package/docs/reports/v0.7-reference-binding-prompt5.md +223 -0
- package/docs/reports/v0.7-reference-compatibility-prompt4.md +234 -0
- package/docs/reports/v0.7-reference-correction-workflow-prompt8.md +222 -0
- package/docs/reports/v0.7-reference-fidelity-prompt6.md +216 -0
- package/docs/reports/v0.7-reference-foundation-prompt1.md +151 -0
- package/docs/reports/v0.7-reference-regions-prompt2.md +195 -0
- package/docs/reports/v0.7-reference-requirements-prompt3.md +217 -0
- package/docs/reports/v0.7-release-prep.md +423 -0
- package/docs/reports/v0.8-binding-fidelity-interaction-batch6.md +279 -0
- package/docs/reports/v0.8-bounded-context-correlation-batch7.md +233 -0
- package/docs/reports/v0.8-comparison-contract-inspection-batch4.md +279 -0
- package/docs/reports/v0.8-evidence-index-readers-batch2.md +247 -0
- package/docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md +741 -0
- package/docs/reports/v0.8-integrated-viewer-acceptance-batch8.md +128 -0
- package/docs/reports/v0.8-observation-svg-inspection-batch3.md +223 -0
- package/docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md +687 -0
- package/docs/reports/v0.8-reference-candidate-inspection-batch5.md +232 -0
- package/docs/reports/v0.8-viewer-runtime-pwa-batch1.md +278 -0
- package/docs/reports/v0.8.1-check-orchestration-prompt2.md +69 -0
- package/docs/reports/v0.8.1-implementation-completeness-documentation-reconciliation.md +114 -0
- package/docs/reports/v0.8.1-prerelease-readiness-cross-platform-security-code-rot.md +170 -0
- package/docs/reports/v0.8.1-project-workflow-foundation-prompt1.md +66 -0
- 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`.
|