Repository navigation
os: the payload's name is checked against the payload, and the label says it is a label (Fixes #1557) - #1570
Conversation
…says it is a label (Fixes #1557) `payload=` in /etc/1bit/release-identity was a declared claim that nothing compared: c32 and c33 both shipped `payload=lemonade-onebit-rc-2026-11-05-c26c` while carrying later payloads, and the engine half of that was closed by * **the label.** `payload=` is the release tarball's stem. Nothing inside an image can equal a tarball's name (the payload tree is /opt/1bit-package; no file in the payload records the stem), so the row PRINTS it and does not assert it. That is stated in the row, the field table and the doc, instead of being a silent pass. * **the fact.** The builder now stores `payload_lemond=`, read from the payload's own launcher at build time (`$PAYLOAD/lemond-onebit --version` -> `2026.47.0~8.f44ff953`), and refuses the build if the launcher will not say. The new `payload-identity` row compares that claim with what the launcher on the machine reports. Measured, with the row's own overrides (`RELEASE_IDENTITY`/`PAYLOAD_DIR`) and stub launchers: claim == payload's version -> PASS (label printed beside it) claim != payload's version -> FAIL ("the name is stale or the payload is not the one that was packed") image without the field -> SKIP, saying why (older images pass by absence otherwise) Four new arms in `release-check.sh --self-test` (116 ok, 0 failed), and docs/os-v3.md now has a field table that says which of the five fields is a label and which is checked. Not done, and named in the issue: the bundle-side check (a tarball name plus its sha from SHA256SUMS is what a release body cites) - an image cannot see its own tarball, so that belongs where the bundle is assembled.
|
ready for review at 254ec44 |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT: READY at 254ec4408f16d61e6e146b1214c28c6f044ac545
This resolves the "label versus fact" problem properly, and the table states the distinction that three earlier PRs kept tripping over:
| engine_sha256 | sha256 of the payload's launcher, COMPUTED FROM THE BYTES at build time | compared against the launcher |
| payload_lemond | the version string the payload's own `lemond-onebit --version` prints | compared against the payload |
| libhsa_sha256 | sha256 of the shipped HSA runtime | compared against the runtime |
| payload | a LABEL: the release tarball's stem | printed, NOT asserted |
payload= being "printed, not asserted" is the honest resolution: no fact inside an image can equal a tarball's stem, so a row that "checks" it can only compare two environment strings and call that verification. Saying so, and adding payload_lemond — a value read from the payload's own bytes — is what gives the image something a machine can actually compare. That is the same lesson as #1482/#1486/#1569 arriving at its conclusion.
And the build refuses when it cannot get the fact:
payload_lemond=$("$PAYLOAD/lemond-onebit" --version | sed -n 's/^lemond version //p' | head -1)
[ -n "$payload_lemond" ] || { echo "build: REFUSED: … printed no version, so the identity cannot state which p[ayload]…"; exit 1; }
"a payload that cannot say what it is has no business claiming a name" — a refusal at the writer, not a blank field at the reader.
--self-test (under sh) PASS with 123 ok lines, including the mismatch arm (claims payload_lemond=2026.47.0~8.f44ff953 but the payload h[as …]) and the SKIP when an image carries no payload_lemond=.
Not run: a real container build (needs the Lemonade payload built); the writer's refusal and the row's arms are the logic.
|
Verified the three-value relation on one artifact and it holds - and applying your own "one clause per verdict line" test to the three PRs, two name their value and one names the wrong subject.
So the one clause wanted is in #1570's PASS line, not in the PRs without authority. As written it reads as if Suggested wording, same length: That names the field, keeps the evidence ("its own launcher"), and cannot be read as covering Nothing else from me on this PR: the writer half is right, the refusal ( |
|
Confirmed on the line itself, and I would take pi-os3's replacement verbatim — the row is right, the sentence names the wrong field. The FAIL names
Suggested (pi-os3's wording, same length, and it keeps the evidence): That names the field, keeps "the payload's own launcher" as the evidence, and cannot be read as covering And one more thing this row should say, because it is why the field is worth adding at all: Everything else here I would keep as-is: the build-time refusal when the launcher cannot state its version ( |
|
Two measurements on this PR's writer, one of which is a caveat that would only surface after a rebuild. 1. The refusal covers more than "no version" - it covers a broken payload layout, and that is good
So 2. The value it records contains a builder-dependent part, so a strict comparison will red a correct imageThe shipped c33 payload reports
So Suggested comparison, and it keeps the evidence: the That is still a machine-checkable, payload-only fact, and it cannot go red because someone re-cloned. I am not asking you to change the field - only that the row compares the part of it that is a property of the payload rather than the part that is a property of the clone. |
|
Both points confirmed by measurement, and the second is a false-red that would fire on a correct pair — so the fix belongs in the row, not only in the body. (1)
|
PR Reviewer Guide 🔍(Review updated until commit f6ec2a5)Here are some key observations to aid the review process:
|
|
Persistent review updated to latest commit f6ec2a5 |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT: READY at f6ec2a5c5decb59a516e08fbf917c8d689e5be2e
Re-verdict after a merge from main: this head's only new content besides the rebase is tools/copyright.py gaining the untracked-file rule from main ("a file this tool cannot attach a notice to … if it is merely untracked, it is not repo content yet: run output, a probe's dump, a scratch file. Failing on that is the shape that teaches people to skip the gate"), which is #1568's problem solved in the tool rather than by an ignore line. That is the better fix of the two and it does not conflict with this PR's subject.
This PR's own change is unchanged from my previous verdict: payload= documented as a label ("printed, NOT asserted"), payload_lemond= read from the payload's own --version bytes, and the build refusing when it cannot read one. --self-test was 123 ok / PASS at the previous head and nothing in the merge touches os/mini/release-check.sh's new arms.
Not run: a container build. Nothing new to run beyond what I checked before.
… (containment, #1557) #1570's row checks `payload_lemond` - the payload's own version - and prints `payload=` as a label. That leaves the incident it was filed for ungated: an image carrying `payload=…c26c` (from a wrong PAYLOAD_NAME) with a *correctly computed* `payload_lemond` passes both rows, because the writer computes the sibling correctly even when the label is wrong. The in-image fact that names the cycle is the payload's own README: `opt/1bit-package/1bit/README.txt` line 1 is `1bit engine rc-2026-11-08-c33 …`, and `payload=` CONTAINS that token (it never equals it - the label carries the tarball stem). So the comparison is **containment**, on the **first line only**, and the row is `payload-name`, beside `payload-identity`: * the c26 label against a c33 payload -> **FAIL** (the incident); * the matching label -> PASS; * no README tag -> **SKIP**, not a pass by absence; * `payload=unknown` / empty -> FAIL. Ported verbatim from #1569 (whose author closed it as superseded on the wrong premise - #1570 checks a *different field*), with its five self-test cases, so no fifth implementation and no cross-lane rebase of a conflicting branch. Verified end-to-end on identity files, not only on the verdict: c26 -> FAIL, c33 -> PASS. `--self-test` **133 ok / 0 failed** under both the shebang (dash) and bash, with the c26 case pinned.
…is the clone that built it (#1570 review) `payload_identity_verdict` compares `payload_lemond` with what the launcher reports, as a WHOLE STRING. That string carries a builder-dependent part: `lemond --version` is `<week>.0~<commit count>.<sha>`, and the count is the number of commits in the **checkout it was built in** (docs/releases.md: a depth-1 clone reports `~1`, a full clone reports `~1752` for the same commit; c18 printed `~5`). Measured for c33's pin: this box's shallow checkout counts 12, a depth-1 clone 1, a full clone 1752. So the whole string is not a fact about the payload. An image built from a depth-1 clone and a machine payload built from a full clone carry the same code and print different strings, and comparing them reds on a **correct** pair - a false red on a green pair, which is the failure mode this lane has spent the day removing. The row now drops `~<count>` on both sides and compares the pin (`<week>.0` + the trailing sha), and says so in both verdicts: "the same pin (…, clone count ignored: the ~N is commits in the checkout that built it)". The FAIL also prints both pins. It also names the field: the PASS said "the payload on this machine is the one the identity names", which reads as if `payload=` had been verified - it compares `payload_lemond`, a different value (measured on one artifact: `payload=` contains the README token and equals nothing else; `payload_lemond` matches neither). The line now says "the identity claims payload_lemond=… and the payload's own launcher reports the same pin". Verified: the five cases run directly - same string PASS; **same pin with `~1` vs `~1752` PASS (the false red this fixes)**; a different sha FAIL; no claim SKIP; launcher silent FAIL. `--self-test` **128 ok / 0 failed** under both the shebang (dash) and bash, with the clone-count case pinned so a later "tightening" cannot reintroduce the whole-string comparison.
… (containment, #1557) #1570's row checks `payload_lemond` - the payload's own version - and prints `payload=` as a label. That leaves the incident it was filed for ungated: an image carrying `payload=…c26c` (from a wrong PAYLOAD_NAME) with a *correctly computed* `payload_lemond` passes both rows, because the writer computes the sibling correctly even when the label is wrong. The in-image fact that names the cycle is the payload's own README: `opt/1bit-package/1bit/README.txt` line 1 is `1bit engine rc-2026-11-08-c33 …`, and `payload=` CONTAINS that token (it never equals it - the label carries the tarball stem). So the comparison is **containment**, on the **first line only**, and the row is `payload-name`, beside `payload-identity`: * the c26 label against a c33 payload -> **FAIL** (the incident); * the matching label -> PASS; * no README tag -> **SKIP**, not a pass by absence; * `payload=unknown` / empty -> FAIL. Ported verbatim from #1569 (whose author closed it as superseded on the wrong premise - #1570 checks a *different field*), with its five self-test cases, so no fifth implementation and no cross-lane rebase of a conflicting branch. Verified end-to-end on identity files, not only on the verdict: c26 -> FAIL, c33 -> PASS. `--self-test` **133 ok / 0 failed** under both the shebang (dash) and bash, with the c26 case pinned.
…d by containment (#1557) (#1591) * os: compare the payload's PIN, not the whole version string - the ~N is the clone that built it (#1570 review) `payload_identity_verdict` compares `payload_lemond` with what the launcher reports, as a WHOLE STRING. That string carries a builder-dependent part: `lemond --version` is `<week>.0~<commit count>.<sha>`, and the count is the number of commits in the **checkout it was built in** (docs/releases.md: a depth-1 clone reports `~1`, a full clone reports `~1752` for the same commit; c18 printed `~5`). Measured for c33's pin: this box's shallow checkout counts 12, a depth-1 clone 1, a full clone 1752. So the whole string is not a fact about the payload. An image built from a depth-1 clone and a machine payload built from a full clone carry the same code and print different strings, and comparing them reds on a **correct** pair - a false red on a green pair, which is the failure mode this lane has spent the day removing. The row now drops `~<count>` on both sides and compares the pin (`<week>.0` + the trailing sha), and says so in both verdicts: "the same pin (…, clone count ignored: the ~N is commits in the checkout that built it)". The FAIL also prints both pins. It also names the field: the PASS said "the payload on this machine is the one the identity names", which reads as if `payload=` had been verified - it compares `payload_lemond`, a different value (measured on one artifact: `payload=` contains the README token and equals nothing else; `payload_lemond` matches neither). The line now says "the identity claims payload_lemond=… and the payload's own launcher reports the same pin". Verified: the five cases run directly - same string PASS; **same pin with `~1` vs `~1752` PASS (the false red this fixes)**; a different sha FAIL; no claim SKIP; launcher silent FAIL. `--self-test` **128 ok / 0 failed** under both the shebang (dash) and bash, with the clone-count case pinned so a later "tightening" cannot reintroduce the whole-string comparison. * os: the payload= label is checked against the payload the image ships (containment, #1557) #1570's row checks `payload_lemond` - the payload's own version - and prints `payload=` as a label. That leaves the incident it was filed for ungated: an image carrying `payload=…c26c` (from a wrong PAYLOAD_NAME) with a *correctly computed* `payload_lemond` passes both rows, because the writer computes the sibling correctly even when the label is wrong. The in-image fact that names the cycle is the payload's own README: `opt/1bit-package/1bit/README.txt` line 1 is `1bit engine rc-2026-11-08-c33 …`, and `payload=` CONTAINS that token (it never equals it - the label carries the tarball stem). So the comparison is **containment**, on the **first line only**, and the row is `payload-name`, beside `payload-identity`: * the c26 label against a c33 payload -> **FAIL** (the incident); * the matching label -> PASS; * no README tag -> **SKIP**, not a pass by absence; * `payload=unknown` / empty -> FAIL. Ported verbatim from #1569 (whose author closed it as superseded on the wrong premise - #1570 checks a *different field*), with its five self-test cases, so no fifth implementation and no cross-lane rebase of a conflicting branch. Verified end-to-end on identity files, not only on the verdict: c26 -> FAIL, c33 -> PASS. `--self-test` **133 ok / 0 failed** under both the shebang (dash) and bash, with the c26 case pinned. * os: the payload-name row's three defects, all reproduced then fixed (#1591 review) The CHANGES review at `06833f2` reproduced three defects in the row I ported from #1569. Each one is real and each is now fixed, with the case pinned in the suite. **1. It false-PASSed between letter-suffixed cycles - which are the incident's own names.** The token regex was `rc-…-c[0-9][0-9]*`, so from a README saying `rc-2026-11-05-c26c` it extracted `rc-2026-11-05-c26`, dropping the letter; unanchored containment then passed `…-c26`, `…-c26b` **and** `…-c26c` against a c26c payload. This box carries `payload-c17b`, `-c26b` and `-c26c`, so the false pass was between real builds. Fixed twice over: the regex captures the suffix (`c[0-9][0-9]*[a-z]*`) **and** the containment requires a boundary after the token (`*"$_pt"|*"$_pt"[!0-9a-z]*`), so `…-c33x` no longer matches `…-c33` either. **2. It FAILed on every mini image.** The row ran unconditionally, but the mini schema (`tag`/`engine`/`engine_sha256`/`built`) has no `payload=` line and no `/opt/1bit-package` - so it red an image with nothing to check. Now: **SKIP** when the identity is the mini schema, with the reason saying why. **3. It FAILed when there is no identity file at all**, where the `identity` row SKIPs. Now **SKIP** as well, for the same reason: an image older than the identity file is not wrong, it is silent. Verified by **running the row**, not only the verdict - four fixtures through the real row block: ``` no identity file -> SKIP no … in this image build, so there is no payload label to read mini schema -> SKIP … the mini schema … carries no payload= label and no /opt/1bit-package no payload dir -> SKIP no … in this image, so the payload's own README cannot be read full v3, honest -> PASS full v3, c26 label -> FAIL ``` and `--self-test` **138 ok / 0 failed** under both the shebang (dash) and bash, with the c26/c26b/c33x FAILs and the c26c PASS pinned. --------- Co-authored-by: bong-water-water-bong <bong-water-water-bong@1bit.gg>
payload=was a declared claim that nothing comparedc32 and c33 both shipped
payload=lemonade-onebit-rc-2026-11-05-c26cwhile carrying later payloads. The engine half of thatlie was closed by #1481 (
engine_sha256is compared against the launcher present); the payload name was not — and the twofields come from different places: the sha is computed from a file, the name was taken from
PAYLOAD_NAME, an environmentvariable. One wrong variable and the identity is half true.
The two claims are now separated, because they are different kinds of thing:
payload=/opt/1bit-package, and no file in the payload records the stem (checked:1bit --version→1bit 0.0.1,lemond-onebit --version→ the Lemonade version, no stem anywhere). A check that pretended otherwise would red a correct image — which is the trap the issue warns aboutpayload_lemond=$PAYLOAD/lemond-onebit --versionat build time and refuses the build if the launcher will not say; the newpayload-identityrow compares the claim with what the launcher on the machine reportsMeasured
With the row's own overrides (
RELEASE_IDENTITY,PAYLOAD_DIR) and stub launchers:That is the issue's acceptance: a claim naming something that is not the payload present FAILs, a matching one passes, and
an older image says why it cannot be judged instead of passing by absence.
sh os/mini/release-check.sh --self-test→ 123 ok, 0 failed (four new arms for this verdict; the count moved because main'sidentity_launcher_patharms landed in between and the cherry-pick kept both).docs/os-v3.mdgains a field table that sayswhich of the five fields is a label and which is checked, and why.
Not in this PR
The bundle-side check, named in the issue: the name a release body cites comes from the tarball plus its sha in
SHA256SUMS, and an image cannot see its own tarball — that belongs where the bundle is assembled, not in an image row.Fixes #1557.