feat: add the Studio release editor and point the footer at the changelog
The public site shipped a Releases page and a footer link to a release, and neither could ever have content: the read path existed, the write path did not. This adds the seven release operations to the contract contribution and the gateway, and a Studio screen that can actually write one. The editor is six markdown fields rather than one, because that is what the contract models and what a release note is — why, what, what a reader notices, what it leaves in the code, how it was verified, what is still open. Publishing is separate from saving: a draft saves in any state, but the public query keys on PUBLISHED alone, so publish is where completeness is demanded. No new CSS. The screen reuses the document editor's field classes and the working-copy list's row classes, so it inherits Studio's spacing and type instead of introducing a second look. The footer previously linked `/releases/0.1.0` — a version that did not exist, so the link 404'd, and one that would have gone stale at 0.2.0 anyway. It now points at the changelog index, which is the only place that knows what the latest release is and which reads correctly when there are none. Route inventory, navigation order, message catalog, manual accessibility evidence, artifact baseline, and the pinned gate-shape digest all move with the new route. The digest was recomputed by first reproducing the previous constant from the previous gates.json, so the computation is known to be the one it was pinned under.
This commit is contained in:
@@ -464,7 +464,11 @@ const CANONICAL_GATE_SHAPE_SHA256 =
|
||||
// lists one evidence artifact per installed route and refuses a set that does
|
||||
// not match the route scope exactly, so adding a route necessarily moves this
|
||||
// digest — that is the point of pinning it.
|
||||
"8c73d4477392a63e91088ff91e53293e7fc3ace891f8eb3da3b0d05fa714df60";
|
||||
// Release authoring: recomputed again after FE-GATE-009 gained the
|
||||
// TECH_LOG_STUDIO_RELEASES evidence artifact, by the same method — 8c73d447…
|
||||
// was first reproduced from the previous gates.json, so the computation that
|
||||
// produced this value is known to be the one the constant was pinned under.
|
||||
"187dbd9676b7b3444409b5af4143d49927b1eacc67f57a099f4a3765bb64d865";
|
||||
|
||||
function canonicalGateShapeSha256(gates: CiGateContract["gates"]): string {
|
||||
const normalized = gates.map(
|
||||
@@ -519,8 +523,8 @@ function canonicalAuthorityBaselineFailures(contract: CiGateContract): string[]
|
||||
// Alignment follow-up, item 2 added the TechLog junit report.
|
||||
// The taxonomy route added its own manual a11y evidence file — every installed
|
||||
// route carries one, and the gate checks that the two sets match exactly.
|
||||
if (contract.artifacts.length !== 131) {
|
||||
failures.push(`artifact authority baseline must contain exactly 131 artifacts; received ${contract.artifacts.length}`);
|
||||
if (contract.artifacts.length !== 132) {
|
||||
failures.push(`artifact authority baseline must contain exactly 132 artifacts; received ${contract.artifacts.length}`);
|
||||
}
|
||||
if (contract.stages.length !== 5) {
|
||||
failures.push(`stage authority baseline must contain exactly 5 stages; received ${contract.stages.length}`);
|
||||
|
||||
Reference in New Issue
Block a user