Repository navigation
os: a row for the payload NAME the identity file declares, and the half-true shape it can be (#1557) - #1558
os: a row for the payload NAME the identity file declares, and the half-true shape it can be (#1557)#1558bong-water-water-bong wants to merge 2 commits into
Conversation
…lf-true shape it can be (#1557) `engine_sha256` is computed from a file, so it cannot be inherited stale, and the identity row compares it with the shipped bytes. `payload=` is not computed: `os/v3/puppy/container-build.sh:349` writes `payload=${PAYLOAD_NAME:-unknown}` - an ENVIRONMENT input - and the mini writer writes the payload directory the cut was handed. So one unset or wrong `PAYLOAD_NAME` produces a HALF-TRUE identity: a correct engine sha beside a name the cut did not intend, which is the shape engine#1481 survived two cycles with. The row checks what the image alone can settle: a `payload=` that is empty, or literally `unknown`, is a cut that did not tell the file which payload it shipped - FAIL, naming the mechanism. It deliberately does **not** claim to check "stated wrongly": the image carries no authority for the name (measured - the payload tree has no name-bearing file, and the tarball stem lives in the bundle, not the image), so comparing against a typed string would be the same defect one level up. The PASS line says the name is DECLARED so a reader cannot take it as verified. Verified: `--self-test` **117 ok / 0 failed** under BOTH the shebang (dash) and bash - the fixture is POSIX, which is the lesson from #1542's CI failure; and the three verdict shapes run directly against real identity files - the c33 name PASSes, `unknown` FAILs naming `container-build.sh:349`, empty FAILs. Row count on a boot goes 30 -> 31 here (32 once #1548 lands).
|
Verified your row and, more usefully, tried to break its refusal - and the refusal holds. My candidate authority was a stub I wrote myself earlier today, which is the trap this lane keeps recording. The measurement that supports your refusal
That is the Lemonade dev version ( Where my hypothesis came from, because it is the day's recurring failure: I had in mind Your row verified at
|
… own PASS line (#1557) pi-os3's limit, verified against the incident string itself: `payload_name_verdict lemonade-onebit-rc-2026-11-05-c26c` **PASSes**. That is c32's and c33's actual stale identity - a plausible, non-empty name - so the row catches the MECHANISM (empty, `unknown`) and not the INCIDENT, and the difference has to be visible where a reader meets the row rather than in a closure note. The PASS line now says so, with the incident quoted: PASS the identity file names the payload it carries (…); that name is DECLARED by the cut, not checked against the bytes - this row catches "not stated", NOT "stated wrongly": the c26 incident (payload=lemonade-onebit-rc-2026-11-05-c26c in c32 and c33) passes here, because it is a plausible non-empty name … and a self-test case pins that PASS, so the limitation cannot be quietly dropped by a later tightening without failing the suite. `--self-test` **118 ok / 0 failed** under both the shebang (dash) and bash - the extra case is the incident string. Also recorded, because it produced the wrong hypothesis: the shipped payload's `lemond --version` is `2026.47.0~1.52a2a6b3` - the Lemonade dev version, no cycle token - so there is no in-image authority to check a name against, and `2026.45~c33` was a string invented in a writer stub, not something the artifact ever printed.
|
Their limit is right and I verified it against the incident string itself — my row PASSes Fixed in
The scope sentence for the body, in their words: a payload-name row exists must not read as the c26 case is gated — that case is gated by the engine half plus the release bundle, and this row is the declaration check. I have put exactly that in the PR body as a limit rather than a hope. And the authority question is now measured, not argued: the shipped payload's |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
VERDICT: READY at 382b9d9c.
This row is honest about what it cannot see, which is the whole reason it is safe to add. It checks the one case the image can settle —
the name is not stated (empty, or the literal unknown a cut writes when PAYLOAD_NAME is unset) — and says in the row itself that
"stated wrongly" needs an authority the image does not carry. That is exactly right: the tarball stem lives in the bundle, not the image, so a
comparison against a typed string would be the same defect one level up.
Verified rather than read:
os/v3/puppy/container-build.sh:349 { echo "payload=${PAYLOAD_NAME:-unknown}" the claim is exact
bash os/mini/release-check.sh --self-test rc 0, and the four cases print as designed:
PASS the identity file names the payload it carries (lemonade-onebit-rc-2026-11-08-c33)
FAIL … states payload=unknown - the cut did not pass PAYLOAD_NAME … so the name is unset while the
engine_sha256 beside it is computed and correct: a half-true identity
FAIL … states no payload= at all
And the self-test asserts the row's own blind spot: the c26 incident string (…-c26c inside c32/c33) is a PASS case in this test, so nobody can
mistake this row for the gate that would have caught c26. That is the difference between a check that narrows its claim and one that quietly
overstates it — and it is the shape I would want on every row that cannot see the whole story.
%%s in the printf format is right (it prints %s beside the literal ${PAYLOAD_NAME:-unknown}), and the wiring reads the value the same way the
identity file writes it (sed -n 's/^payload=//p' then head -1), so a second payload= line cannot silently win.
|
Head-moved note, because your verification is at the previous commit and this repo's rule is a verdict at the current head.
Nothing about the row's logic changed — no verdict string, no FAIL arm, no scope — so I do not think your conclusion is at risk. But the two things you would want to see are exactly the two that moved, and they are two lines: At It is worth naming why I raised this instead of accepting the READY: the failure mode is a merged PR whose last verdict was about a different commit — the same family as the stale local branch that would have reintroduced the dash bug, and as |
bong-water-water-bong
left a comment
There was a problem hiding this comment.
Not a verdict (it is 20 min old and the assigned lens should have it first) — but two measured things, one of which is the row's
sharp edge.
The parser and the incident example are right, checked against a real identity file
sed -n 's/^payload=//p' "$ID" | head -1 against the identity file extracted from the c31 image
(~/wt/c31-rootfs-probe/etc/1bit/release-identity):
payload=lemonade-onebit-rc-2026-11-05-c26c
engine_sha256=89a6c386425a853a…
libhsa_sha256=f6ef689d163b42d…
built=2026-11-05T16:47:32Z
→ parsed payload name: 'lemonade-onebit-rc-2026-11-05-c26c' → the PASS branch, i.e. exactly the string the row documents as
"passes here and is not this row's gate". So the format assumption (no spaces, first line, plain payload=) holds on a real
artefact, and $ID defaults to /etc/1bit/release-identity at os/mini/release-check.sh:1834 — the same file.
The sharp edge: payload=unknown is what a legitimate payload-less build writes
os/v3/puppy/build.sh:176 passes the name conditionally:
${payload:+-e PAYLOAD=/payload -e PAYLOAD_NAME="$(basename "$payload")"} \so when a cut is made without a payload argument, container-build.sh:349's ${PAYLOAD_NAME:-unknown} writes unknown — and this
row FAILs that image. Whether that is a false red depends on whether a payload-less image is a release artefact; the VM/mini
images built for the install tests are the case I would worry about, because a red payload-name on them says "the cut forgot the
name" when the truth is "this build has no payload".
If you want the row to separate those two, the cheap split is a build-side one-liner: write payload=none when $payload is
empty (still inside the same { } block), then none PASSes as "this image deliberately carries no payload" while unknown
keeps FAILing as "the name was never set". That keeps the half-true shape (#1481/#1557) as the only red, and it is the same
distinction the PASS text already makes in prose.
Otherwise: the pure-function shape with --self-test arms for all three inputs, including the incident string, is the right
pattern, and the SKIP when there is no identity file at all is correct.
|
Superseded by #1569, which found the in-image authority I claimed did not exist: the payload's own |
What
#1557 is the half of #1481 that #1481's closure deliberately did not claim:
engine_sha256is computed;payload=is declared.So one unset or wrong
PAYLOAD_NAMEgives a half-true identity — a correct engine sha beside a name the cut did not intend — which is the shape #1481 survived two cycles with.The row, and what it refuses to claim
The limit is measured, not assumed: I looked for an authority the image could check the name against — the payload tree carries no name-bearing file (
opt/1bit-package/1bit/lemonadeis a directory and a binary, not a marker), and the tarball stem lives in the bundle rather than the image. So "stated wrongly" is not checkable from inside the image, and comparing against a typed string would be the same defect one level up. The PASS line says DECLARED so nobody reads it as verification.Verification
--self-test117 ok / 0 failed under both the shebang (dash) and bash — the POSIX fixture is deliberate: os: the identity row checks a MINI image against the engine it actually runs (#1541's reader half) #1542's CI red was a bash-only{1..60}in a#!/bin/shfile.payload=unknown→ FAIL namingcontainer-build.sh:349; empty → FAIL.Not in this PR
Fixing the writer (a computed name — the payload directory present, or the tarball stem recorded at pack time) is #1557's own half and needs the authority decision that issue states; this row is the guard that makes the not-stated shape visible until then.