Merge branch 'main' into feature/techlog-ui-migration

Integrates the frontend template sync (a0fbafb → 5434760) into the TechLog UI
migration. Merged in this direction so every conflict is resolved and proved in
the worktree; main is only fast-forwarded afterwards and never holds a state
that was not verified here.

15 conflicts. The rule throughout: keep the template's mechanism, keep the
product's content, and never invent a third state neither branch would accept.

The template's product manifest and its runtime feature kill switch are adopted.
The route registry is deliberately not composed from contract.routes: the
reference feature still declares screens this product deleted, and reducing over
them would register paths with no component behind them. ROUTE_FEATURE_OWNER is
narrowed to registered routes for the same reason. The first resolution did
compose from contract.routes and was rejected by product-features.test.ts.

Three files pinned counts and a digest describing the gate contract. Neither
side's numbers describe the merged config/ci/gates.json, so they were recomputed
from it rather than chosen: 27 gates, 82 commands, 94 command references, 107
evidence references, 128 artifacts, shape sha256 5063586d.

README.md and docs/accessibility/manual-checklist.md now enumerate this
product's 27 routes, which the template's own verify:documentation requires.

product-feature-switch.test.tsx was rewritten around the invariant that still
applies here — no registered route without a component — rather than deleted
with the screens it used to exercise.

docs/operations/template-merge-2026-08-17.md records every decision, the gate
results, and the three follow-ups this merge deliberately did not decide.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
DongHyeonka
2026-08-17 18:38:08 +09:00
co-authored by Claude Opus 5
100 changed files with 3310 additions and 443 deletions
+52 -3
View File
@@ -472,6 +472,11 @@
"id": "check-ci",
"script": "check:ci",
"expect": "pass"
},
{
"id": "check-release-admission",
"script": "check:release-admission",
"expect": "pass"
}
],
"artifactSchemas": [
@@ -732,6 +737,12 @@
"id": "sarif-secret-scan",
"kind": "sarif",
"maxBytes": 67108864
},
{
"id": "json-deployment-admission",
"kind": "json",
"maxBytes": 67108864,
"executableSchemaId": "deployment-admission"
}
],
"artifacts": [
@@ -1710,6 +1721,21 @@
"producerCommandIds": [
"check-ci"
]
},
{
"id": "artifact-artifacts-release-deployment-admission-json",
"path": "artifacts/release/deployment-admission.json",
"schemaId": "json-deployment-admission",
"production": "command-generated",
"producerCommandIds": [
"check-release-admission"
]
},
{
"id": "artifact-artifacts-quality-gates-FE-GATE-027-txt",
"path": "artifacts/quality/gates/FE-GATE-027.txt",
"schemaId": "text",
"production": "runner-generated"
}
],
"gates": [
@@ -2178,6 +2204,18 @@
"artifact-artifacts-performance-lab-json"
],
"retentionClassId": "release-coherence"
},
{
"id": "FE-GATE-027",
"name": "release-admission",
"commandIds": [
"check-release-admission"
],
"logArtifactId": "artifact-artifacts-quality-gates-FE-GATE-027-txt",
"evidenceArtifactIds": [
"artifact-artifacts-release-deployment-admission-json"
],
"retentionClassId": "release-coherence"
}
],
"stages": [
@@ -2212,7 +2250,8 @@
"FE-GATE-014",
"FE-GATE-015",
"FE-GATE-019",
"FE-GATE-026"
"FE-GATE-026",
"FE-GATE-027"
]
},
{
@@ -2365,10 +2404,20 @@
"condition": "release",
"timeoutMinutes": 45,
"gateIds": [
"FE-GATE-015"
"FE-GATE-015",
"FE-GATE-027"
],
"browserGateIds": [],
"environment": [],
"environment": [
{
"name": "APP_PROFILE",
"value": "${{ vars.APP_PROFILE }}"
},
{
"name": "RELEASE_TARGET",
"value": "${{ vars.RELEASE_TARGET }}"
}
],
"steps": [
{
"kind": "checkout"