@dailephd/my-frontend-observer 0.9.1 → 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 (150) hide show
  1. package/CHANGELOG.md +490 -471
  2. package/LICENSE +21 -21
  3. package/README.md +375 -357
  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/application/visualChangeAgentHandoffService.d.ts +28 -0
  11. package/dist/application/visualChangeAgentHandoffService.js +111 -0
  12. package/dist/application/visualChangeAgentHandoffService.js.map +1 -0
  13. package/dist/application/visualChangeProjectWorkflowService.d.ts +95 -0
  14. package/dist/application/visualChangeProjectWorkflowService.js +376 -0
  15. package/dist/application/visualChangeProjectWorkflowService.js.map +1 -0
  16. package/dist/application/visualChangeReviewService.d.ts +50 -0
  17. package/dist/application/visualChangeReviewService.js +69 -0
  18. package/dist/application/visualChangeReviewService.js.map +1 -0
  19. package/dist/application/visualChangeWorkflowPersistenceService.d.ts +26 -0
  20. package/dist/application/visualChangeWorkflowPersistenceService.js +15 -0
  21. package/dist/application/visualChangeWorkflowPersistenceService.js.map +1 -0
  22. package/dist/artifacts/visualChangeWorkflowArtifactReader.d.ts +9 -0
  23. package/dist/artifacts/visualChangeWorkflowArtifactReader.js +47 -0
  24. package/dist/artifacts/visualChangeWorkflowArtifactReader.js.map +1 -0
  25. package/dist/artifacts/visualChangeWorkflowArtifactWriter.d.ts +20 -0
  26. package/dist/artifacts/visualChangeWorkflowArtifactWriter.js +41 -0
  27. package/dist/artifacts/visualChangeWorkflowArtifactWriter.js.map +1 -0
  28. package/dist/cli.js +9 -7
  29. package/dist/cli.js.map +1 -1
  30. package/dist/domain/visualChangeAgentHandoff.d.ts +82 -0
  31. package/dist/domain/visualChangeAgentHandoff.js +80 -0
  32. package/dist/domain/visualChangeAgentHandoff.js.map +1 -0
  33. package/dist/domain/visualChangeAgentHandoffSerialization.d.ts +2 -0
  34. package/dist/domain/visualChangeAgentHandoffSerialization.js +11 -0
  35. package/dist/domain/visualChangeAgentHandoffSerialization.js.map +1 -0
  36. package/dist/domain/visualChangeCycle.d.ts +8 -0
  37. package/dist/domain/visualChangeCycle.js +7 -0
  38. package/dist/domain/visualChangeCycle.js.map +1 -0
  39. package/dist/domain/visualChangeWorkflow.d.ts +125 -0
  40. package/dist/domain/visualChangeWorkflow.js +109 -0
  41. package/dist/domain/visualChangeWorkflow.js.map +1 -0
  42. package/dist/domain/visualChangeWorkflowIdentity.d.ts +5 -0
  43. package/dist/domain/visualChangeWorkflowIdentity.js +24 -0
  44. package/dist/domain/visualChangeWorkflowIdentity.js.map +1 -0
  45. package/dist/index.d.ts +21 -1
  46. package/dist/index.js +12 -1
  47. package/dist/index.js.map +1 -1
  48. package/dist/projectWorkflow/projectPaths.d.ts +3 -0
  49. package/dist/projectWorkflow/projectPaths.js +7 -0
  50. package/dist/projectWorkflow/projectPaths.js.map +1 -1
  51. package/dist/viewer/assets/index-DglJ6f28.css +1 -0
  52. package/dist/viewer/assets/index-DsODREY5.js +9 -0
  53. package/dist/viewer/index.html +15 -15
  54. package/dist/viewer/sw.js +1 -1
  55. package/dist/viewerServer/evidence/classify.d.ts +3 -1
  56. package/dist/viewerServer/evidence/classify.js +10 -0
  57. package/dist/viewerServer/evidence/classify.js.map +1 -1
  58. package/dist/viewerServer/evidence/handles.js +1 -0
  59. package/dist/viewerServer/evidence/handles.js.map +1 -1
  60. package/dist/viewerServer/evidence/projection.d.ts +5 -0
  61. package/dist/viewerServer/evidence/projection.js +19 -0
  62. package/dist/viewerServer/evidence/projection.js.map +1 -1
  63. package/dist/viewerServer/evidence/visualChangeWorkflowView.d.ts +31 -0
  64. package/dist/viewerServer/evidence/visualChangeWorkflowView.js +36 -0
  65. package/dist/viewerServer/evidence/visualChangeWorkflowView.js.map +1 -0
  66. package/dist/viewerServer/httpServer.js +323 -1
  67. package/dist/viewerServer/httpServer.js.map +1 -1
  68. package/dist/viewerServer/referenceApproval.d.ts +22 -0
  69. package/dist/viewerServer/referenceApproval.js +42 -0
  70. package/dist/viewerServer/referenceApproval.js.map +1 -0
  71. package/dist/viewerServer/referenceVisualChangeAuthoring.d.ts +28 -0
  72. package/dist/viewerServer/referenceVisualChangeAuthoring.js +134 -0
  73. package/dist/viewerServer/referenceVisualChangeAuthoring.js.map +1 -0
  74. package/dist/viewerServer/runtimeVisualChangeAuthoring.d.ts +33 -0
  75. package/dist/viewerServer/runtimeVisualChangeAuthoring.js +81 -0
  76. package/dist/viewerServer/runtimeVisualChangeAuthoring.js.map +1 -0
  77. package/dist/viewerServer/visualChangeAuthoring.d.ts +46 -0
  78. package/dist/viewerServer/visualChangeAuthoring.js +63 -0
  79. package/dist/viewerServer/visualChangeAuthoring.js.map +1 -0
  80. package/dist/viewerServer/visualChangeHandoff.d.ts +23 -0
  81. package/dist/viewerServer/visualChangeHandoff.js +31 -0
  82. package/dist/viewerServer/visualChangeHandoff.js.map +1 -0
  83. package/dist/viewerServer/visualChangeReview.d.ts +30 -0
  84. package/dist/viewerServer/visualChangeReview.js +46 -0
  85. package/dist/viewerServer/visualChangeReview.js.map +1 -0
  86. package/docs/ARCHITECTURE.md +1394 -1373
  87. package/docs/CI_CD.md +349 -327
  88. package/docs/COMMANDS.md +1035 -1012
  89. package/docs/CONTRACTS.md +1971 -1926
  90. package/docs/CURRENT_STATE.md +1277 -1238
  91. package/docs/DEVELOPMENT.md +240 -237
  92. package/docs/DOCUMENTATION_PRESERVATION_POLICY.md +50 -50
  93. package/docs/PROJECT_DESCRIPTION.md +2248 -2224
  94. package/docs/PROJECT_MILESTONES.md +2681 -2558
  95. package/docs/PROJECT_OVERVIEW.md +200 -191
  96. package/docs/QUICKSTART.md +100 -96
  97. package/docs/RELEASE.md +37 -33
  98. package/docs/ROADMAP.md +1105 -1033
  99. package/docs/SECURITY.md +297 -275
  100. package/docs/WORKFLOWS.md +806 -770
  101. package/docs/plans/v0.10-implementation-plan.md +1509 -0
  102. package/docs/plans/v0.8-implementation-plan.md +655 -655
  103. package/docs/plans/v0.8.1-cli-usability-patch-plan.md +505 -505
  104. package/docs/plans/v0.9-implementation-plan.md +1529 -1529
  105. package/docs/plans/v0.9.1-implementation-plan.md +468 -468
  106. package/docs/reports/v0.10-batch1-visual-change-workflow-foundation.md +102 -0
  107. package/docs/reports/v0.10-batch2-project-composition-check-recording.md +103 -0
  108. package/docs/reports/v0.10-batch3-viewer-visual-change-workspace.md +93 -0
  109. package/docs/reports/v0.10-batch4-actual-frontend-entry.md +59 -0
  110. package/docs/reports/v0.10-batch5-reference-driven-entry.md +238 -0
  111. package/docs/reports/v0.10-batch6-coding-agent-handoff.md +85 -0
  112. package/docs/reports/v0.10-batch7-correction-review-acceptance.md +145 -0
  113. package/docs/reports/v0.10-batch8-integrated-acceptance.md +109 -0
  114. package/docs/reports/v0.10-implementation-completeness-documentation-reconciliation.md +344 -0
  115. package/docs/reports/v0.10-pre-release-readiness.md +120 -0
  116. package/docs/reports/v0.10-release-preparation.md +70 -0
  117. package/docs/reports/v0.10.1-project-check-baseline-context-implementation.md +86 -0
  118. package/docs/reports/v0.7-bounded-fidelity-context-prompt7.md +243 -243
  119. package/docs/reports/v0.7-implementation-completeness-documentation-reconciliation.md +497 -497
  120. package/docs/reports/v0.7-pre-release-readiness.md +337 -337
  121. package/docs/reports/v0.7-reference-binding-prompt5.md +223 -223
  122. package/docs/reports/v0.7-reference-compatibility-prompt4.md +234 -234
  123. package/docs/reports/v0.7-reference-correction-workflow-prompt8.md +222 -222
  124. package/docs/reports/v0.7-reference-fidelity-prompt6.md +216 -216
  125. package/docs/reports/v0.7-reference-foundation-prompt1.md +151 -151
  126. package/docs/reports/v0.7-reference-regions-prompt2.md +195 -195
  127. package/docs/reports/v0.7-reference-requirements-prompt3.md +217 -217
  128. package/docs/reports/v0.7-release-prep.md +423 -423
  129. package/docs/reports/v0.8-binding-fidelity-interaction-batch6.md +279 -279
  130. package/docs/reports/v0.8-bounded-context-correlation-batch7.md +233 -233
  131. package/docs/reports/v0.8-comparison-contract-inspection-batch4.md +279 -279
  132. package/docs/reports/v0.8-evidence-index-readers-batch2.md +247 -247
  133. package/docs/reports/v0.8-implementation-completeness-documentation-reconciliation.md +741 -741
  134. package/docs/reports/v0.8-integrated-viewer-acceptance-batch8.md +128 -128
  135. package/docs/reports/v0.8-observation-svg-inspection-batch3.md +223 -223
  136. package/docs/reports/v0.8-prerelease-readiness-cross-platform-security-code-rot.md +687 -687
  137. package/docs/reports/v0.8-reference-candidate-inspection-batch5.md +232 -232
  138. package/docs/reports/v0.8-viewer-runtime-pwa-batch1.md +278 -278
  139. package/docs/reports/v0.8.1-implementation-completeness-documentation-reconciliation.md +114 -114
  140. package/docs/reports/v0.8.1-prerelease-readiness-cross-platform-security-code-rot.md +170 -170
  141. package/docs/reports/v0.9-architecture-retrieval.md +14 -37
  142. package/docs/reports/v0.9-final-pre-release-readiness.md +209 -209
  143. package/docs/reports/v0.9-final-readiness-corrections.md +530 -530
  144. package/docs/reports/v0.9-pre-release-readiness.md +169 -169
  145. package/docs/reports/v0.9.1-batch1-pwa-hard-gate-isolation.md +359 -359
  146. package/docs/reports/v0.9.1-batch2-hard-gate-validation-integration.md +262 -262
  147. package/docs/reports/v0.9.1-pre-release-readiness.md +206 -206
  148. package/package.json +59 -59
  149. package/dist/viewer/assets/index-BN41MI7m.css +0 -1
  150. package/dist/viewer/assets/index-CkKXnlrI.js +0 -9
