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:
+52
-3
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user