docs: record TechLog migration evidence

This commit is contained in:
DongHyeonka
2026-08-16 05:07:58 +09:00
parent 3a7c5deca0
commit 47cbf4ddca
3 changed files with 20202 additions and 80 deletions
File diff suppressed because it is too large Load Diff
@@ -96,39 +96,82 @@ the resulting browser comparison is pixel-identical.
The source was copied to `/tmp/techlog-source-parity.I0CBK7` before build and
runtime caches were created. The supplied source directory was used only for
read-only file comparison; it was not edited. The temp-copy Vinext production
server and the target Vite preview were captured by one Playwright Chromium
instance with two fresh contexts under identical conditions:
server on `4375` and the target `dist/server.mjs` production artifact on `4174`
were captured by one Playwright Chromium instance with two fresh contexts
under identical conditions:
- `ko-KR`, `Asia/Seoul`, light color scheme, reduced motion, device scale 1,
service workers blocked, and a fixed `2026-08-14T01:00:00.000Z` clock;
- 1000-pixel viewport height, full-page screenshots, `document.fonts.ready`,
Pretendard/IBM Plex font checks, zero-duration animation/transition/caret;
- no screenshot masks; exact RGBA pixel comparison plus product-subtree
tag/class/text/ARIA projection and console/request failure comparison.
- no screenshot masks; exact RGBA pixel comparison plus normalized recursive
product-subtree tags, ordered children, complete classes, relevant
attributes, text/ARIA relationships, response metadata, boot lifecycle, and
console/request failure comparison.
The only attributes omitted by name after concrete diagnostics are React
Router `data-discover`, Next Image `data-nimg`/`decoding`/`srcset`, and Next SSR
`selected`; generated React IDs and CSS-module hashes are normalized by value.
No broad attribute class is omitted.
| Evidence group | Cases |
| --- | ---: |
| 27 canonical routes at 360 and 1440 pixels | 54 |
| Every additional known Public fixture slug/version | 18 |
| Public home breakpoint transitions | 12 |
| Studio screen/state fixtures | 19 |
| Ten unknown Public dynamic shapes at 360 and 1440 pixels | 20 |
| Search/menu/preview/dialog/publication interactions | 7 |
| **Total** | **112** |
| **Total** | **130** |
Result: 112/112 passed, zero failed, zero different pixels, all DOM/class/text/
ARIA projections equal, and zero unexplained source or target console/request
errors. The target-only visual regression suite exercises the same 112 cases
against 111 committed PNGs; the canonical and Studio-state 1440-pixel
Result: 130/130 passed, zero failed, zero different pixels, all recursive
DOM/class/attribute/text/ARIA trees and HTTP response metadata equal, and zero
unexplained source or target console/request errors. The target-only visual
regression suite exercises the same 130 cases against 129 committed PNGs; the
canonical and Studio-state 1440-pixel
`/studio/publications` cases intentionally share one identical snapshot.
Source screenshots were temporary comparison inputs and were not copied into
the target snapshot directory.
The checked clean-checkout command is
`TZ=Asia/Seoul corepack pnpm verify:tech-log-source-parity`; it runs directly
under the installed Node 24 runtime and has no `tsx` dependency. Durable
evidence is committed at
`docs/operations/evidence/tech-log-source-parity.json`. It records 178 source
checksums with tree digest
`6724c2f898eefc62d2fc0ee695bccc3ae61a69c5153ed43c69f2cf99ee45bca5`,
target candidate `3a7c5deca06679fb9b8710da2cce87bbca07ce8a`, build-manifest digest
`3579650faa482f566553c00d8b4a05a05b4f7a1ab93b83e48676289bbcf02984`,
Vite-manifest digest
`cfd583ed7b6c27dce7f47389447608636b6b9df3e28df00c6416674da2c7c46d`,
case inventory digest
`5689bcdb5d5637205cdeb92b7c57f72d99f0b039818b8f90afdde526bbafe0ac`,
and evidence payload digest
`f046047beded19ce468be607dcf99c6b74d4e07323457ec7145c56d2f67d2c79`.
The production source responds to both a missing dynamic slug such as
`/projects/missing-project` and an unmatched path such as
`/definitely-not-a-product-route` with HTTP 404, `text/plain`, and the exact
nine-byte body `Not Found`. The target intentionally removes the Public shell
for those paths and matches that response in curl and Chromium regressions;
this is the observed production source contract, not a generic runtime error.
`/definitely-not-a-product-route` with HTTP 404,
`text/plain;charset=UTF-8`, and the exact nine-byte body `Not Found`. The
target production server intentionally removes the Public shell for those
paths and matches that response in direct HTTP and Chromium regressions. Known
Public routes and all known Studio routes remain SPA-served; `/studio/*`
unknown paths preserve the source's in-shell HTML with HTTP 404. This is the
observed production source contract, not a generic runtime error.
## Accessibility review boundary
Automated Chromium `@a11y` coverage passes 29/29. The source-controlled manual
inventory contains exactly the 27 installed route IDs and removes the obsolete
starter records. Every human record remains `pending-manual-review` until one
reviewer evaluates keyboard, focus, modal/error behavior, color, reduced
motion, and screen-reader output against immutable candidate
`3a7c5deca06679fb9b8710da2cce87bbca07ce8a`. Therefore
`corepack pnpm review:a11y-manual` intentionally exits nonzero with 27
incomplete records and `release IDs do not match`; neither the manual gate nor
`FE-GATE-009` is represented as passing. The exact completion format is in
`docs/accessibility/manual-checklist.md`, and signed evidence must be committed
separately after it cites the candidate SHA.
## Governed route migration
@@ -148,11 +191,15 @@ The exact repository aggregate command was run in the managed workspace:
corepack pnpm test:all
```
Its runtime-schema phase passed 3 files/40 tests. The unit phase passed 117
files/1,738 tests and reported 50 failures in three child-process-heavy files:
39 `ci-artifact-contract`, 2 `ci-workflow-generation`, and 9
`http-scenario-evidence`. Every failure was rooted in `spawnSync ... EPERM` in
the restricted process sandbox; no `tests/features/tech-log` test failed.
Its fresh staged-candidate runtime-schema phase passed 3 files/40 tests. The
unit phase passed 122 files/1,773 tests and reported 19 failures, all in the
pre-existing `ci-artifact-contract` provider/cgroup, RLIMIT/EMFILE,
restrictive-umask, `/tmp`, timing, and identity environment cases. No
`tests/features/tech-log` test failed. A pre-staging diagnostic run also found
39 `APP_HOME` release-inventory failures because new serving files were not yet
visible to `git ls-files`; staging the complete candidate fixed that test
precondition, and all 39 disappeared. The same run's one guardian aggregate
timeout passed 1/1 in isolation and 21/21 in the fresh staged aggregate.
The failing files were then reproduced in isolation outside that child-process
restriction:
@@ -161,14 +208,13 @@ restriction:
corepack pnpm exec vitest run tests/unit/ci-artifact-contract.test.ts tests/unit/ci-workflow-generation.test.ts tests/unit/http-scenario-evidence.test.ts
```
Result: 3 files/529 tests, 510 passed and the pre-existing 19 environment-only
Result: 3 files/529 tests, 510 passed and the same 19 environment-only
`ci-artifact-contract` cases failed. The 407 `ci-workflow-generation` and 14
`http-scenario-evidence` tests all passed. The remaining exact 19 are the
documented provider lifecycle/cgroup, RLIMIT/EMFILE, restrictive-umask, and
`/tmp` timing/identity cases; they contain no TechLog code or test. The
aggregate phases after unit were also run directly: component 18 files/124
tests, integration 11 files/82 tests under the required child-process scope,
reference feature 4 files/13 tests, and recipes 2 files/17 tests all passed.
`http-scenario-evidence` tests all passed. These 19 contain no TechLog code or
test. The aggregate phases after unit were also run directly: component 18
files/124 tests, integration 11 files/82 tests under the required child-process
scope, reference feature 4 files/13 tests, and recipes 2 files/17 tests all
passed.
The inventories in this document are human review baselines. Automated
coverage is intentionally limited to the two SVG byte contracts, evidence