Complete guided release console workflow
Dependency Audit / dependency-audit (push) Successful in 2m35s
Deployment Installer / deployment-installer (push) Successful in 6s
Security Audit / security-audit (push) Failing after 15s

This commit is contained in:
2026-07-31 05:46:50 +02:00
parent b4248a849e
commit f1fd143ef5
13 changed files with 2332 additions and 117 deletions
+17 -12
View File
@@ -943,10 +943,10 @@
<section id="installVerificationSection">
<div class="section-head">
<h2>5. Installation Verification</h2>
<small>external gate</small>
<small>receipt-bound local gate</small>
</div>
<div class="details">
<p class="hint">The signed catalog and Python artifacts are produced by the durable candidate step. End-to-end installation verification still runs in release integration CI and is not yet a bounded local-console executor.</p>
<p class="hint">The durable verification step installs every selected candidate wheel into a private temporary target with network and dependency resolution disabled, then compares installed package metadata with the frozen release plan. Deployment-specific integration checks remain part of CI.</p>
</div>
</section>
</div>
@@ -1783,7 +1783,7 @@
target: "releaseRunSection",
run,
plan,
match: (step) => /:(preflight|tag|push)$/.test(step.id || ""),
match: (step) => /:(preflight|version|commit|bundle|tag|push)$/.test(step.id || "") || step.id === "release:alignment",
waitingStatus: "create run",
}),
runWorkflowPhase({
@@ -1804,13 +1804,15 @@
match: (step) => step.id === "catalog:validate-sign-publish",
waitingStatus: "waiting",
}),
{
runWorkflowPhase({
id: "verify",
label: "Verify",
target: "installVerificationSection",
state: run?.state?.status === "completed" ? "unavailable" : "locked",
status: run?.state?.status === "completed" ? "CI gate" : "waiting",
},
run,
plan,
match: (step) => step.id === "release:install-verify",
waitingStatus: "waiting",
}),
];
const firstOpen = phases.findIndex((phase) => ["current", "blocked", "unavailable"].includes(phase.state));
if (firstOpen >= 0) {
@@ -1924,10 +1926,10 @@
};
} else if (run.state?.status === "completed") {
guidance = {
title: "Run installation verification",
detail: "Every durable source, package, signing, and publication step has a recorded success receipt.",
remediation: "End-to-end installation verification is still an external release-integration CI gate.",
button: "Review verification gate",
title: "Release run completed",
detail: "Every durable source, package, signing, publication, and local installation-verification step has a recorded success.",
remediation: "Review the run receipts and continue with deployment-specific integration checks where required.",
button: "Review completed run",
action: { type: "scroll", target: "installVerificationSection" },
};
} else {
@@ -2389,9 +2391,12 @@
const blockers = unit.blockers.length ? `<p>${escapeHtml(unit.blockers.join("; "))}</p>` : "";
const warnings = unit.warnings.length ? `<p>${escapeHtml(unit.warnings.join("; "))}</p>` : "";
const kind = unit.status === "blocked" ? "block" : unit.status === "attention" ? "warn" : "ok";
const capabilities = Array.isArray(unit.capabilities) && unit.capabilities.length
? `<p class="action-meta">Capabilities: ${escapeHtml(unit.capabilities.join(", "))}</p>`
: "";
return `<div class="action">
<h3>${pill(unit.status, kind)} ${escapeHtml(unit.repo)} ${escapeHtml(unit.current_version || "-")} -> ${escapeHtml(unit.target_version)}</h3>
${blockers}${warnings}
${capabilities}${blockers}${warnings}
</div>`;
}).join("");
const compatibilityHtml = compatibility.map((issue) => {