Skip to content

Commit 0848cd3

Browse files
committed
Move real KVM proof out of hosted latest gate
1 parent 4df538d commit 0848cd3

14 files changed

Lines changed: 210 additions & 200 deletions

.github/workflows/release-artifacts.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,6 @@ jobs:
846846
--receipt "release-bundle-integrity=$UPLOAD_DIR/m80-readiness-release-bundle-integrity.json" \
847847
--receipt "docs-command=$UPLOAD_DIR/m80-readiness-docs-command.json" \
848848
--receipt "hostless-quickstart=$UPLOAD_DIR/m80-readiness-hostless-quickstart.json" \
849-
--receipt "real-kvm-quickstart=$UPLOAD_DIR/m80-readiness-real-kvm-quickstart.json" \
850849
--out "$UPLOAD_DIR/m80-release-readiness-pre-latest-decision.json" \
851850
--write
852851
gh release list \

Cargo.lock

Lines changed: 23 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ members = ["crates/*"]
44
exclude = ["support/m80-close-range"]
55

66
[workspace.package]
7-
version = "0.2.16"
7+
version = "0.2.17"
88
edition = "2021"
99
license = "Apache-2.0 OR MIT"
1010
repository = "https://github.com/nathanp/m80"

crates/m80-cli/tests/release/current_latest_version_cutover.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@ fn current_latest_version_cutover_names_real_repair_tag() {
2828
.expect("read installer layout fixture");
2929

3030
assert!(
31-
cargo_toml.contains("version = \"0.2.16\""),
31+
cargo_toml.contains("version = \"0.2.17\""),
3232
"workspace package version must match the current repair tag"
3333
);
3434
assert!(
35-
runbook.contains("workspace package version `0.2.16`")
36-
&& runbook.contains("expected release tag is `v0.2.16`"),
35+
runbook.contains("workspace package version `0.2.17`")
36+
&& runbook.contains("expected release tag is `v0.2.17`"),
3737
"release runbook must document the real current repair version"
3838
);
3939
assert!(
40-
behavior.contains("matching stable tag is `v0.2.16`")
40+
behavior.contains("matching stable tag is `v0.2.17`")
4141
&& behavior.contains("`v0.2.7` installer handoff"),
4242
"behavior doc must name the repaired tag and the superseded latest state"
4343
);

docs/behaviors/release/current-latest-version-cutover.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,23 @@ branch-protection endpoint. `v0.2.15` accepts an active branch ruleset with
2424
required status checks as the workflow-readable proof for `main`, then failed
2525
before release mutation because the publish-authority check required the
2626
release to already exist. `v0.2.16` treats a "release not found" metadata probe
27-
as the expected pre-create state while still failing on unreadable API errors.
27+
as the expected pre-create state while still failing on unreadable API errors,
28+
then published validated release assets but failed latest promotion because the
29+
hosted workflow still required an external real-KVM receipt. `v0.2.17` moves
30+
that real-KVM proof to the closeout/freshness evidence path instead of the
31+
GitHub-hosted latest-promotion gate.
2832

29-
The current repair source therefore uses workspace package version `0.2.16`.
30-
The matching stable tag is `v0.2.16`; tags at or before the existing public
33+
The current repair source therefore uses workspace package version `0.2.17`.
34+
The matching stable tag is `v0.2.17`; tags at or before the existing public
3135
latest `v0.2.11` are intentionally rejected as old-release backfill candidates
3236
by `scripts/current_latest_repair_preflight.py`.
3337

3438
The release runbook documents this as the real source-state expectation rather
3539
than a fixture-only value. Dev builds still render as `<package-version>-dev`,
36-
so an unreleased local build now reports `0.2.16-dev` and remains barred from
40+
so an unreleased local build now reports `0.2.17-dev` and remains barred from
3741
using mutable `releases/latest` implicitly.
3842

39-
Fixture and release-script coverage uses `v0.2.16` as the packageable release
43+
Fixture and release-script coverage uses `v0.2.17` as the packageable release
4044
tag. Rust installer-layout fixtures derive their release tag from
4145
`CARGO_PKG_VERSION`, so the bundled layout tests also follow the same cutover.
4246
Tests may still use other tags only when they are explicitly testing mismatch,

docs/behaviors/release/release-readiness-decision.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@ Stages keep the release order honest:
1616
- `pre-upload` requires workflow-policy, release-bundle-integrity,
1717
docs-command, and hostless-quickstart receipts before publish authority or
1818
upload can run.
19-
- `pre-latest` additionally requires the real-KVM quickstart receipt before
20-
the workflow can move the release to latest.
19+
- `pre-latest` repeats those hosted receipts after the uploaded draft has been
20+
validated and before the workflow can move the release to latest.
2121
- `post-latest-public` adds the unauthenticated public latest receipt after the
22-
latest pointer has moved.
22+
latest pointer has moved. The external real-KVM quickstart proof is required
23+
for verified close and freshness evidence, not inside GitHub-hosted latest
24+
promotion.
2325

2426
Required stage lanes must be present and current. The command fails closed for
2527
missing lanes, stale tag or commit, unknown lane state, blocking statuses,

docs/behaviors/release/release-readiness-lanes.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,9 @@
6161
"workflow-policy",
6262
"release-bundle-integrity",
6363
"docs-command",
64-
"hostless-quickstart",
65-
"real-kvm-quickstart"
64+
"hostless-quickstart"
6665
],
67-
"policy_text": "Latest promotion additionally requires the privileged real-KVM quickstart proof. The hostless fixture never substitutes for this lane."
66+
"policy_text": "Latest promotion repeats the hosted publish gates after the uploaded draft has been validated. The external real-KVM quickstart proof is required for verified close and freshness evidence, not inside GitHub-hosted latest promotion."
6867
},
6968
{
7069
"id": "post-latest-public",

docs/behaviors/release/release-readiness-lanes.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@ artifacts.
2727

2828
`scripts/release_readiness_decision.py` consumes a stage plus explicit
2929
`lane_id=path` inputs and writes the aggregate decision. `pre-upload` gates
30-
publish authority and upload. `pre-latest` adds real-KVM quickstart proof before
31-
latest promotion. `post-latest-public` includes the unauthenticated public
32-
latest proof after the latest pointer moves. Missing stage lanes, stale tag or
33-
commit, authenticated public-access proof, blocking statuses, and fixture
34-
substitution for real-substrate lanes fail before a publish hook can consume
35-
the decision.
30+
publish authority and upload. `pre-latest` repeats those hosted gates after
31+
draft validation and before latest promotion. `post-latest-public` includes the
32+
unauthenticated public latest proof after the latest pointer moves. The
33+
real-KVM quickstart lane remains a required external proof for verified close
34+
and freshness evidence, not a GitHub-hosted latest-promotion input. Missing
35+
stage lanes, stale tag or commit, authenticated public-access proof, blocking
36+
statuses, and fixture substitution for real-substrate lanes fail before a
37+
publish hook can consume the decision.

docs/runbook/release.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ M80_RELEASE_TAG=vX.Y.Z \
1616
```
1717

1818
The injected tag must be the exact `v<workspace package version>` tag. For the
19-
workspace package version `0.2.16`, the expected release tag is `v0.2.16`.
19+
workspace package version `0.2.17`, the expected release tag is `v0.2.17`.
2020
The injected source commit must be the exact commit used by the release build
2121
manifest and signed release integrity material.
2222
The injected Rust target triple must be one of the target triples recorded in

scripts/lint-github-workflows.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,7 @@ def lint_release_artifact_origin(path: Path, text: str, lines: list[str]) -> lis
794794
"--dist-dir \"$UPLOAD_DIR\"": "publish manifest check must inspect the downloaded release artifact set",
795795
"scripts/release_readiness_decision.py": "publish job must run the aggregate readiness decision before release mutation",
796796
"--stage pre-upload": "publish job must write the pre-upload readiness decision",
797-
"--stage pre-latest": "publish job must require the real-KVM readiness stage before latest promotion",
797+
"--stage pre-latest": "publish job must recheck hosted readiness before latest promotion",
798798
"--out \"$UPLOAD_DIR/m80-release-readiness-decision.json\"": "publish job must preserve the pre-upload readiness decision",
799799
"--readiness-decision \"$UPLOAD_DIR/m80-release-readiness-decision.json\"": "publish decision must bind the readiness decision",
800800
"name: m80-release-readiness-decision-${{ github.run_id }}": "publish job must upload the readiness decision artifact",

0 commit comments

Comments
 (0)