@@ -1,262 +1,262 @@
1
- # v0.9.1 Batch 2 report: hard-gate validation integration
2
-
3
- ## 1. VERDICT
4
-
5
- `PASS_V0_9_1_PWA_HARD_GATE_ISOLATION`
6
-
7
- The isolated PWA hard gate is now a permanent npm command. It is part of
8
- `npm run test:security`, and through that it is part of pre-release readiness.
9
- The full regression chain passed. No production file, dependency, or version
10
- changed. v0.9.1 implementation is complete. v0.9.1 is not released.
11
-
12
- ## 2. Repository identity
13
-
14
- 1. Repository: `C:\Users\daile\Projects\my-frontend-observer`
15
- 2. Branch: `feature/v0.9.1-pwa-hard-gate-isolation`
16
- 3. Starting HEAD: `6874fd4b9690244673bd1b0e39bad0dd01cf397d` (Batch 1 commit)
17
- 4. Package version: `0.9.0` in `package.json`, in `package-lock.json`, and in
18
- `package-lock.json` `packages[""]`
19
- 5. `docs/reports/v0.9-architecture-retrieval.md` is still marked skip-worktree
20
- (`git ls-files -v` shows `S`). It was not touched.
21
- 6. Runtime: Node `v24.20.0`, Playwright `1.62.1`, Vitest `4.1.11`, Windows 11
22
-
23
- ## 3. Batch 1 entry gate
24
-
25
- PASS. Batch 1 ended with `PASS_V0_9_1_BATCH1_PWA_HARD_GATE_ISOLATED` at
26
- `6874fd4`. At the start of Batch 2 the worktree was clean and HEAD was that
27
- commit. `tests/browser/pwaHardening.test.ts` still has every Batch 1 element: a
28
- fresh evidence root, server, temporary persistent profile, and BrowserContext
29
- for the gate. It also has the separate activation and control proofs, the shell
30
- precache proof, the `/api/` cache exclusion proof, the live evidence proof, the
31
- Node-side server-down proof, the offline shell reload, the stale-evidence
32
- absence checks, and deterministic cleanup. Batch 2 did not change that file.
33
-
34
- ## 4. Root cause carried forward
35
-
36
- 1. `OLD_READINESS_PREDICATE`: `(await navigator.serviceWorker.getRegistration())?.active !== undefined`
37
- 2. `OLD_ACTIVE_VALUE_AT_FAILURE`: `null` (the worker was still installing)
38
- 3. `OLD_CLIENT_CONTROLLER_AT_FAILURE`: `null`
39
- 4. `WHY_OLD_PREDICATE_PASSED`: `null !== undefined` is `true`. The check passed
40
- as soon as a registration existed, before activation or control. The server
41
- then closed too early. The precache held only 5 entries, and the reload
42
- failed with `net::ERR_CONNECTION_REFUSED`.
43
- 5. `CORRECT_ACTIVE_PROOF`: `registration.active !== null`, read from
44
- `await navigator.serviceWorker.ready`
45
- 6. `CURRENT_CLIENT_CONTROL_PROOF`: `navigator.serviceWorker.controller !== null`
46
-
47
- Shared state hid the bug in normal order. Earlier tests in the same describe
48
- block had already activated a controlling worker on the same server origin.
49
- Selected alone, the server starts on a new random port, so no worker existed yet
50
- for that origin.
51
-
52
- Classification remains `TEST_DEFECT`. No product defect was found.
53
-
54
- ## 5. Dedicated isolated command
55
-
56
- `package.json` now has exactly one new script:
57
-
58
- `"test:pwa-hard-gate": "vitest run --config vitest.browser.config.ts tests/browser/pwaHardening.test.ts -t \"HARD GATE\""`
59
-
60
- No alias was added. The command exists because a passing full browser or
61
- security suite does not prove that the hard gate can run on its own.
62
-
63
- Direct runs after adding the script:
64
-
65
- 1. `npm run test:pwa-hard-gate` run 1: PASS (1 passed, 6 skipped)
66
- 2. `npm run test:pwa-hard-gate` run 2, straight after: PASS (1 passed,
67
- 6 skipped)
68
-
69
- ## 6. Security-suite integration
70
-
71
- `test:security` now runs three stages joined with `&&`:
72
-
73
- 1. the existing unit security tests (unchanged)
74
- 2. the existing browser security tests, including the full
75
- `tests/browser/pwaHardening.test.ts` (unchanged)
76
- 3. `npm run test:pwa-hard-gate` (new)
77
-
78
- The isolated run is added on top. The full PWA file still runs in stage 2.
79
- `test:browser` was not changed and still runs every `tests/browser/**/*.test.ts`
80
- file, including the full PWA file.
81
-
82
- ## 7. Pre-release-readiness integration
83
-
84
- 1. `PRE_RELEASE_WORKFLOW_ALREADY_CALLS_TEST_SECURITY = true`. The `candidate`
85
- job in `.github/workflows/pre-release-readiness.yml` has the step
86
- `Security test suite (npm run test:security)`.
87
- 2. `WORKFLOW_YAML_CHANGE_REQUIRED = false`. Candidate readiness now gets the
88
- isolated gate through the updated npm script. The workflow YAML was not
89
- modified.
90
-
91
- ## 8. Full PWA file validation
92
-
93
- `npx vitest run --config vitest.browser.config.ts tests/browser/pwaHardening.test.ts`
94
-
95
- PASS. 7 passed.
96
-
97
- ## 9. Isolated hard-gate repeated validation
98
-
99
- 1. Direct run 1 (section 5): PASS
100
- 2. Direct run 2 (section 5): PASS
101
- 3. First step of the regression chain: PASS (1 passed, 6 skipped)
102
- 4. Inside `npm run test:security`: PASS (1 passed, 6 skipped)
103
- 5. Last step of the regression chain, after every full suite: PASS
104
- (1 passed, 6 skipped)
105
-
106
- Run 5 shows that the full suites did not become a hidden prerequisite again.
107
-
108
- ## 10. Browser-suite validation
109
-
110
- `npm run test:browser`: PASS. 29 test files, 275 tests passed.
111
-
112
- ## 11. Security-suite validation
113
-
114
- `npm run test:security`: PASS. The output shows all three stages ran:
115
-
116
- 1. unit security: 16 files, 168 tests passed
117
- 2. browser security: 3 files, 77 tests passed
118
- 3. the npm banner `> @dailephd/my-frontend-observer@0.9.0 test:pwa-hard-gate`,
119
- then 1 file, 1 test passed, 6 skipped
120
-
121
- Stage 3 was confirmed from the command output, not only from `package.json`.
122
-
123
- ## 12. Full unit regression
124
-
125
- `npm test`: PASS. 89 test files, 1454 tests passed.
126
-
127
- No repository test checks package script strings, so no static script test was
128
- added. Running `npm run test:pwa-hard-gate` is the primary proof.
129
-
130
- ## 13. Build validation
131
-
132
- `npm run build`: PASS. The Workbox precache still has 10 entries (7 unique
133
- URLs). `sw.js` has no runtime caching rules.
134
-
135
- ## 14. Documentation validation
136
-
137
- `npm run check:docs`: PASS (17 required files). It ran in the regression chain
138
- after the documentation edits. It was run again after this report was written
139
- (see section 19).
140
-
141
- ## 15. Package-boundary validation
142
-
143
- `npm pack --dry-run`: PASS. Candidate filename
144
- `dailephd-my-frontend-observer-0.9.0.tgz`, 369 files, 1.0 MB packed, 4.0 MB
145
- unpacked.
146
-
147
- The file list was searched for `tests/`, `.my-dev-kit-workflow`, `examples/`,
148
- `pwa-profile`, `hard-gate`, and the agent-control files. The only match was
149
- `docs/reports/v0.9.1-batch1-pwa-hard-gate-isolation.md`. That is a report
150
- included by the existing `"files": ["dist", "README.md", "CHANGELOG.md", "docs",
151
- "LICENSE"]` allowlist, like every other report. No tests, `examples/v09-demo`,
152
- workflow state, Chromium profiles, or evidence roots are in the package.
153
-
154
- ## 16. Product-code audit
155
-
156
- `git diff --name-only 6874fd4` shows no path under `src/`, `viewer/`, or
157
- `.github/`. `viewer/vite.config.ts` and the service-worker caching policy were
158
- not changed.
159
-
160
- 1. `PRODUCTION_FILES_CHANGED = false`
161
- 2. `PRODUCT_SEMANTICS_CHANGED = false`
162
- 3. `PRODUCT_DEFECT_DISCOVERED = false`
163
-
164
- ## 17. Dependency/version audit
165
-
166
- 1. `dependencies`, `devDependencies`, `peerDependencies`, and
167
- `optionalDependencies` are the same as at `6874fd4`.
168
- 2. `package-lock.json` did not change.
169
- 3. The version is `0.9.0` in all three places.
170
- 4. No `npm version`, `npm publish`, tag, GitHub Release, or release branch.
171
-
172
- ## 18. Documentation reconciliation
173
-
174
- 1. `docs/CURRENT_STATE.md`: the v0.9.1 section now says implementation complete
175
- and unreleased. It records the reproduction, the two-part root cause, the
176
- new ownership and proofs, the command integration, and that production
177
- behavior is unchanged. The planning background is kept below it.
178
- 2. `docs/ROADMAP.md`: only the v0.9.1 status wording changed, from planned to
179
- implemented and unreleased. The objective, constraints, exclusions, and
180
- acceptance are unchanged.
181
- 3. `docs/PROJECT_OVERVIEW.md`: v0.9.1 is complete but unreleased. PWA
182
- hard/security acceptance no longer depends on prior test order or
183
- persistent browser state. v0.10 is still future.
184
- 4. `docs/PROJECT_MILESTONES.md`: a status line was added to the existing
185
- v0.9.1 maintenance note. It says the invariant is implemented and release is
186
- pending. Milestone 9 semantics are unchanged.
187
- 5. `docs/DEVELOPMENT.md`: the gate-isolation section now gives
188
- `npm run test:pwa-hard-gate`, says when to run it, and says it must pass on
189
- its own.
190
- 6. `docs/CI_CD.md`: the v0.9.1 wording is now implemented. It says
191
- `test:security` runs the isolated gate, that candidate readiness gets it
192
- automatically, and that the workflow YAML did not change.
193
- 7. `CHANGELOG.md`: one maintenance bullet under `[Unreleased]`. No `0.9.1`
194
- section was created.
195
-
196
- `docs/plans/v0.9.1-implementation-plan.md`, the historical `docs/reports/v0.9-*.md`
197
- reports, and the Batch 1 report were not changed.
198
-
199
- The durable rule stays in `DEVELOPMENT.md`, `CI_CD.md`, and
200
- `PROJECT_MILESTONES.md`: tests labeled `HARD GATE`, `SECURITY GATE`, or
201
- `ACCEPTANCE GATE` must set up their own material prerequisites and pass on
202
- their own from fresh state. It is now implemented policy.
203
-
204
- ## 19. Changed files
205
-
206
- 1. `package.json`
207
- 2. `CHANGELOG.md`
208
- 3. `docs/CURRENT_STATE.md`
209
- 4. `docs/ROADMAP.md`
210
- 5. `docs/PROJECT_MILESTONES.md`
211
- 6. `docs/PROJECT_OVERVIEW.md`
212
- 7. `docs/DEVELOPMENT.md`
213
- 8. `docs/CI_CD.md`
214
- 9. `docs/reports/v0.9.1-batch2-hard-gate-validation-integration.md`
215
-
216
- Generated paths:
217
-
218
- 1. Regression logs in the Claude Code session scratchpad `regression\` folder,
219
- outside the repository and not committed
220
- 2. `dist/` from `npm run build` (ignored build output)
221
- 3. Temporary test directories under the OS temp directory. They were all
222
- removed. After every run, no `my-frontend-observer-pwa-hard-gate-profile-*`,
223
- `my-frontend-observer-pwa-hard-gate-evidence-*`, or
224
- `my-frontend-observer-pwa-profile-*` directories remained.
225
- 4. `npm pack --dry-run` wrote no tarball.
226
-
227
- Full regression order, all exit 0:
228
-
229
- 1. `npm run test:pwa-hard-gate`
230
- 2. `npm run typecheck`
231
- 3. `npm run lint`
232
- 4. `npm test`
233
- 5. `npm run test:browser`
234
- 6. `npm run test:security`
235
- 7. `npm run build`
236
- 8. `npm run check:docs`
237
- 9. `npm pack --dry-run`
238
- 10. `npm run test:pwa-hard-gate`
239
-
240
- After this report was written, `npm run check:docs` and `git diff --check`
241
- were run again before the commit.
242
-
243
- ## 20. Remaining release-readiness work
244
-
245
- Not done in this batch, and not claimed:
246
-
247
- 1. the v0.9.1 integration PR from this feature branch into `master`, with
248
- required PR CI
249
- 2. exact-candidate cross-platform pre-release readiness: one tarball, hashed,
250
- installed on Windows, Linux, and macOS. `test:security` now includes the
251
- isolated gate on each platform.
252
- 3. release preparation: version bump to `0.9.1`, a `0.9.1` CHANGELOG section,
253
- and final state documents
254
- 4. user-authorized publication, tag, and GitHub Release
255
-
256
- Notes carried from Batch 1:
257
-
258
- 1. The focused `/api/` cache test still uses the old weak `?.active !== undefined`
259
- wait. It is correct in file order because it runs after the registration
260
- test on the same origin. It is not labeled as a gate.
261
- 2. `.my-dev-kit-workflow/v0.8/batch-08/pwa-profile` still exists on disk. No
262
- test uses it.
1
+ # v0.9.1 Batch 2 report: hard-gate validation integration
2
+
3
+ ## 1. VERDICT
4
+
5
+ `PASS_V0_9_1_PWA_HARD_GATE_ISOLATION`
6
+
7
+ The isolated PWA hard gate is now a permanent npm command. It is part of
8
+ `npm run test:security`, and through that it is part of pre-release readiness.
9
+ The full regression chain passed. No production file, dependency, or version
10
+ changed. v0.9.1 implementation is complete. v0.9.1 is not released.
11
+
12
+ ## 2. Repository identity
13
+
14
+ 1. Repository: `C:\Users\daile\Projects\my-frontend-observer`
15
+ 2. Branch: `feature/v0.9.1-pwa-hard-gate-isolation`
16
+ 3. Starting HEAD: `6874fd4b9690244673bd1b0e39bad0dd01cf397d` (Batch 1 commit)
17
+ 4. Package version: `0.9.0` in `package.json`, in `package-lock.json`, and in
18
+ `package-lock.json` `packages[""]`
19
+ 5. `docs/reports/v0.9-architecture-retrieval.md` is still marked skip-worktree
20
+ (`git ls-files -v` shows `S`). It was not touched.
21
+ 6. Runtime: Node `v24.20.0`, Playwright `1.62.1`, Vitest `4.1.11`, Windows 11
22
+
23
+ ## 3. Batch 1 entry gate
24
+
25
+ PASS. Batch 1 ended with `PASS_V0_9_1_BATCH1_PWA_HARD_GATE_ISOLATED` at
26
+ `6874fd4`. At the start of Batch 2 the worktree was clean and HEAD was that
27
+ commit. `tests/browser/pwaHardening.test.ts` still has every Batch 1 element: a
28
+ fresh evidence root, server, temporary persistent profile, and BrowserContext
29
+ for the gate. It also has the separate activation and control proofs, the shell
30
+ precache proof, the `/api/` cache exclusion proof, the live evidence proof, the
31
+ Node-side server-down proof, the offline shell reload, the stale-evidence
32
+ absence checks, and deterministic cleanup. Batch 2 did not change that file.
33
+
34
+ ## 4. Root cause carried forward
35
+
36
+ 1. `OLD_READINESS_PREDICATE`: `(await navigator.serviceWorker.getRegistration())?.active !== undefined`
37
+ 2. `OLD_ACTIVE_VALUE_AT_FAILURE`: `null` (the worker was still installing)
38
+ 3. `OLD_CLIENT_CONTROLLER_AT_FAILURE`: `null`
39
+ 4. `WHY_OLD_PREDICATE_PASSED`: `null !== undefined` is `true`. The check passed
40
+ as soon as a registration existed, before activation or control. The server
41
+ then closed too early. The precache held only 5 entries, and the reload
42
+ failed with `net::ERR_CONNECTION_REFUSED`.
43
+ 5. `CORRECT_ACTIVE_PROOF`: `registration.active !== null`, read from
44
+ `await navigator.serviceWorker.ready`
45
+ 6. `CURRENT_CLIENT_CONTROL_PROOF`: `navigator.serviceWorker.controller !== null`
46
+
47
+ Shared state hid the bug in normal order. Earlier tests in the same describe
48
+ block had already activated a controlling worker on the same server origin.
49
+ Selected alone, the server starts on a new random port, so no worker existed yet
50
+ for that origin.
51
+
52
+ Classification remains `TEST_DEFECT`. No product defect was found.
53
+
54
+ ## 5. Dedicated isolated command
55
+
56
+ `package.json` now has exactly one new script:
57
+
58
+ `"test:pwa-hard-gate": "vitest run --config vitest.browser.config.ts tests/browser/pwaHardening.test.ts -t \"HARD GATE\""`
59
+
60
+ No alias was added. The command exists because a passing full browser or
61
+ security suite does not prove that the hard gate can run on its own.
62
+
63
+ Direct runs after adding the script:
64
+
65
+ 1. `npm run test:pwa-hard-gate` run 1: PASS (1 passed, 6 skipped)
66
+ 2. `npm run test:pwa-hard-gate` run 2, straight after: PASS (1 passed,
67
+ 6 skipped)
68
+
69
+ ## 6. Security-suite integration
70
+
71
+ `test:security` now runs three stages joined with `&&`:
72
+
73
+ 1. the existing unit security tests (unchanged)
74
+ 2. the existing browser security tests, including the full
75
+ `tests/browser/pwaHardening.test.ts` (unchanged)
76
+ 3. `npm run test:pwa-hard-gate` (new)
77
+
78
+ The isolated run is added on top. The full PWA file still runs in stage 2.
79
+ `test:browser` was not changed and still runs every `tests/browser/**/*.test.ts`
80
+ file, including the full PWA file.
81
+
82
+ ## 7. Pre-release-readiness integration
83
+
84
+ 1. `PRE_RELEASE_WORKFLOW_ALREADY_CALLS_TEST_SECURITY = true`. The `candidate`
85
+ job in `.github/workflows/pre-release-readiness.yml` has the step
86
+ `Security test suite (npm run test:security)`.
87
+ 2. `WORKFLOW_YAML_CHANGE_REQUIRED = false`. Candidate readiness now gets the
88
+ isolated gate through the updated npm script. The workflow YAML was not
89
+ modified.
90
+
91
+ ## 8. Full PWA file validation
92
+
93
+ `npx vitest run --config vitest.browser.config.ts tests/browser/pwaHardening.test.ts`
94
+
95
+ PASS. 7 passed.
96
+
97
+ ## 9. Isolated hard-gate repeated validation
98
+
99
+ 1. Direct run 1 (section 5): PASS
100
+ 2. Direct run 2 (section 5): PASS
101
+ 3. First step of the regression chain: PASS (1 passed, 6 skipped)
102
+ 4. Inside `npm run test:security`: PASS (1 passed, 6 skipped)
103
+ 5. Last step of the regression chain, after every full suite: PASS
104
+ (1 passed, 6 skipped)
105
+
106
+ Run 5 shows that the full suites did not become a hidden prerequisite again.
107
+
108
+ ## 10. Browser-suite validation
109
+
110
+ `npm run test:browser`: PASS. 29 test files, 275 tests passed.
111
+
112
+ ## 11. Security-suite validation
113
+
114
+ `npm run test:security`: PASS. The output shows all three stages ran:
115
+
116
+ 1. unit security: 16 files, 168 tests passed
117
+ 2. browser security: 3 files, 77 tests passed
118
+ 3. the npm banner `> @dailephd/my-frontend-observer@0.9.0 test:pwa-hard-gate`,
119
+ then 1 file, 1 test passed, 6 skipped
120
+
121
+ Stage 3 was confirmed from the command output, not only from `package.json`.
122
+
123
+ ## 12. Full unit regression
124
+
125
+ `npm test`: PASS. 89 test files, 1454 tests passed.
126
+
127
+ No repository test checks package script strings, so no static script test was
128
+ added. Running `npm run test:pwa-hard-gate` is the primary proof.
129
+
130
+ ## 13. Build validation
131
+
132
+ `npm run build`: PASS. The Workbox precache still has 10 entries (7 unique
133
+ URLs). `sw.js` has no runtime caching rules.
134
+
135
+ ## 14. Documentation validation
136
+
137
+ `npm run check:docs`: PASS (17 required files). It ran in the regression chain
138
+ after the documentation edits. It was run again after this report was written
139
+ (see section 19).
140
+
141
+ ## 15. Package-boundary validation
142
+
143
+ `npm pack --dry-run`: PASS. Candidate filename
144
+ `dailephd-my-frontend-observer-0.9.0.tgz`, 369 files, 1.0 MB packed, 4.0 MB
145
+ unpacked.
146
+
147
+ The file list was searched for `tests/`, `.my-dev-kit-workflow`, `examples/`,
148
+ `pwa-profile`, `hard-gate`, and the agent-control files. The only match was
149
+ `docs/reports/v0.9.1-batch1-pwa-hard-gate-isolation.md`. That is a report
150
+ included by the existing `"files": ["dist", "README.md", "CHANGELOG.md", "docs",
151
+ "LICENSE"]` allowlist, like every other report. No tests, `examples/v09-demo`,
152
+ workflow state, Chromium profiles, or evidence roots are in the package.
153
+
154
+ ## 16. Product-code audit
155
+
156
+ `git diff --name-only 6874fd4` shows no path under `src/`, `viewer/`, or
157
+ `.github/`. `viewer/vite.config.ts` and the service-worker caching policy were
158
+ not changed.
159
+
160
+ 1. `PRODUCTION_FILES_CHANGED = false`
161
+ 2. `PRODUCT_SEMANTICS_CHANGED = false`
162
+ 3. `PRODUCT_DEFECT_DISCOVERED = false`
163
+
164
+ ## 17. Dependency/version audit
165
+
166
+ 1. `dependencies`, `devDependencies`, `peerDependencies`, and
167
+ `optionalDependencies` are the same as at `6874fd4`.
168
+ 2. `package-lock.json` did not change.
169
+ 3. The version is `0.9.0` in all three places.
170
+ 4. No `npm version`, `npm publish`, tag, GitHub Release, or release branch.
171
+
172
+ ## 18. Documentation reconciliation
173
+
174
+ 1. `docs/CURRENT_STATE.md`: the v0.9.1 section now says implementation complete
175
+ and unreleased. It records the reproduction, the two-part root cause, the
176
+ new ownership and proofs, the command integration, and that production
177
+ behavior is unchanged. The planning background is kept below it.
178
+ 2. `docs/ROADMAP.md`: only the v0.9.1 status wording changed, from planned to
179
+ implemented and unreleased. The objective, constraints, exclusions, and
180
+ acceptance are unchanged.
181
+ 3. `docs/PROJECT_OVERVIEW.md`: v0.9.1 is complete but unreleased. PWA
182
+ hard/security acceptance no longer depends on prior test order or
183
+ persistent browser state. v0.10 is still future.
184
+ 4. `docs/PROJECT_MILESTONES.md`: a status line was added to the existing
185
+ v0.9.1 maintenance note. It says the invariant is implemented and release is
186
+ pending. Milestone 9 semantics are unchanged.
187
+ 5. `docs/DEVELOPMENT.md`: the gate-isolation section now gives
188
+ `npm run test:pwa-hard-gate`, says when to run it, and says it must pass on
189
+ its own.
190
+ 6. `docs/CI_CD.md`: the v0.9.1 wording is now implemented. It says
191
+ `test:security` runs the isolated gate, that candidate readiness gets it
192
+ automatically, and that the workflow YAML did not change.
193
+ 7. `CHANGELOG.md`: one maintenance bullet under `[Unreleased]`. No `0.9.1`
194
+ section was created.
195
+
196
+ `docs/plans/v0.9.1-implementation-plan.md`, the historical `docs/reports/v0.9-*.md`
197
+ reports, and the Batch 1 report were not changed.
198
+
199
+ The durable rule stays in `DEVELOPMENT.md`, `CI_CD.md`, and
200
+ `PROJECT_MILESTONES.md`: tests labeled `HARD GATE`, `SECURITY GATE`, or
201
+ `ACCEPTANCE GATE` must set up their own material prerequisites and pass on
202
+ their own from fresh state. It is now implemented policy.
203
+
204
+ ## 19. Changed files
205
+
206
+ 1. `package.json`
207
+ 2. `CHANGELOG.md`
208
+ 3. `docs/CURRENT_STATE.md`
209
+ 4. `docs/ROADMAP.md`
210
+ 5. `docs/PROJECT_MILESTONES.md`
211
+ 6. `docs/PROJECT_OVERVIEW.md`
212
+ 7. `docs/DEVELOPMENT.md`
213
+ 8. `docs/CI_CD.md`
214
+ 9. `docs/reports/v0.9.1-batch2-hard-gate-validation-integration.md`
215
+
216
+ Generated paths:
217
+
218
+ 1. Regression logs in the Claude Code session scratchpad `regression\` folder,
219
+ outside the repository and not committed
220
+ 2. `dist/` from `npm run build` (ignored build output)
221
+ 3. Temporary test directories under the OS temp directory. They were all
222
+ removed. After every run, no `my-frontend-observer-pwa-hard-gate-profile-*`,
223
+ `my-frontend-observer-pwa-hard-gate-evidence-*`, or
224
+ `my-frontend-observer-pwa-profile-*` directories remained.
225
+ 4. `npm pack --dry-run` wrote no tarball.
226
+
227
+ Full regression order, all exit 0:
228
+
229
+ 1. `npm run test:pwa-hard-gate`
230
+ 2. `npm run typecheck`
231
+ 3. `npm run lint`
232
+ 4. `npm test`
233
+ 5. `npm run test:browser`
234
+ 6. `npm run test:security`
235
+ 7. `npm run build`
236
+ 8. `npm run check:docs`
237
+ 9. `npm pack --dry-run`
238
+ 10. `npm run test:pwa-hard-gate`
239
+
240
+ After this report was written, `npm run check:docs` and `git diff --check`
241
+ were run again before the commit.
242
+
243
+ ## 20. Remaining release-readiness work
244
+
245
+ Not done in this batch, and not claimed:
246
+
247
+ 1. the v0.9.1 integration PR from this feature branch into `master`, with
248
+ required PR CI
249
+ 2. exact-candidate cross-platform pre-release readiness: one tarball, hashed,
250
+ installed on Windows, Linux, and macOS. `test:security` now includes the
251
+ isolated gate on each platform.
252
+ 3. release preparation: version bump to `0.9.1`, a `0.9.1` CHANGELOG section,
253
+ and final state documents
254
+ 4. user-authorized publication, tag, and GitHub Release
255
+
256
+ Notes carried from Batch 1:
257
+
258
+ 1. The focused `/api/` cache test still uses the old weak `?.active !== undefined`
259
+ wait. It is correct in file order because it runs after the registration
260
+ test on the same origin. It is not labeled as a gate.
261
+ 2. `.my-dev-kit-workflow/v0.8/batch-08/pwa-profile` still exists on disk. No
262
+ test uses it.