@dailephd/my-frontend-observer 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/CHANGELOG.md +490 -479
  2. package/LICENSE +21 -21
  3. package/README.md +375 -365
  4. package/dist/application/projectCheckService.d.ts +6 -0
  5. package/dist/application/projectCheckService.js +8 -1
  6. package/dist/application/projectCheckService.js.map +1 -1
  7. package/dist/application/projectWorkflowService.d.ts +7 -2
  8. package/dist/application/projectWorkflowService.js +10 -3
  9. package/dist/application/projectWorkflowService.js.map +1 -1
  10. package/dist/cli.js +510 -510
  11. package/dist/viewer/index.html +13 -13
  12. package/dist/viewer/sw.js +1 -1
  13. package/docs/ARCHITECTURE.md +1394 -1385
  14. package/docs/CI_CD.md +349 -338
  15. package/docs/COMMANDS.md +1035 -1026
  16. package/docs/CONTRACTS.md +1971 -1960
  17. package/docs/CURRENT_STATE.md +1277 -1252
  18. package/docs/DEVELOPMENT.md +240 -237
  19. package/docs/DOCUMENTATION_PRESERVATION_POLICY.md +50 -50
  20. package/docs/PROJECT_DESCRIPTION.md +2248 -2224
  21. package/docs/PROJECT_MILESTONES.md +2681 -2558
  22. package/docs/PROJECT_OVERVIEW.md +200 -196
  23. package/docs/QUICKSTART.md +100 -100
  24. package/docs/RELEASE.md +37 -36
  25. package/docs/ROADMAP.md +1105 -1034
  26. package/docs/SECURITY.md +297 -297
  27. package/docs/WORKFLOWS.md +806 -796
  28. package/docs/plans/v0.10-implementation-plan.md +1509 -1509
  29. package/docs/plans/v0.8-implementation-plan.md +655 -655
  30. package/docs/plans/v0.8.1-cli-usability-patch-plan.md +505 -505
  31. package/docs/plans/v0.9-implementation-plan.md +1529 -1529
  32. package/docs/plans/v0.9.1-implementation-plan.md +468 -468
  33. package/docs/reports/v0.10-batch1-visual-change-workflow-foundation.md +102 -102
  34. package/docs/reports/v0.10-batch2-project-composition-check-recording.md +103 -103
  35. package/docs/reports/v0.10-batch3-viewer-visual-change-workspace.md +93 -93
  36. package/docs/reports/v0.10-batch4-actual-frontend-entry.md +59 -59
  37. package/docs/reports/v0.10-batch5-reference-driven-entry.md +238 -238
  38. package/docs/reports/v0.10-batch6-coding-agent-handoff.md +85 -85
  39. package/docs/reports/v0.10-batch7-correction-review-acceptance.md +145 -145
  40. package/docs/reports/v0.10-batch8-integrated-acceptance.md +109 -109
  41. package/docs/reports/v0.10-implementation-completeness-documentation-reconciliation.md +344 -344
  42. package/docs/reports/v0.10-pre-release-readiness.md +120 -120
  43. package/docs/reports/v0.10-release-preparation.md +70 -70
  44. package/docs/reports/v0.10.1-project-check-baseline-context-implementation.md +86 -0
  45. package/docs/reports/v0.7-bounded-fidelity-context-prompt7.md +243 -243
  46. package/docs/reports/v0.7-implementation-completeness-documentation-reconciliation.md +497 -497
  47. package/docs/reports/v0.7-pre-release-readiness.md +337 -337
  48. package/docs/reports/v0.7-reference-binding-prompt5.md +223 -223
  49. package/docs/reports/v0.7-reference-compatibility-prompt4.md +234 -234
  50. package/docs/reports/v0.7-reference-correction-workflow-prompt8.md +222 -222
  51. package/docs/reports/v0.7-reference-fidelity-prompt6.md +216 -216
  52. package/docs/reports/v0.7-reference-foundation-prompt1.md +151 -151
  53. package/docs/reports/v0.7-reference-regions-prompt2.md +195 -195
  54. package/docs/reports/v0.7-reference-requirements-prompt3.md +217 -217
  55. package/docs/reports/v0.7-release-prep.md +423 -423
  56. package/docs/reports/v0.8-binding-fidelity-interaction-batch6.md +279 -279
  57. package/docs/reports/v0.8-bounded-context-correlation-batch7.md +233 -233
  58. package/docs/reports/v0.8-comparison-contract-inspection-batch4.md +279 -279
  59. package/docs/reports/v0.8-evidence-index-readers-batch2.md +247 -247
  60. package/docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md +741 -741
  61. package/docs/reports/v0.8-integrated-viewer-acceptance-batch8.md +128 -128
  62. package/docs/reports/v0.8-observation-svg-inspection-batch3.md +223 -223
  63. package/docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md +687 -687
  64. package/docs/reports/v0.8-reference-candidate-inspection-batch5.md +232 -232
  65. package/docs/reports/v0.8-viewer-runtime-pwa-batch1.md +278 -278
  66. package/docs/reports/v0.8.1-implementation-completeness-documentation-reconciliation.md +114 -114
  67. package/docs/reports/v0.8.1-prerelease-readiness-cross-platform-security-code-rot.md +170 -170
  68. package/docs/reports/v0.9-architecture-retrieval.md +14 -37
  69. package/docs/reports/v0.9-final-pre-release-readiness.md +209 -209
  70. package/docs/reports/v0.9-final-readiness-corrections.md +530 -530
  71. package/docs/reports/v0.9-pre-release-readiness.md +169 -169
  72. package/docs/reports/v0.9.1-batch1-pwa-hard-gate-isolation.md +359 -359
  73. package/docs/reports/v0.9.1-batch2-hard-gate-validation-integration.md +262 -262
  74. package/docs/reports/v0.9.1-pre-release-readiness.md +206 -206
  75. package/package.json +59 -59
