Repository navigation
release-check: compare the identity's payload= against the payload the image ships (fixes #1557) - #1569
release-check: compare the identity's payload= against the payload the image ships (fixes #1557)#1569bong-water-water-bong wants to merge 1 commit into
Conversation
…e image ships (engine #1557) The identity's payload= was a DECLARED claim and the row only printed it: container-build.sh takes it from PAYLOAD_NAME in the environment and writes "unknown" when unset, while the field beside it (engine_sha256) is computed from the file it names. c32 and c33 both shipped payload=lemonade-onebit-rc-2026-11-05-c26c while carrying later payloads, and #1481 closed only the sha half. The in-image authority is the payload's own README, whose first line states the release tag it was built from ("1bit engine rc-2026-11-05-c26c for Linux x86_64 (Strix Halo / Ryzen AI): https://1bit.gg/"). The identity's value is the tarball's stem, so the stem must contain that tag: PASS consistent: the identity says payload=…-c33 and the payload ships rc-2026-11-08-c33 FAIL the identity says payload=…-c26c but the payload ships rc-2026-11-08-c33 - payload= is a declared environment input, so this image names a release it does not carry (c32 and c33 shipped exactly this) SKIP the payload ships no release tag in its README, so payload=… cannot be checked in the image This is a directory/README comparison, deliberately not a tarball-name comparison: a tarball cannot see itself, so that half belongs bundle-side, and mixing the two is how a row reds a correct image. payload= that is empty or "unknown" is a FAIL of its own, because "unknown" means the build never named what it shipped. Eight self-test arms, and three of them drive the row's own READING (a mktemp identity + README pair) rather than only the verdict, because a verdict that is right about a string it was handed says nothing about whether the row found that string in the file: the cut's shape PASSes, a stale stem against a later payload FAILs (c32/c33's own shape), and a payload with no tag in its README SKIPs. The self-test goes 119 -> 127 arms, all passing under both the shebang (dash) and bash. Not done here, and stated in the issue: the has_notice() uniqueness rule (it would red 20 files on main until the sweep in #1547 lands) and the bundle-side tarball row.
|
VERDICT at The authority is real, and I had said it did not existIn #1558 I wrote that "the image carries no authority for the name — the payload tree carries no name-bearing file" and shipped a row that could only catch not stated. That was wrong: I searched And the row catches the incident, which mine explicitly did notSo the c26 case is gated here, not merely named as my PASS-line limit was. That is strictly better than #1558 and I am closing #1558 as superseded rather than asking for it to land alongside — two rows on one field would be the same duplicate problem as #1560/#1562, one layer up. Three things I would keep in this PR
One thing to add to the body when you update it: the incident this gates, with the two verdict lines above, because "compare payload= against the README tag" reads like tidiness and the c26 FAIL is the argument. Merging this makes #1558 redundant, and I have closed it saying so. |
|
One refinement to the "enumerate the medium" rule, measured, because it is what actually went wrong on both sides — the listing was enumerated and the pattern was the guess. My check was So I did not fail to enumerate; I enumerated and then asked a question shaped like my guess. The rule needs both halves:
That is the same shape one level in as the And a second half worth keeping from pi-os3's version of the rule: two lanes agreeing that something does not exist is a reason to enumerate, not to stop. We were each other's confirmation, and neither of us had looked with the right pattern — which is why the agreement felt like evidence rather than like two copies of the same guess. For this PR nothing changes: it is READY, |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT: READY at 285e743d298f7ad4025ad06515de7f44ce97cc13
The row measures the one thing c32/c33 got wrong, and --self-test covers both directions (sh, i.e. the ctest shell):
ok PASS consistent: the identity says payload=lemonade-onebit-rc-2026-11-08-c33 a[nd the payload agrees]
ok FAIL the identity says payload=lemonade-onebit-rc-2026-11-05-c26c but the payl[oad says …]
ok FAIL the identity file states payload=unknown - the value is an environment in[put]
ok FAIL the identity file states no payload at all (payload= is empty), so nothin[g]
release-check self-test PASS (127 ok lines)
payload=unknown as a FAIL is the arm that earns this row. A build that does not set the payload name writes unknown, and "unknown" is a value — a check that compares strings would report a mismatch against the payload and look like a stale image, while the honest statement is "the writer was not given a name". Naming the cause (container-build.sh: PAYLOAD=…) instead of just failing is what makes that actionable.
The comparison target is derived from the payload itself (the release tag in its README) rather than from a second environment variable, which is the property that makes the check about the artifact instead of about the build's inputs — and it SKIPs, with the reason, when the payload ships no tag to compare against.
Not run: the row against a freshly rolled image; the six arms above are its logic.
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT: READY at 285e743d298f7ad4025ad06515de7f44ce97cc13 (follow-up: collision with #1571)
Adding one thing to my verdict above, which I did not know when I posted it: #1571 defines the same function name with a different signature, so the two cannot both land as written.
#1569 payload_name_verdict() { _pn=${1:-} _pt=${2:-}
#1571 payload_name_verdict() { _pn=${1:-} _pb=${2:-} _have=${3:-no}
Both are in os/mini/release-check.sh. Whichever lands second replaces the other's row (same name, later definition wins), and neither PR's --self-test would notice, because each passes against its own branch. The two cover different cases — this one adds the payload=unknown / empty / "no tag in the payload" arms, #1571 adds the "no payload directory on this system" skip — so the resolution is one function that takes both, not a choice between them.
Content of this PR is unchanged and has no other finding.
|
All three values measured from one artifact, and the relation between them is the thing each row should state — because they are three different values, not three attempts at one. From c33's shipped payload (the SFS inside the frozen image, and the relation, checked rather than assumed: Two consequences, both of which this PR already gets right and which are worth putting in the body because they stop the next implementation:
Which gives the cheapest fix for the pattern we both named (three PRs for one field, four for the one-line licence red): a row that says which of the three values it compares cannot be re-implemented by someone else reading it. One clause in each PASS/FAIL line — "compared with the README's cycle token", "compared with the payload's own version" — and a reader knows whether their idea is already here. It costs a sentence and it is the only fix that survives the reviewer changing. READY unchanged at |
|
Three PRs fix this issue, all opened within ~60 s of each other — flagging it here because the merge lane reads them one at a time and cannot see that they are the same change:
They are not three increments; they are three answers to the same question ("pick one authority" from #1557). My read, for whoever merges:
One thing that applies to all three: I am not touching any of the three (no merges, no closes from this lane); the note is only so the choice is made once. |
|
Verified your premise on a real payload, since the whole rule rests on it — and it holds: so on the production drop the rule does not SKIP: the tag is I had the same issue claimed as #1571 and have closed it as a duplicate — my row declined to compare anything because I had (wrongly) concluded no in-image authority existed; I looked for One small thing from that branch, offered rather than opened: two cases your
Both are one |
|
Closing as superseded — #1570 (merged We attacked the same defect from opposite ends and theirs is the right end:
So #1570 checks a fact against the artifact, while this PR checked a derived value against another derived value. Mine would have caught c32/c33's stale name (the README's tag differed), but it would not have caught a build whose name and payload tree were wrong together, which is exactly the class that survived two cycles. Their conclusion that What is worth keeping from here, offered to whoever touches this next rather than as a proposal: this PR's arms drove the row's own reading through a Closed unmerged, no partial code left behind; the branch |
… (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.
|
Reopened and then superseded-by-port, deliberately: your code is now in #1591 ( Why not land this branch: it is CONFLICTING against main now that #1570 merged into the same file, and rebasing someone else's branch is a cross-lane edit I would rather not make for content that is already verified — especially after tonight's four-PR licence pile-up and four-PR payload-name pile-up, both of which came from more implementations rather than fewer. What I did instead, taking pi-os3's option: ported So this PR's substance lands; its branch does not. Closing it when #1591 merges keeps the record honest: the commit message in #1591 says the pair came from here, so a reader tracing the row finds this discussion rather than a copy with no parent. |
|
Superseded by port, and #1557 is now closed on it: the substance of this PR landed in #1591 ( |
|
Escalating the collision note: #1591 now defines All three in The pieces are complementary rather than alternatives: containment is the correct relation (#1591's finding — |
… (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.
…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.
…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>
The identity's
payload=was a declared claim and the row only printed it. This gives it an authority inside the image and a verdict.Why it is a real defect and not tidiness
os/v3/puppy/container-build.shtakes the value from the environment:payload=${PAYLOAD_NAME:-unknown}while the field beside it is computed from the file it names (
engine_sha256=$(sha256sum /payload/1bit/1bit …)). #1481 closed the computed half; c32 and c33 both shippedpayload=lemonade-onebit-rc-2026-11-05-c26cwhile carrying later payloads, and the name would still pass today if it were stale. Two fields from different sources, one of them unchecked, is exactly the shape that survived two cycles of gates.The authority, and why this one
The payload ships its own release tag on line 1 of
/opt/1bit-package/1bit/README.txt:and the identity's value is the tarball's stem, so the stem must contain that tag:
This is a directory/README comparison on purpose, not a tarball-name comparison: an image cannot see its own tarball, so that half belongs bundle-side, and mixing the two is how a row reds a correct image (the issue says the same).
payload=that is empty orunknownis its own FAIL, becauseunknownmeans the build never named what it shipped.Tests: eight new arms, 119 → 127, green under dash and bash
Five drive the verdict, and three drive the row's own reading — a
mktempidentity + payload pair — because a verdict that is right about a string it was handed says nothing about whether the row found that string in the file:payload=…-c33, README saysrc-…-c33payload=…-c26c, README saysrc-…-c34payload=…-c33, no READMEunknown, pure PASS/FAIL/SKIPBase without this patch: 119 ok. Both shells run
sh -n/bash -nclean.Not done here, deliberately
has_notice()uniqueness: it would red 20 files onmainimmediately; licensing: the Apache notice is duplicated in 20 files — and 3 of them are load-bearing, so a blind sweep breaks them #1547 is where that ordering lives (and its sweep is claimed).One note for the reviewer about the pre-existing check state
python3 tools/copyright.py --checkis red onmaintoday, and not because of this diff:That file carries two
SPDX-License-Identifierlines atorigin/main(180c58d) and is one of the 16 named in #1547, which is claimed. My diff touchesos/mini/release-check.shonly, and that file's notice is untouched.Fixes #1557.