@@ -1,238 +1,238 @@
1
- # v0.10 Batch 5 Reference-Driven Entry
2
-
3
- ## 1. Verdict
4
-
5
- PASS. The original attempt remained preserved as failure history below. The correction completed the frozen responsibility coverage, independent browser proofs, and PWA hard-gate synchronization repair; every mandatory canonical command is green.
6
-
7
- ## 2. Repository
8
-
9
- - Repository: `C:\Users\daile\Projects\my-frontend-observer`
10
- - Starting commit: `eeb8154180eea7cd143921f3fe52c328e153aab4`
11
- - Branch: `feature/v0.10-full-visual-workflow`
12
-
13
- ## 3. Retrieval and fresh index
14
-
15
- - Resolved my-dev-kit: `1.12.4`; CLI reported `1.12.4`.
16
- - Install: `.my-dev-kit-workflow/tools/v0.10-batch5/`.
17
- - Index: `.my-dev-kit-context/indexes/my-frontend-observer-v0.10-batch5-20260922`.
18
- - Command: `node .my-dev-kit-workflow/tools/v0.10-batch5/node_modules/@dailephd/my-dev-kit/dist/cli.js index --root C:\Users\daile\Projects\my-frontend-observer --src src --src viewer/src --src tests --src scripts --out C:\Users\daile\Projects\my-frontend-observer\.my-dev-kit-context\indexes\my-frontend-observer-v0.10-batch5-20260922 --call-graph --json`.
19
- - Summary: 299 files, 2,460 symbols, 4,669 edges, zero index-level warnings/errors.
20
- - Syntax, call graph, frontend semantic, and frontend reachability were complete. Data-model and classification were partial with 820 and 2,407 warnings.
21
-
22
- ## 4. Reused precedents and owners
23
-
24
- The implementation reuses `approveExternalReference`, `deriveReferenceRequirementAdequacy`, `isValidReferenceRuntimeBindingDeclarations`, `evaluateReferenceRuntimeBindings`, `buildReferenceRequirement`, `createProjectVisualChangeWorkflow`, the exact annotation/source view, project alias catalog, serialized authoring queue, Batch 3 authoring security, exact workflow-ID navigation, and Batch 2 activation.
25
-
26
- ## 5. Approval route and supersession
27
-
28
- `POST /api/references/:handle/approve` accepts exactly `{}` and only a supported imported reference. It resolves a declared predecessor to one exact supported reference root and fails closed otherwise. It calls canonical approval once, returns bounded identity/count/adequacy data, and does not change project acceptance. The Viewer exposes a separate `Approve reference` action and exact approved-ID reselection.
29
-
30
- ## 6. Materialization separation
31
-
32
- Existing materialization remains imported-only. It does not approve, create a workflow, activate acceptance, or run a check.
33
-
34
- ## 7. Reference workflow start
35
-
36
- `POST /api/references/:handle/start-visual-change` accepts only `annotationHandle`, `itemIds`, `baselineObservationHandle`, and `bindings`. It requires an approved route target, exact approved-reference annotation source, confirmed executable reference intent already represented in the approved artifact, adequate requirements, an exact aliased baseline observation, configured reference acceptance, canonical compatibility, canonical declaration validation, complete required-region coverage, and `bound` canonical results.
37
-
38
- ## 8. Baseline contract and scope
39
-
40
- The route freezes the selected exact observation. It freezes a valid configured persistent baseline contract only when contract acceptance exists. It creates the existing `VisualChangeReferenceScope` with contained project-relative paths and delegates persistence to `createProjectVisualChangeWorkflow`. Creation does not activate or change project configuration.
41
-
42
- ## 9. Viewer binding authoring
43
-
44
- The workflow-binding draft is separate from session bindings, begins empty, and resets when the reference or baseline observation changes. Region/target selection alone does not bind. `Add workflow binding` creates an explicit pair; a duplicate region is disabled until explicit `Remove`. Different regions may use the same target. The existing reference-intent checkbox selection is shared with workflow start.
45
-
46
- ## 10. Navigation, activation, and automatic checks
47
-
48
- Successful creation uses the existing exact workflow-ID callback to switch to Visual changes. Activation remains the existing explicit Batch 2 action. No materialization, approval, creation, or activation path invokes a check.
49
-
50
- ## 11. Identity proof
51
-
52
- Unit tests prove that changing the approved reference, binding declaration, baseline observation, or saved annotation revision changes `visualChangeRequestId` through the unchanged Batch 1 identity owner.
53
-
54
- ## 12. Validation
55
-
56
- - `npm run typecheck`: PASS.
57
- - `npm run lint`: PASS.
58
- - Focused suites: PASS, 58 tests.
59
- - `npm test`: PASS, 95 files and 1,500 tests.
60
- - `npm run build`: PASS.
61
- - `npm run test:browser`: FAIL, 29 files/277 tests passed; the unchanged PWA hard gate timed out at `navigator.serviceWorker.ready`.
62
- - `npm run test:pwa-hard-gate`: FAIL with the same 60-second timeout, both before and after a fresh build and with Playwright API diagnostics.
63
- - `npm run test:security`: FAIL because its 16 unit files/168 tests and other browser security tests passed, but the same PWA hard gate timed out.
64
- - `npm run check:docs`: PASS.
65
- - `git diff --check`: PASS (line-ending conversion warnings only).
66
-
67
- ## 13. Browser acceptance and materialization/approval proof
68
-
69
- The frozen independent Batch 5 real-browser acceptance gate and focused materialization-plus-approval proof are not yet implemented. Existing Batch 1-4 browser regressions passed except for the unchanged PWA timeout described above. These missing proofs are ordinary correctable work and prevent PASS.
70
-
71
- ## 14. Protocol and schema preservation
72
-
73
- `VIEWER_PROTOCOL_VERSION` remains `1.3.0`. No external-reference, annotation, visual-change, project-config, or observation schema was changed.
74
-
75
- ## 15. Full-file read accounting
76
-
77
- Whole source/test fallback reads were used after bounded search, lookup, slice, symbol source, local dependency expansion, and continuation proved that my-dev-kit stores symbol start lines without reliable end lines and truncated multi-symbol bundles at the output/block bounds.
78
-
79
- - `viewer/src/components/ReferenceWorkspace.tsx` (493 lines, source): establish complete hook/state/JSX insertion points after symbol source omitted the function tail; changed implementation.
80
- - `src/viewerServer/annotationReferenceMaterialization.ts` (115 lines, source): establish the complete serialized materialization adapter precedent; did not change that file.
81
- - `src/viewerServer/evidence/index.ts` (153 lines, source): establish exact supported-handle and unique identity behavior; did not change that file.
82
- - `src/application/visualAnnotationReferenceMaterializationService.ts` (222 lines, source): establish exact intent representation and canonical requirement construction; did not change that file.
83
- - `src/domain/externalReferenceRuntimeBinding.ts` (290 lines, source): establish complete validator/evaluator result shape and hidden-target semantics; did not change that file.
84
- - `viewer/src/components/ArtifactPreview.tsx` (82 lines, source): establish reference workspace callback ownership; changed implementation.
85
- - `viewer/src/hooks/useRuntimeVisualChangeStart.ts` (19 lines, source): establish hook lifecycle/request precedent; did not change that file.
86
- - `viewer/src/App.tsx` (104 lines, source): establish exact workflow navigation and record selection ownership; changed implementation.
87
- - `viewer/src/hooks/useEvidenceIndex.ts` (42 lines, source): establish refresh return shape; did not change that file.
88
-
89
- Other source inspection used bounded ranges. Canonical documentation reads are excluded from source/test fallback accounting.
90
-
91
- ## 16. Batch 6 and later exclusions
92
-
93
- No coding-agent handoff, orchestrator integration, source editing, automatic retry/check, correction, review, acceptance, abandon, final baseline/reference governance, version bump, release, publication, PR, or Batch 6 work was implemented.
94
-
95
- ## 17. Exact next action
96
-
97
- Commit the reviewed Batch 5 files with `feat: add v0.10 reference visual change flow`, push the shared feature branch, and stop. Batch 6 begins only under a separate authorized task.
98
-
99
- ## 18. Correction continuation (2026-09-22)
100
-
101
- The uncommitted implementation was preserved. Correction work added focused approval/start-route coverage, the two required fresh-state Chromium proofs, reference-mutation concurrency protection, and a state-based PWA readiness synchronization. No reference-domain redesign occurred.
102
-
103
- - Correction my-dev-kit: `1.12.4`, pinned at `.my-dev-kit-workflow/tools/v0.10-batch5-correction/`; CLI identity matched exactly.
104
- - Correction index: `.my-dev-kit-context/indexes/my-frontend-observer-v0.10-batch5-correction-20260922`.
105
- - Exact command: `node .my-dev-kit-workflow/tools/v0.10-batch5-correction/node_modules/@dailephd/my-dev-kit/dist/cli.js index --root C:\Users\daile\Projects\my-frontend-observer --src src --src viewer/src --src tests --src scripts --out C:\Users\daile\Projects\my-frontend-observer\.my-dev-kit-context\indexes\my-frontend-observer-v0.10-batch5-correction-20260922 --call-graph --json`.
106
- - Index result: 304 files, 2,480 symbols, 4,761 call-graph edges, zero index warnings/errors; syntax/call-graph/frontend analyzers complete; data-model/classification partial with 834/2,429 warnings.
107
-
108
- ## 19. Required browser proofs
109
-
110
- `MATERIALIZATION + APPROVAL PROOF: keeps import and approval explicit, immutable, superseding, and acceptance-neutral` passes independently. It creates its project/evidence/server/context, proves the successor remains imported until the separate click, then proves fresh approval identity, request identity preservation, supersession, source/import immutability, exact approved reselection, and unchanged project acceptance.
111
-
112
- `ACCEPTANCE GATE: creates and explicitly activates an exact reference-mode workflow without running a check` passes independently. It creates a valid aliased baseline and adequate approved reference, authors/saves/confirms exact-source intent in Chromium, explicitly authors both bindings, creates and reselects the exact inactive workflow, proves exact annotation/reference/baseline/bindings and zero attempts, explicitly activates, proves same request/new workflow identity and exact acceptance paths, and proves zero attempts/latest check `none` remain.
113
-
114
- ## 20. PWA diagnosis and correction
115
-
116
- The initial failure was **Class C — test synchronization defect**. On the loopback secure origin, the Service Worker API was present, built `/`, `/index.html`, `/registerSW.js`, `/sw.js`, and `/manifest.webmanifest` were HTTP-available, and `getRegistration()` reached an active worker at the exact origin scope while Chromium on this Windows host left the first `navigator.serviceWorker.ready` synchronization unresolved. There was no worker-script, registration, request, console, or precache failure.
117
-
118
- The hard gate now uses bounded Playwright polling of `getRegistration()` until the exact registration exists, is active, and owns `${origin}/`. It then separately retains the controller assertion and every substantive safety fact: live evidence, shell/entry precache, zero `/api/` cache entries, live API reachability, Node-side server-down proof, offline shell reload, controlled page, explicit unavailable evidence, stale identity disappearance, and cleanup. It does not manually register a worker, add sleeps/retries, cache API/media/evidence, or weaken any assertion.
119
-
120
- - First isolated hard gate: PASS (1 passed, 6 skipped).
121
- - Second consecutive fresh-profile hard gate: PASS (1 passed, 6 skipped).
122
- - Complete `pwaHardening.test.ts`: PASS (7/7).
123
- - Canonical browser: PASS (30 files, 280 tests).
124
- - Canonical security: PASS (16 unit files/168 tests; 3 browser files/77 tests; nested hard gate PASS).
125
-
126
- ## 21. TST-B5 responsibility ledger
127
-
128
- Every entry below names the concrete automated proof. Shared tests are intentionally repeated where one scenario establishes several frozen facts.
129
-
130
- | ID | Test file — exact test name | Result |
131
- |---|---|---|
132
- | TST-B5-001 | `referenceApproval.test.ts` — `returns 404 for an unknown handle, 409 for an approved reference, and requires project authoring security` | PASS |
133
- | TST-B5-002 | same named approval rejection test | PASS |
134
- | TST-B5-003 | `referenceApproval.test.ts` — `approves exactly once into one fresh immutable instance, preserves request identity, leaks no path, and leaves acceptance unchanged` | PASS |
135
- | TST-B5-004 | same named immutable approval test | PASS |
136
- | TST-B5-005 | same named immutable approval test | PASS |
137
- | TST-B5-006 | `referenceAnnotationMaterialization.test.ts` — `MATERIALIZATION + APPROVAL PROOF: keeps import and approval explicit, immutable, superseding, and acceptance-neutral` | PASS |
138
- | TST-B5-007 | `referenceApproval.test.ts` — `fails closed when a declared predecessor cannot be uniquely resolved` | PASS |
139
- | TST-B5-008 | named immutable approval test | PASS |
140
- | TST-B5-009 | named immutable approval test | PASS |
141
- | TST-B5-010 | named approval rejection/security test | PASS |
142
- | TST-B5-011 | `referenceVisualChangeRoute.test.ts` — `rejects imported scope, exact-source mismatch, non-executable intent, missing alias, missing acceptance, and structural binding errors` | PASS |
143
- | TST-B5-012 | `referenceVisualChangeRoute.test.ts` — `creates an exact inactive reference scope with optional contract omitted, zero attempts, no config mutation, and no path leakage` | PASS |
144
- | TST-B5-013 | named route rejection test | PASS |
145
- | TST-B5-014 | named route rejection test | PASS |
146
- | TST-B5-015 | `referenceAnnotationMaterialization.test.ts` — `keeps informational and candidate items unselectable, and forced API requests for them are rejected without a write` | PASS |
147
- | TST-B5-016 | materialization subset test plus `ACCEPTANCE GATE...` exact represented region | PASS |
148
- | TST-B5-017 | `materializes only the selected subset: a created region and a requirement against it, never the unselected create` | PASS |
149
- | TST-B5-018 | `referenceCandidateWorkspace.test.ts` — `shows the image with no region rectangles and an honest "no requirements selected" state` | PASS |
150
- | TST-B5-019 | Batch 5 `ACCEPTANCE GATE...` | PASS |
151
- | TST-B5-020 | named route rejection test | PASS |
152
- | TST-B5-021 | named route rejection test | PASS |
153
- | TST-B5-022 | named route rejection test | PASS |
154
- | TST-B5-023 | `visualChangeProjectWorkflowService.test.ts` — `freezes exact project evidence without activating acceptance, then activates and restores immutable revisions` | PASS |
155
- | TST-B5-024 | named exact inactive reference-scope test | PASS |
156
- | TST-B5-025 | `externalReferenceRuntimeBinding.test.ts` — `F: an incompatible reference/candidate viewport blocks ordinary binding evaluation - no bound result fabricated` | PASS |
157
- | TST-B5-026 | named route rejection test | PASS |
158
- | TST-B5-027 | named route rejection test | PASS |
159
- | TST-B5-028 | named route rejection test | PASS |
160
- | TST-B5-029 | `referenceVisualChangeRoute.test.ts` — `allows several required regions to bind explicitly to the same unique runtime target` | PASS |
161
- | TST-B5-030 | named route rejection test | PASS |
162
- | TST-B5-031 | `externalReferenceRuntimeBinding.test.ts` — `D: an ambiguously resolved runtime target is reported ambiguous, never bound` | PASS |
163
- | TST-B5-032 | `externalReferenceRuntimeBinding.test.ts` — `C: an unknown runtime target (not configured on this candidate) is reported unavailable` | PASS |
164
- | TST-B5-033 | named exact inactive reference-scope test | PASS |
165
- | TST-B5-034 | named exact inactive reference-scope test | PASS |
166
- | TST-B5-035 | named exact inactive reference-scope test | PASS |
167
- | TST-B5-036 | named exact inactive reference-scope test | PASS |
168
- | TST-B5-037 | named exact inactive reference-scope test | PASS |
169
- | TST-B5-038 | named exact inactive reference-scope test | PASS |
170
- | TST-B5-039 | named exact inactive reference-scope test | PASS |
171
- | TST-B5-040 | named exact inactive reference-scope test | PASS |
172
- | TST-B5-041 | named exact inactive reference-scope test | PASS |
173
- | TST-B5-042 | named exact inactive reference-scope test | PASS |
174
- | TST-B5-043 | `MATERIALIZATION + APPROVAL PROOF...` | PASS |
175
- | TST-B5-044 | `materializes a confirmed created region into a new imported revision without approval, config change, or switching the viewed reference` | PASS |
176
- | TST-B5-045 | `MATERIALIZATION + APPROVAL PROOF...` | PASS |
177
- | TST-B5-046 | `MATERIALIZATION + APPROVAL PROOF...` | PASS |
178
- | TST-B5-047 | `MATERIALIZATION + APPROVAL PROOF...` | PASS |
179
- | TST-B5-048 | Batch 5 `ACCEPTANCE GATE...` | PASS |
180
- | TST-B5-049 | `referenceBindingFidelityWorkspace.test.ts` — `a reference region and runtime target sharing the literal name "header" never cross-select without an explicit declaration` | PASS |
181
- | TST-B5-050 | same named no-inference binding test | PASS |
182
- | TST-B5-051 | Batch 5 `ACCEPTANCE GATE...` | PASS |
183
- | TST-B5-052 | Batch 5 `ACCEPTANCE GATE...` | PASS |
184
- | TST-B5-053 | Batch 5 `ACCEPTANCE GATE...` (authored pair has explicit `Remove`) | PASS |
185
- | TST-B5-054 | `externalReferenceRuntimeBinding.test.ts` — `J: rejects a conflicting declaration mapping the same reference region to two different targets, never silently choosing the first` | PASS |
186
- | TST-B5-055 | fresh-project Batch 5 `ACCEPTANCE GATE...` | PASS |
187
- | TST-B5-056 | fresh baseline selection in Batch 5 `ACCEPTANCE GATE...` | PASS |
188
- | TST-B5-057 | Batch 5 `ACCEPTANCE GATE...` | PASS |
189
- | TST-B5-058 | `referenceVisualChangeAuthoring.test.ts` — `accepts exactly the four start fields and rejects activation/path injection` | PASS |
190
- | TST-B5-059 | same closed-request test | PASS |
191
- | TST-B5-060 | Batch 5 `ACCEPTANCE GATE...` | PASS |
192
- | TST-B5-061 | Batch 5 `ACCEPTANCE GATE...` | PASS |
193
- | TST-B5-062 | Batch 5 `ACCEPTANCE GATE...` | PASS |
194
- | TST-B5-063 | Batch 5 `ACCEPTANCE GATE...` | PASS |
195
- | TST-B5-064 | Batch 5 `ACCEPTANCE GATE...` | PASS |
196
- | TST-B5-065 | Batch 5 `ACCEPTANCE GATE...` | PASS |
197
- | TST-B5-066 | Batch 5 `ACCEPTANCE GATE...` | PASS |
198
- | TST-B5-067 | Batch 5 `ACCEPTANCE GATE...` | PASS |
199
- | TST-B5-068 | Batch 5 `ACCEPTANCE GATE...` | PASS |
200
- | TST-B5-069 | Batch 5 `ACCEPTANCE GATE...` | PASS |
201
- | TST-B5-070 | Batch 5 `ACCEPTANCE GATE...` | PASS |
202
- | TST-B5-071 | `referenceVisualChangeAuthoring.test.ts` — `changes identity when approved reference changes` | PASS |
203
- | TST-B5-072 | same table test — `changes identity when binding changes` | PASS |
204
- | TST-B5-073 | same table test — `changes identity when baseline observation changes` | PASS |
205
- | TST-B5-074 | same table test — `changes identity when annotation revision changes` | PASS |
206
- | TST-B5-075 | reference annotation authoring save/revision suite in canonical browser run | PASS |
207
- | TST-B5-076 | reference annotation explicit confirmation suite in canonical browser run | PASS |
208
- | TST-B5-077 | first four named `referenceAnnotationMaterialization.test.ts` tests | PASS |
209
- | TST-B5-078 | six named `referenceCandidateWorkspace.test.ts` cases | PASS |
210
- | TST-B5-079 | `referenceBindingFidelityWorkspace.test.ts` — `clicking a bound reference region cross-highlights its exact declared runtime target, and vice versa` | PASS |
211
- | TST-B5-080 | same file — `Case G: a real canonical PASS is displayed with requirement values only after the explicit trigger is clicked` | PASS |
212
- | TST-B5-081 | canonical `npm test` Batch 1 suites | PASS |
213
- | TST-B5-082 | canonical `npm test` Batch 2 suites | PASS |
214
- | TST-B5-083 | canonical browser/security Batch 3 suites | PASS |
215
- | TST-B5-084 | `runtimeAnnotationContractPromotion.test.ts` — `ACCEPTANCE GATE: creates an inactive actual workflow from confirmed runtime intent and explicitly activates its immutable revision` | PASS |
216
- | TST-B5-085 | viewer protocol assertion suite; `VIEWER_PROTOCOL_VERSION = '1.3.0'` | PASS |
217
-
218
- ## 22. Final correction validation
219
-
220
- - `npm run typecheck`: PASS.
221
- - `npm run lint`: PASS.
222
- - `npm test`: PASS, 97 files/1,506 tests.
223
- - Focused approval/start-route: PASS, 12 tests.
224
- - Focused Batch 5 browser proof file: PASS, 6 tests.
225
- - `npm run test:browser`: PASS, 30 files/280 tests.
226
- - `npm run test:security`: PASS.
227
- - `npm run test:pwa-hard-gate`: PASS twice consecutively, plus once inside security.
228
- - Full `pwaHardening.test.ts`: PASS, 7 tests.
229
- - `npm run build`: PASS; generated PWA precache has 10 entries.
230
- - `npm run check:docs`: PASS.
231
- - `git diff --check`: PASS (Git line-ending notices only).
232
- - Viewer protocol remains `1.3.0`; no governed schema version changed.
233
-
234
- ## 23. Correction retrieval and fallback accounting
235
-
236
- Correction retrieval followed search → lookup → slice → exact symbol source → continuation/dependency expansion → bounded ranges. Correction-run additional full source/test file reads: none.
237
-
238
- The historical fallback ledger in section 15 is retained unchanged.
1
+ # v0.10 Batch 5 Reference-Driven Entry
2
+
3
+ ## 1. Verdict
4
+
5
+ PASS. The original attempt remained preserved as failure history below. The correction completed the frozen responsibility coverage, independent browser proofs, and PWA hard-gate synchronization repair; every mandatory canonical command is green.
6
+
7
+ ## 2. Repository
8
+
9
+ - Repository: `C:\Users\daile\Projects\my-frontend-observer`
10
+ - Starting commit: `eeb8154180eea7cd143921f3fe52c328e153aab4`
11
+ - Branch: `feature/v0.10-full-visual-workflow`
12
+
13
+ ## 3. Retrieval and fresh index
14
+
15
+ - Resolved my-dev-kit: `1.12.4`; CLI reported `1.12.4`.
16
+ - Install: `.my-dev-kit-workflow/tools/v0.10-batch5/`.
17
+ - Index: `.my-dev-kit-context/indexes/my-frontend-observer-v0.10-batch5-20260922`.
18
+ - Command: `node .my-dev-kit-workflow/tools/v0.10-batch5/node_modules/@dailephd/my-dev-kit/dist/cli.js index --root C:\Users\daile\Projects\my-frontend-observer --src src --src viewer/src --src tests --src scripts --out C:\Users\daile\Projects\my-frontend-observer\.my-dev-kit-context\indexes\my-frontend-observer-v0.10-batch5-20260922 --call-graph --json`.
19
+ - Summary: 299 files, 2,460 symbols, 4,669 edges, zero index-level warnings/errors.
20
+ - Syntax, call graph, frontend semantic, and frontend reachability were complete. Data-model and classification were partial with 820 and 2,407 warnings.
21
+
22
+ ## 4. Reused precedents and owners
23
+
24
+ The implementation reuses `approveExternalReference`, `deriveReferenceRequirementAdequacy`, `isValidReferenceRuntimeBindingDeclarations`, `evaluateReferenceRuntimeBindings`, `buildReferenceRequirement`, `createProjectVisualChangeWorkflow`, the exact annotation/source view, project alias catalog, serialized authoring queue, Batch 3 authoring security, exact workflow-ID navigation, and Batch 2 activation.
25
+
26
+ ## 5. Approval route and supersession
27
+
28
+ `POST /api/references/:handle/approve` accepts exactly `{}` and only a supported imported reference. It resolves a declared predecessor to one exact supported reference root and fails closed otherwise. It calls canonical approval once, returns bounded identity/count/adequacy data, and does not change project acceptance. The Viewer exposes a separate `Approve reference` action and exact approved-ID reselection.
29
+
30
+ ## 6. Materialization separation
31
+
32
+ Existing materialization remains imported-only. It does not approve, create a workflow, activate acceptance, or run a check.
33
+
34
+ ## 7. Reference workflow start
35
+
36
+ `POST /api/references/:handle/start-visual-change` accepts only `annotationHandle`, `itemIds`, `baselineObservationHandle`, and `bindings`. It requires an approved route target, exact approved-reference annotation source, confirmed executable reference intent already represented in the approved artifact, adequate requirements, an exact aliased baseline observation, configured reference acceptance, canonical compatibility, canonical declaration validation, complete required-region coverage, and `bound` canonical results.
37
+
38
+ ## 8. Baseline contract and scope
39
+
40
+ The route freezes the selected exact observation. It freezes a valid configured persistent baseline contract only when contract acceptance exists. It creates the existing `VisualChangeReferenceScope` with contained project-relative paths and delegates persistence to `createProjectVisualChangeWorkflow`. Creation does not activate or change project configuration.
41
+
42
+ ## 9. Viewer binding authoring
43
+
44
+ The workflow-binding draft is separate from session bindings, begins empty, and resets when the reference or baseline observation changes. Region/target selection alone does not bind. `Add workflow binding` creates an explicit pair; a duplicate region is disabled until explicit `Remove`. Different regions may use the same target. The existing reference-intent checkbox selection is shared with workflow start.
45
+
46
+ ## 10. Navigation, activation, and automatic checks
47
+
48
+ Successful creation uses the existing exact workflow-ID callback to switch to Visual changes. Activation remains the existing explicit Batch 2 action. No materialization, approval, creation, or activation path invokes a check.
49
+
50
+ ## 11. Identity proof
51
+
52
+ Unit tests prove that changing the approved reference, binding declaration, baseline observation, or saved annotation revision changes `visualChangeRequestId` through the unchanged Batch 1 identity owner.
53
+
54
+ ## 12. Validation
55
+
56
+ - `npm run typecheck`: PASS.
57
+ - `npm run lint`: PASS.
58
+ - Focused suites: PASS, 58 tests.
59
+ - `npm test`: PASS, 95 files and 1,500 tests.
60
+ - `npm run build`: PASS.
61
+ - `npm run test:browser`: FAIL, 29 files/277 tests passed; the unchanged PWA hard gate timed out at `navigator.serviceWorker.ready`.
62
+ - `npm run test:pwa-hard-gate`: FAIL with the same 60-second timeout, both before and after a fresh build and with Playwright API diagnostics.
63
+ - `npm run test:security`: FAIL because its 16 unit files/168 tests and other browser security tests passed, but the same PWA hard gate timed out.
64
+ - `npm run check:docs`: PASS.
65
+ - `git diff --check`: PASS (line-ending conversion warnings only).
66
+
67
+ ## 13. Browser acceptance and materialization/approval proof
68
+
69
+ The frozen independent Batch 5 real-browser acceptance gate and focused materialization-plus-approval proof are not yet implemented. Existing Batch 1-4 browser regressions passed except for the unchanged PWA timeout described above. These missing proofs are ordinary correctable work and prevent PASS.
70
+
71
+ ## 14. Protocol and schema preservation
72
+
73
+ `VIEWER_PROTOCOL_VERSION` remains `1.3.0`. No external-reference, annotation, visual-change, project-config, or observation schema was changed.
74
+
75
+ ## 15. Full-file read accounting
76
+
77
+ Whole source/test fallback reads were used after bounded search, lookup, slice, symbol source, local dependency expansion, and continuation proved that my-dev-kit stores symbol start lines without reliable end lines and truncated multi-symbol bundles at the output/block bounds.
78
+
79
+ - `viewer/src/components/ReferenceWorkspace.tsx` (493 lines, source): establish complete hook/state/JSX insertion points after symbol source omitted the function tail; changed implementation.
80
+ - `src/viewerServer/annotationReferenceMaterialization.ts` (115 lines, source): establish the complete serialized materialization adapter precedent; did not change that file.
81
+ - `src/viewerServer/evidence/index.ts` (153 lines, source): establish exact supported-handle and unique identity behavior; did not change that file.
82
+ - `src/application/visualAnnotationReferenceMaterializationService.ts` (222 lines, source): establish exact intent representation and canonical requirement construction; did not change that file.
83
+ - `src/domain/externalReferenceRuntimeBinding.ts` (290 lines, source): establish complete validator/evaluator result shape and hidden-target semantics; did not change that file.
84
+ - `viewer/src/components/ArtifactPreview.tsx` (82 lines, source): establish reference workspace callback ownership; changed implementation.
85
+ - `viewer/src/hooks/useRuntimeVisualChangeStart.ts` (19 lines, source): establish hook lifecycle/request precedent; did not change that file.
86
+ - `viewer/src/App.tsx` (104 lines, source): establish exact workflow navigation and record selection ownership; changed implementation.
87
+ - `viewer/src/hooks/useEvidenceIndex.ts` (42 lines, source): establish refresh return shape; did not change that file.
88
+
89
+ Other source inspection used bounded ranges. Canonical documentation reads are excluded from source/test fallback accounting.
90
+
91
+ ## 16. Batch 6 and later exclusions
92
+
93
+ No coding-agent handoff, orchestrator integration, source editing, automatic retry/check, correction, review, acceptance, abandon, final baseline/reference governance, version bump, release, publication, PR, or Batch 6 work was implemented.
94
+
95
+ ## 17. Exact next action
96
+
97
+ Commit the reviewed Batch 5 files with `feat: add v0.10 reference visual change flow`, push the shared feature branch, and stop. Batch 6 begins only under a separate authorized task.
98
+
99
+ ## 18. Correction continuation (2026-09-22)
100
+
101
+ The uncommitted implementation was preserved. Correction work added focused approval/start-route coverage, the two required fresh-state Chromium proofs, reference-mutation concurrency protection, and a state-based PWA readiness synchronization. No reference-domain redesign occurred.
102
+
103
+ - Correction my-dev-kit: `1.12.4`, pinned at `.my-dev-kit-workflow/tools/v0.10-batch5-correction/`; CLI identity matched exactly.
104
+ - Correction index: `.my-dev-kit-context/indexes/my-frontend-observer-v0.10-batch5-correction-20260922`.
105
+ - Exact command: `node .my-dev-kit-workflow/tools/v0.10-batch5-correction/node_modules/@dailephd/my-dev-kit/dist/cli.js index --root C:\Users\daile\Projects\my-frontend-observer --src src --src viewer/src --src tests --src scripts --out C:\Users\daile\Projects\my-frontend-observer\.my-dev-kit-context\indexes\my-frontend-observer-v0.10-batch5-correction-20260922 --call-graph --json`.
106
+ - Index result: 304 files, 2,480 symbols, 4,761 call-graph edges, zero index warnings/errors; syntax/call-graph/frontend analyzers complete; data-model/classification partial with 834/2,429 warnings.
107
+
108
+ ## 19. Required browser proofs
109
+
110
+ `MATERIALIZATION + APPROVAL PROOF: keeps import and approval explicit, immutable, superseding, and acceptance-neutral` passes independently. It creates its project/evidence/server/context, proves the successor remains imported until the separate click, then proves fresh approval identity, request identity preservation, supersession, source/import immutability, exact approved reselection, and unchanged project acceptance.
111
+
112
+ `ACCEPTANCE GATE: creates and explicitly activates an exact reference-mode workflow without running a check` passes independently. It creates a valid aliased baseline and adequate approved reference, authors/saves/confirms exact-source intent in Chromium, explicitly authors both bindings, creates and reselects the exact inactive workflow, proves exact annotation/reference/baseline/bindings and zero attempts, explicitly activates, proves same request/new workflow identity and exact acceptance paths, and proves zero attempts/latest check `none` remain.
113
+
114
+ ## 20. PWA diagnosis and correction
115
+
116
+ The initial failure was **Class C — test synchronization defect**. On the loopback secure origin, the Service Worker API was present, built `/`, `/index.html`, `/registerSW.js`, `/sw.js`, and `/manifest.webmanifest` were HTTP-available, and `getRegistration()` reached an active worker at the exact origin scope while Chromium on this Windows host left the first `navigator.serviceWorker.ready` synchronization unresolved. There was no worker-script, registration, request, console, or precache failure.
117
+
118
+ The hard gate now uses bounded Playwright polling of `getRegistration()` until the exact registration exists, is active, and owns `${origin}/`. It then separately retains the controller assertion and every substantive safety fact: live evidence, shell/entry precache, zero `/api/` cache entries, live API reachability, Node-side server-down proof, offline shell reload, controlled page, explicit unavailable evidence, stale identity disappearance, and cleanup. It does not manually register a worker, add sleeps/retries, cache API/media/evidence, or weaken any assertion.
119
+
120
+ - First isolated hard gate: PASS (1 passed, 6 skipped).
121
+ - Second consecutive fresh-profile hard gate: PASS (1 passed, 6 skipped).
122
+ - Complete `pwaHardening.test.ts`: PASS (7/7).
123
+ - Canonical browser: PASS (30 files, 280 tests).
124
+ - Canonical security: PASS (16 unit files/168 tests; 3 browser files/77 tests; nested hard gate PASS).
125
+
126
+ ## 21. TST-B5 responsibility ledger
127
+
128
+ Every entry below names the concrete automated proof. Shared tests are intentionally repeated where one scenario establishes several frozen facts.
129
+
130
+ | ID | Test file — exact test name | Result |
131
+ |---|---|---|
132
+ | TST-B5-001 | `referenceApproval.test.ts` — `returns 404 for an unknown handle, 409 for an approved reference, and requires project authoring security` | PASS |
133
+ | TST-B5-002 | same named approval rejection test | PASS |
134
+ | TST-B5-003 | `referenceApproval.test.ts` — `approves exactly once into one fresh immutable instance, preserves request identity, leaks no path, and leaves acceptance unchanged` | PASS |
135
+ | TST-B5-004 | same named immutable approval test | PASS |
136
+ | TST-B5-005 | same named immutable approval test | PASS |
137
+ | TST-B5-006 | `referenceAnnotationMaterialization.test.ts` — `MATERIALIZATION + APPROVAL PROOF: keeps import and approval explicit, immutable, superseding, and acceptance-neutral` | PASS |
138
+ | TST-B5-007 | `referenceApproval.test.ts` — `fails closed when a declared predecessor cannot be uniquely resolved` | PASS |
139
+ | TST-B5-008 | named immutable approval test | PASS |
140
+ | TST-B5-009 | named immutable approval test | PASS |
141
+ | TST-B5-010 | named approval rejection/security test | PASS |
142
+ | TST-B5-011 | `referenceVisualChangeRoute.test.ts` — `rejects imported scope, exact-source mismatch, non-executable intent, missing alias, missing acceptance, and structural binding errors` | PASS |
143
+ | TST-B5-012 | `referenceVisualChangeRoute.test.ts` — `creates an exact inactive reference scope with optional contract omitted, zero attempts, no config mutation, and no path leakage` | PASS |
144
+ | TST-B5-013 | named route rejection test | PASS |
145
+ | TST-B5-014 | named route rejection test | PASS |
146
+ | TST-B5-015 | `referenceAnnotationMaterialization.test.ts` — `keeps informational and candidate items unselectable, and forced API requests for them are rejected without a write` | PASS |
147
+ | TST-B5-016 | materialization subset test plus `ACCEPTANCE GATE...` exact represented region | PASS |
148
+ | TST-B5-017 | `materializes only the selected subset: a created region and a requirement against it, never the unselected create` | PASS |
149
+ | TST-B5-018 | `referenceCandidateWorkspace.test.ts` — `shows the image with no region rectangles and an honest "no requirements selected" state` | PASS |
150
+ | TST-B5-019 | Batch 5 `ACCEPTANCE GATE...` | PASS |
151
+ | TST-B5-020 | named route rejection test | PASS |
152
+ | TST-B5-021 | named route rejection test | PASS |
153
+ | TST-B5-022 | named route rejection test | PASS |
154
+ | TST-B5-023 | `visualChangeProjectWorkflowService.test.ts` — `freezes exact project evidence without activating acceptance, then activates and restores immutable revisions` | PASS |
155
+ | TST-B5-024 | named exact inactive reference-scope test | PASS |
156
+ | TST-B5-025 | `externalReferenceRuntimeBinding.test.ts` — `F: an incompatible reference/candidate viewport blocks ordinary binding evaluation - no bound result fabricated` | PASS |
157
+ | TST-B5-026 | named route rejection test | PASS |
158
+ | TST-B5-027 | named route rejection test | PASS |
159
+ | TST-B5-028 | named route rejection test | PASS |
160
+ | TST-B5-029 | `referenceVisualChangeRoute.test.ts` — `allows several required regions to bind explicitly to the same unique runtime target` | PASS |
161
+ | TST-B5-030 | named route rejection test | PASS |
162
+ | TST-B5-031 | `externalReferenceRuntimeBinding.test.ts` — `D: an ambiguously resolved runtime target is reported ambiguous, never bound` | PASS |
163
+ | TST-B5-032 | `externalReferenceRuntimeBinding.test.ts` — `C: an unknown runtime target (not configured on this candidate) is reported unavailable` | PASS |
164
+ | TST-B5-033 | named exact inactive reference-scope test | PASS |
165
+ | TST-B5-034 | named exact inactive reference-scope test | PASS |
166
+ | TST-B5-035 | named exact inactive reference-scope test | PASS |
167
+ | TST-B5-036 | named exact inactive reference-scope test | PASS |
168
+ | TST-B5-037 | named exact inactive reference-scope test | PASS |
169
+ | TST-B5-038 | named exact inactive reference-scope test | PASS |
170
+ | TST-B5-039 | named exact inactive reference-scope test | PASS |
171
+ | TST-B5-040 | named exact inactive reference-scope test | PASS |
172
+ | TST-B5-041 | named exact inactive reference-scope test | PASS |
173
+ | TST-B5-042 | named exact inactive reference-scope test | PASS |
174
+ | TST-B5-043 | `MATERIALIZATION + APPROVAL PROOF...` | PASS |
175
+ | TST-B5-044 | `materializes a confirmed created region into a new imported revision without approval, config change, or switching the viewed reference` | PASS |
176
+ | TST-B5-045 | `MATERIALIZATION + APPROVAL PROOF...` | PASS |
177
+ | TST-B5-046 | `MATERIALIZATION + APPROVAL PROOF...` | PASS |
178
+ | TST-B5-047 | `MATERIALIZATION + APPROVAL PROOF...` | PASS |
179
+ | TST-B5-048 | Batch 5 `ACCEPTANCE GATE...` | PASS |
180
+ | TST-B5-049 | `referenceBindingFidelityWorkspace.test.ts` — `a reference region and runtime target sharing the literal name "header" never cross-select without an explicit declaration` | PASS |
181
+ | TST-B5-050 | same named no-inference binding test | PASS |
182
+ | TST-B5-051 | Batch 5 `ACCEPTANCE GATE...` | PASS |
183
+ | TST-B5-052 | Batch 5 `ACCEPTANCE GATE...` | PASS |
184
+ | TST-B5-053 | Batch 5 `ACCEPTANCE GATE...` (authored pair has explicit `Remove`) | PASS |
185
+ | TST-B5-054 | `externalReferenceRuntimeBinding.test.ts` — `J: rejects a conflicting declaration mapping the same reference region to two different targets, never silently choosing the first` | PASS |
186
+ | TST-B5-055 | fresh-project Batch 5 `ACCEPTANCE GATE...` | PASS |
187
+ | TST-B5-056 | fresh baseline selection in Batch 5 `ACCEPTANCE GATE...` | PASS |
188
+ | TST-B5-057 | Batch 5 `ACCEPTANCE GATE...` | PASS |
189
+ | TST-B5-058 | `referenceVisualChangeAuthoring.test.ts` — `accepts exactly the four start fields and rejects activation/path injection` | PASS |
190
+ | TST-B5-059 | same closed-request test | PASS |
191
+ | TST-B5-060 | Batch 5 `ACCEPTANCE GATE...` | PASS |
192
+ | TST-B5-061 | Batch 5 `ACCEPTANCE GATE...` | PASS |
193
+ | TST-B5-062 | Batch 5 `ACCEPTANCE GATE...` | PASS |
194
+ | TST-B5-063 | Batch 5 `ACCEPTANCE GATE...` | PASS |
195
+ | TST-B5-064 | Batch 5 `ACCEPTANCE GATE...` | PASS |
196
+ | TST-B5-065 | Batch 5 `ACCEPTANCE GATE...` | PASS |
197
+ | TST-B5-066 | Batch 5 `ACCEPTANCE GATE...` | PASS |
198
+ | TST-B5-067 | Batch 5 `ACCEPTANCE GATE...` | PASS |
199
+ | TST-B5-068 | Batch 5 `ACCEPTANCE GATE...` | PASS |
200
+ | TST-B5-069 | Batch 5 `ACCEPTANCE GATE...` | PASS |
201
+ | TST-B5-070 | Batch 5 `ACCEPTANCE GATE...` | PASS |
202
+ | TST-B5-071 | `referenceVisualChangeAuthoring.test.ts` — `changes identity when approved reference changes` | PASS |
203
+ | TST-B5-072 | same table test — `changes identity when binding changes` | PASS |
204
+ | TST-B5-073 | same table test — `changes identity when baseline observation changes` | PASS |
205
+ | TST-B5-074 | same table test — `changes identity when annotation revision changes` | PASS |
206
+ | TST-B5-075 | reference annotation authoring save/revision suite in canonical browser run | PASS |
207
+ | TST-B5-076 | reference annotation explicit confirmation suite in canonical browser run | PASS |
208
+ | TST-B5-077 | first four named `referenceAnnotationMaterialization.test.ts` tests | PASS |
209
+ | TST-B5-078 | six named `referenceCandidateWorkspace.test.ts` cases | PASS |
210
+ | TST-B5-079 | `referenceBindingFidelityWorkspace.test.ts` — `clicking a bound reference region cross-highlights its exact declared runtime target, and vice versa` | PASS |
211
+ | TST-B5-080 | same file — `Case G: a real canonical PASS is displayed with requirement values only after the explicit trigger is clicked` | PASS |
212
+ | TST-B5-081 | canonical `npm test` Batch 1 suites | PASS |
213
+ | TST-B5-082 | canonical `npm test` Batch 2 suites | PASS |
214
+ | TST-B5-083 | canonical browser/security Batch 3 suites | PASS |
215
+ | TST-B5-084 | `runtimeAnnotationContractPromotion.test.ts` — `ACCEPTANCE GATE: creates an inactive actual workflow from confirmed runtime intent and explicitly activates its immutable revision` | PASS |
216
+ | TST-B5-085 | viewer protocol assertion suite; `VIEWER_PROTOCOL_VERSION = '1.3.0'` | PASS |
217
+
218
+ ## 22. Final correction validation
219
+
220
+ - `npm run typecheck`: PASS.
221
+ - `npm run lint`: PASS.
222
+ - `npm test`: PASS, 97 files/1,506 tests.
223
+ - Focused approval/start-route: PASS, 12 tests.
224
+ - Focused Batch 5 browser proof file: PASS, 6 tests.
225
+ - `npm run test:browser`: PASS, 30 files/280 tests.
226
+ - `npm run test:security`: PASS.
227
+ - `npm run test:pwa-hard-gate`: PASS twice consecutively, plus once inside security.
228
+ - Full `pwaHardening.test.ts`: PASS, 7 tests.
229
+ - `npm run build`: PASS; generated PWA precache has 10 entries.
230
+ - `npm run check:docs`: PASS.
231
+ - `git diff --check`: PASS (Git line-ending notices only).
232
+ - Viewer protocol remains `1.3.0`; no governed schema version changed.
233
+
234
+ ## 23. Correction retrieval and fallback accounting
235
+
236
+ Correction retrieval followed search → lookup → slice → exact symbol source → continuation/dependency expansion → bounded ranges. Correction-run additional full source/test file reads: none.
237
+
238
+ The historical fallback ledger in section 15 is retained unchanged.