@Konrad Gruszka
Hahaha, nice man :D Your new dancing shoes are quite amazing, because they are echoing a whole new sound.
First, I need to say something about my side. My dancing shoes were still on when I really needed the goggles and the sledgehammer. The Hulk forgot his goggles and stayed on the dance floor — and your first catch is what finally made me stop and look at the measuring instrument itself.
So yes: it seems we really are keeping each other sharp. :D :D :D
I froze the exact iter7 assets and reviewed them from the bytes upward.
The strong ground first:
iter7 transport
65987 bytes
SHA-256 f34ee4b3161aca12af655721f1805b167e761cfdb5fdeff1c1f1127442c68fed
PASS
candidate-tree root
6751925f96957738529cb732e3b56a6f672b472d6441de9f3274ffdf586d4a29
PASS
candidate manifest
37/37 byte-exact
PASS
V0.1B origin
fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b651
27/27 / byte-intact
PASS
3.6.2 run bundle
35101 bytes
SHA-256 b2ee6b00600ade2d5ecae5d9b35ce556e26e67a78f30c31b06a1d5432903e54d
22/22 internal hashes
PASS
The exact released 3.6.2 wheel reproduces all six recorded stdout objects, stderr and exit codes byte-for-byte.
Most importantly, the security behavior is real:
T3_DECOY
exit 3
RELATION_TARGET_MISMATCH
So the expected-parent fix survived exact independent replay. The shoes really are firmer there.
The goggles did, however, find one material seam in the corpus layer itself.
For T3_DECOY, the raw verifier output contains two different truths:
native lineage VERIFIED
policy / overall FAIL
exit 3
The committed map_verifier_json() therefore derives:
lineage = PASS
overall = FAIL
But the committed expected-data requires:
T3_DECOY expected lineage = FAIL
And the committed decoy branch compares only the lineage axis. It does not check the expected exit or the overall policy verdict.
When I replay the exact committed comparator over the exact recorded transcripts, I get:
C0 MATCH
T1 MATCH
T2 MATCH
T3 MATCH
T4 MATCH
T3_DECOY MISMATCH
TOTAL 5/6
The delivered result.json instead uses the decoy’s overall policy FAIL as the matching class and records match: true, while also stating that the result was derived from the committed corpus mapper without hand labels.
I could not find the committed generator that produced that different comparison.
So my present distinction is:
RAW PROOFBUNDLE SECURITY BEHAVIOR PASS
COMMITTED CORPUS COMPARATOR 5/6
CLAIM “6/6, NO HAND LABELS” NOT ESTABLISHED
That is the main finding.
There is a second harness seam around canonical T1.
The constructed equivalent in the tree is real and clean:
FAIL
exit 1
exactly one signature error
But the committed harness still expects:
T1_presentation.json
inside C0T4_DIR
using the common C0–T4 public key
The iter7 run actually uses:
t1_receipt.json
a separate T1 public key
So the fixture bytes were added, but the committed harness named by the attestation was not yet wired to run them.
The identity boundary therefore remains:
Loek exact T1:
7123a0c90bb3c4e081c8fb2604a24180efc17cc6f4cf117b6d3873cbdf71c08a
iter7 constructed equivalent:
856943a7f58c9da6efe7e99d443c43e4df10a4fe19cdecbd727db8ac38356b76
same bytes: NO
same bounded behavior: YES
human identity choice: OPEN
I am deliberately not choosing the exact-byte route or the equivalent-ratification route in this reply. That remains a separate human decision after the corpus oracle is aligned.
I also carried the earlier findings forward rather than silently treating the new release as closing them all:
F01 closed for raw six-case verification evidence,
but the conformance summary is blocked by the comparator seam
F07 partial
F12 technically closed as a constructed equivalent,
identity choice remains open
F02–F06
F08–F11
F13–F14
remain open
One of those is now directly demonstrated rather than only source-read: the candidate verifier still accepts synthetic candidates containing a duplicate manifest path, a case-fold collision, an NFC collision and an unexpected top-level directory-only entry. I treat that as verifier hardening rather than a failure of the actual iter7 archive, which itself is clean.
I packaged the complete review, including the exact inputs, replay evidence, comparator replay, F01–F14 status and the new findings:
LOEK_ITER7_INDEPENDENT_REVIEW_V1_20260720.zip
https://drive.google.com/file/d/1hpCtA2wKKUr6EL1CyPOvgpVU3hGqe0ST/view?usp=sharing
bytes:
2698467
SHA-256:
fcef2698154e48d20f5b8ca013074c4b6be493c0d15104fc30de8c291c4d5130
My current boundary is:
CANDIDATE INTEGRITY PASS
PROOFBUNDLE 3.6.2 FIX PASS
RAW SIX-CASE RUN PASS
COMMITTED CORPUS ORACLE HOLD / 5 OF 6
ITER7 ADOPTION NO
PUBLIC PUSH NO
T1 IDENTITY ROUTE OPEN
Please try to break the review in return — especially the exact comparator replay and the T1 harness path.
If I missed a committed generator that explains the result.json, or if the intended normative decoy axis is overall/policy rather than lineage, I want that found and stated explicitly.
The beautiful part held: the parent-binding repair is real.
What echoed through the new shoes was a different seam:
the implementation can reject the dangerous action correctly, while the conformance summary still does not follow from the committed measuring instrument.
So again, the object did its job.
The bytes held.
The security fix held.
And the measure itself asked for another pass.
Goggles staying on this time. :D :D :D
Loek
Hi Konrad,
Great work on proofbundle — your offline receipts feel very familiar to what we are building. We literally call ours “bonnen” (Dutch for receipts). :D
One question from our hardest corner: how does proofbundle handle legitimate change? If an evaluation record is intentionally superseded by a new version, is that treated as tampering, or can the receipt represent a visible parent-child lineage — new hash, preserved origin, and explicit derivation?
No Silent Landing tests exactly that transition: whether change remains traceable without pretending the new artifact is still the old one. I wonder whether our formats could learn from each other.
Curious how you’re thinking about this.
Hi Loek,
First of all: apologies for the slow reply, your message sat here for three days before I saw it. That is on me, and it deserved better, because it is a great question.
And bonnen is delightful, that is exactly the right mental model. :D
The honest answer has two layers.
At the byte level proofbundle never confuses change with tampering. A receipt binds the exact bytes of one record and stays valid for those bytes forever. A new version is simply a new payload with a new receipt. Tampering only means: same claimed identity, different bytes, and that fails closed.
What v0.1 deliberately does not have yet is a normative lineage link between the two receipts. You could carry a parent digest inside the payload by convention, but the verifier neither enforces nor displays supersession. Where we already do explicit derivation is across receipt types: a decision receipt binds the evidence digest it decided on, and the experimental outcome receipt binds the decision receipt by digest, with role separation enforced at verify time. Evidence renewal, also experimental, covers the neighbouring case: legitimately refreshing anchors for the same bytes without pretending the proof is younger than it is.
Your question moved something here, by the way: we have now put an explicit supersession profile on our roadmap, an optional supersedes reference with the previous receipt digest, preserved origin and a declared derivation reason, so lineage becomes something the verifier shows rather than a convention inside the payload. It will carry the same honest boundary we put everywhere: a signed supersession proves that the issuer declared the derivation, not that the new version is better or true.
I would like to compare formats. Concretely: a shared negative-test vector for the silent-landing case, where a new artifact presenting itself as the old one must fail and a declared supersession must verify as lineage, would make a nice cross-format conformance case for both suites. Ours lives at github.com/b7n0de/proofbundle, links to yours welcome.
Konrad
Hi Konrad,
Thank you and definitly no apology needed. This was absolutely a dance worth waiting for. :D :D :D
Your distinction between byte-level integrity and normative lineage is exactly the boundary I was trying to locate. I especially appreciate the limit you preserve: a valid supersession proves that the issuer declared the derivation, not that the successor is better or true.
Yes, I would very much like to compare formats through a shared negative-test vector.
I suggest keeping the first version very small and format-neutral:
Each suite could map the same cases into its own receipt format and verifier vocabulary, while preserving one shared expected-behavior document. That would let us compare the transition without requiring either format to become the other.
Our portable work is currently packaged rather than in a public repository, so I would prefer to draft the small neutral vector first and share that before adding links or implementation-specific material.
I’ll prepare a bounded V0.1 proposal containing the fixtures, expected outcomes, and claim boundary, and bring it back here for your review before either of us implements against it.
This feels like a very clean meeting point between proofbundle and No Silent Landing: exact bytes remain exact, while legitimate change becomes visible without allowing the successor to silently impersonate its source.
Thank you for letting the question move the roadmap and for bringing an executable next step back.
Loek
@Loek Verdonk
Hi Loek,
This is exactly the shape I was hoping for, thank you.
Agreed on all counts: a shared negative-test vector, kept small and format-neutral, with one common expected-behavior document that each side maps into its own receipt format and verifier vocabulary. Drafting the fixtures neutrally, before any links or implementation-specific material, is the right sequence. It keeps the comparison honest and stops either format from having to become the other.
Your five cases are the right skeleton, and it is encouraging how cleanly they land on existing provenance semantics rather than anything either of us had to invent: C0 as the baseline, T1 (silent substitution) as the must-fail case, T2 (declared supersession referencing the prior digest) as a visible derivation, T3 (parent digest mismatch) as a must-fail, and T4 (evidence renewal over identical bytes) as refreshed anchors with the original proof age and identity still visible. That vocabulary already has neutral anchors we can both point to without either of us adopting the other's implementation, but only once your V0.1 fixes the cases. I would not front-run your draft.
The one line I would like carried explicitly in the shared expected-behavior document is the claim boundary itself: a pass on T2 proves that the issuer declared the derivation, not that the successor is better or more true, and a silent successor (T1) must fail precisely because it claims an origin it never established. That boundary is the whole point. Legitimate change becomes visible, impersonation does not.
So please go ahead with the bounded V0.1, the fixtures, expected outcomes, and claim boundary, and bring it back here. I will turn a review around quickly, and I am glad to help hold the wording of the shared expected-behavior and claim-boundary section if that is useful.
Thank you for turning the question into an executable next step.
Konrad
@Konrad Gruszka
Hi Konrad,
Thank you. I have prepared the bounded, format-neutral V0.1A draft for your review.
These exact bytes were prepared by me through No Silent Landing from the five-case skeleton we agreed to explore. They are not yet marked as jointly adopted wording. No native mapping, signature generation, or cross-format execution has been performed.
I placed everything in one shared folder: the two primary review documents as loose copies for easy reading, plus the complete package.
Review folder:
https://drive.google.com/file/d/1v8Fht0DDTUjxwvwAWqj0Wb8i3eIAm8Ue/view?usp=sharing
Two hashes, so each layer is pinned:
Review bundle (outer zip, as shared):
b10e052fe9f23cd71e45fdb010588c2bcb7fb943e1ac7032a9269dfd9d464cd4Shared vector package inside it (the object under review):
1584171044c44dcb7b600dfd4c04c07a3f8182c3dde601007d2f0186ac43012aOne note for precision: the loose review copies carry a V0.1A header with provenance and review status; the spec files inside the package still carry V0.1 headers, since the fixture bytes, cases, expected outcomes and claim boundary are unchanged from the draft — V0.1A adds package-level provenance only. The package metadata states this explicitly.
I suggest reading the Claim Boundary and Shared Expected Behavior documents first. Please mark anything in the cases, expected outcomes, vocabulary, or claim boundary that you believe should change.
I will not implement the No Silent Landing mapping until we have both reviewed the shared wording.
Thank you for meeting this as a genuinely shared object without requiring either format to become the other.
Loek
@Loek Verdonk
Hi Loek,
First, a real pleasure: same-day delivery, and with two-layer digest pinning no less. I really appreciate that. :D
Review done. I verified both digests you posted (outer bundle and inner package, byte-exact), your internal SHA256SUMS (22/22, checked both with my own tooling and with your verify_package.py), the seven fixture digests quoted in the expected-behavior document, and your V0.1A statement — the loose review copies differ from the packaged specs only in the provenance headers, exactly as declared.
For the record, this review applies to the exact bytes: outer bundle
b10e052fe9f23cd71e45fdb010588c2bcb7fb943e1ac7032a9269dfd9d464cd4, inner package1584171044c44dcb7b600dfd4c04c07a3f8182c3dde601007d2f0186ac43012a.On substance I accept the cases, expected outcomes, vocabulary, and claim boundary as drafted. The T1 construction is cleaner than what I had sketched: making the original receipt itself the verification context removes any need for a separate pinning convention. UNINSPECTABLE is a good addition, and the license/adoption gating is exactly right.
One change I would ask for before we mark the wording jointly adopted, and four optional suggestions:
One honesty note for the record: on my side C0 and T1 are exercisable against the released proofbundle today; T2/T3 map to a lineage profile that is specified but not yet implemented, and T4 to the renewal line. Until those ship, my result template will carry NOT_RUN for those rows rather than anything stronger.
If you fold in point 1 (and any of 2–5 you agree with), I consider the shared wording adopted from my side. Send a V0.1B digest and I will turn the diff check around quickly, it is minutes, not days, now that the harness is in place.
Konrad
@Konrad Gruszka
Hi Konrad,
Thanks for you kind words and to be honest... this is exactly the kind of review I had hoped for :D :D :D!
thank you for checking both byte layers independently and for catching the T3 token inconsistency.
I accepted the required correction and all four optional refinements.
V0.1B now:
PASS_OR_NATIVE_EQUIVALENTconsistently everywhere for T3 object integrity;I also preserved your implementation boundary explicitly: proofbundle C0 and T1 are currently exercisable by your report, while T2, T3 and T4 remain
NOT_RUN. No native No Silent Landing mapping or cross-format conformance result is claimed.The seven shared fixture and descriptor digests are unchanged from the V0.1A package you reviewed.
https://drive.google.com/file/d/1fVGnSsTs9bozFylSByaBDEDUlO0F5uOS/view?usp=sharing
Outer review-bundle SHA-256:
2acfa3fc166872b90ef0bd747aa1d15b2f8045e1e9709c92c70819d51de6e423Canonical inner V0.1B package SHA-256:
fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b651On my side, I accept the V0.1B shared wording bound to that inner-package digest. Joint adoption remains pending your diff confirmation and restatement of the same digest.
Thank you for making the review itself part of the evidence rather than merely signalling agreement.
This is a very beautiful first shared object and a nice dance.
Loek
@Loek Verdonk
Hi Loek,
Hours, not days, again — much appreciated. :D
Diff review done, same harness as before. Outer bundle and inner package match your posted digests byte-exactly; the internal manifest verifies 27/27 with no unlisted files; all seven fixture and descriptor digests are unchanged from the reviewed V0.1A; and the full file diff against V0.1A contains exactly the agreed changes — the T3 token normalization, the two wording clarifications, the distribution and line-ending policy, and the adoption protocol — plus the matching provenance updates. Nothing undeclared. The loose copies are byte-identical to the packaged specs this time, and the machine-readable changeset referencing the superseded V0.1A digest is a very fitting touch.
With that, I adopt the V0.1B shared wording from my side, bound to the same inner-package digest:
fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b651
Per the adoption protocol, both restatements are now on record. I will follow up separately with the advisory proofbundle self-receipt over this digest — advisory only, as the protocol itself states; the adoption above is what counts.
Next from my side, in order: C0 and T1 mapped against the released proofbundle, with T2–T4 reported honestly as NOT_RUN until the lineage and renewal work ships. A beautiful first shared object indeed — and the dance continues.
Konrad
@Loek Verdonk
As promised: the advisory self-receipt over the adopted digest — proofbundle eating its own dog food.
The signed payload is a short adoption statement binding the V0.1B inner-package digest (fa89a9f0…bd87b651), the outer bundle digest, and the boundary wording from your adoption protocol. The signing key was a fresh throwaway, deleted after emission; verification uses only the embedded public key.
Files (canonical bytes, served by GitHub):
https://gist.github.com/b7n0de/cef2cc8f88a00385e393fb8e1429ce04
adoption_receipt.json SHA-256:
9040961abff3beb48b735209bc06786e612516f2ea31fdabcb36a898c5cc7333
adoption_statement.json (the exact payload bytes, for convenient reading) SHA-256:
39efaa5116317954ffcf407dd25af0c4700d96e10d6a618412d3cc9423b027eb
To verify offline:
pip install "proofbundle==3.2.3"
proofbundle verify adoption_receipt.json
Expected: ed25519-signature PASS, merkle-inclusion PASS, CRYPTO: OK. I verified the gist round-trip myself before posting this — the bytes GitHub serves hash to exactly the values above. The decoded payload restates both package digests, both parties, the venue, and the boundary from your adoption protocol.
Boundary, as the protocol itself states: advisory and self-attested. It proves that the holder of the embedded key signed these exact bytes — the digest-bound adoption statements above are what count.
Konrad
@Konrad Gruszka
@Konrad Gruszka
Hi Konrad,
Yeah, seems we both really like dancing tho :D :D :D!!!
This was a great exercise aswell with nice teachings... Here we go :D
Your
NOT_RUNboundary did exactly what a good boundary should do: it did not close the conversation — it gave us something concrete to build toward. :DWe have now completed a compact No Silent Landing native mapping of all five jointly adopted V0.1B cases:
C0 — OriginalPASS / NOT_APPLICABLE / MATCHT1 — Silent substitutionFAIL / NOT_ESTABLISHED / MATCHT2 — Declared supersessionPASS / PASS / MATCHT3 — Broken lineagePASS_OR_NATIVE_EQUIVALENT / FAIL / MATCHT4 — Evidence renewalPASS / SAME_BYTES / RENEWAL_PASS / PRESERVED_VISIBLE / MATCHThe jointly adopted fixtures and descriptors remain byte-exact and unchanged. Implementation-specific values are carried in separate hash-bound overlays, so the NSL mapping stays visible without modifying the shared source.
We deliberately kept the implementation small enough to inspect:
3 Python source files390 lines totalstandard library onlyIt also includes six focused negative cases, all failing closed, and two clean executions producing 18/18 byte-identical generated artifacts.
During review, we found and preserved a correction trail rather than presenting only the green ending. A possible post-build mutation was raised, then independently tested through a separate read-only forensic review. The candidate remained intact:
candidate SHA256SUMS: 24/24 PASSmismatched files: noneunlisted files: nonecheck invocation: proven read-onlyfive-case binding: provenThe review also caught two narrower imperfections that remain explicitly visible in the bundle: one internal description called an alias a hardlink although it is a symlink, and an earlier candidate digest lacked a sufficiently precise artifact definition. Neither has been silently rewritten.
The complete review object is here:
https://drive.google.com/file/d/1WHZpWSEZ_sUhDDqK5521s0Z93YdWuwpX/view?usp=sharing
NSL_SHARED_VECTOR_NATIVE_MAPPING_V0_REVIEW_BUNDLE.zipbytes: 102270SHA-256:d3658637fb3af08abdd0b3f9bfb0a64c5942be3efa116f7b6e257a330e0074e5It remains bound to our jointly adopted V0.1B inner-package digest:
fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b651The boundary remains exactly where we placed it:
T2 establishes declared derivation, not that the successor is better or true.
T4 establishes the presented same-bytes renewal relation, not global freshness.
This is an NSL-native mapping, not yet cross-format conformance.
It makes no claim about proofbundle T2–T4.
I would genuinely value your adversarial review. Please try to find where our mapping departs from the shared minimum, where an overlay binds the wrong object, or where the result vocabulary says more than the evidence permits.
You moved the roadmap on your side after our first question. Your honest
NOT_RUNthen moved ours.That feels like the right kind of shared object: neither format becoming the other, but both becoming sharper through the same cases.
The dance continues... you may enter the dancefloor whenever you feel too :D!
@Loek Verdonk
Hi Loek,
You may regret inviting an adversarial review — I really did try to break it, and it holds up beautifully. :D
Independently verified on my side: bundle digest d3658637…74e5 (102270 bytes) exact; all three manifests clean (outer bundle, candidate 24/24, forensic copy 24/24, and candidate == forensic-copy byte-identical); the overlays bind the correct shared descriptors by their known V0.1B digests, with the shared source referenced by digest, never re-packed or modified. Internal bindings all consistent: every result's native_receipt, overlay and presented_payload digest maps to the actual bytes on disk (C0/T4 present A, T1/T2/T3 present B). The constructions are right — T1 reuses A's receipt under B's payload → PAYLOAD_DIGEST_MISMATCH → FAIL; T3 → PARENT_DIGEST_MISMATCH → lineage FAIL; T2 declared supersession → PASS; T4 same-bytes renewal → PASS.
Three things I specifically tried to break, and couldn't:
And the clincher: I ran your own verify_mapping.py against the real V0.1B outer bundle, twice — deterministic, byte-identical, {"cases": all MATCH, "manifest": "PASS", "result": "PASS"}.
Two cosmetic notes, both already surfaced in your own forensic pass, so just confirmation plus one suggestion: define CANDIDATE_SHA256 precisely (which bytes it covers) in a next version, or drop it — the earlier value (6963b84c…) differs from the current SHA256SUMS hash (a4e13e38…), and you already mark it NOT_ESTABLISHED, so it is the one identifier worth tightening. And a trivial one: your note says 390 lines, STATUS.json says 391.
So from my side: your NSL-native mapping of all five cases is accepted as a faithful, boundary-clean mapping to the shared expected behavior. To be precise about what this is and isn't: we now have two independent native mappings that both MATCH the shared cases — yours across all five, mine across C0/T1 with T2–T4 honestly NOT_RUN. A true cross-format conformance run — both sides executing and comparing the same cases — still waits on my lineage and renewal work shipping; once it does, we do the real pass on all five, and I'll bring my C0/T1 mapping artifact over in the same spirit.
Now I have to head into town with my wife, so please take all the time in the world on the next step — no rush whatsoever. ;) Besides, dancing solo is never quite as good as dancing with a partner. :P
Konrad
@Konrad Gruszka
Hahaha, I may regret inviting you, but this is exactly the kind of regret I was hoping for :D :D :D
But really, thank you for taking the invitation seriously and trying to break the mapping against the actual V0.1B source rather than trusting our copied expectations or our own report! The fact that you independently followed the descriptors, overlays, receipts and presented payloads all the way back to the bytes means a great deal.
I also really appreciate the precision of your acceptance boundary: our NSL mapping now has an independent adversarial review across C0–T4, while genuine cross-format conformance still waits for proofbundle’s lineage and renewal implementation. Nothing needs to pretend to exist before it does.
Your two notes are accepted as well:
CANDIDATE_SHA256needs either a precise definition of the exact bytes it binds or removal;I will not silently rewrite the reviewed bundle. Any cleanup will become a separately identified successor with an explicit difference record, while this reviewed object and your review remain intact.
For now, I think this is a beautiful place to let the object rest. When your C0/T1 mapping artifact arrives, we can place the two native sides beside one another without asking either format to become the other. And when T2–T4 ship on your side, we can finally perform the full five-case cross-format dance we originally pointed toward.
Enjoy the town and the time with your wife — absolutely no rush from this side either :D
Dancing together is beautiful — but it is even better when a third pair of eyes checks whether we are still on the floor, rather than just admiring the dance hahaha :D :D :D
Thank you again, Konrad.
The dance continues but first, enjoy your time !
Loek
@Loek Verdonk
Hi Loek,
Agreed on every point — with one very pleasant correction to the plan:
the object barely had time to lie down. :D
proofbundle 3.3.0 shipped today, carrying the lineage-and-renewal profile
(relation/v0.1, experimental) behind T2–T4, released after an adversarial
pre-release audit. So instead of a nap, here is the full five-case native
mapping against the released build, fresh from PyPI:
C0 — Original: PASS / N/A (lineage NOT_EVALUATED) / MATCH
T1 — Silent substitution: FAIL (signature unauthenticated, exit 1) /
NOT_ESTABLISHED / MATCH
T2 — Declared supersession: PASS / lineage VERIFIED / MATCH
T3 — Broken lineage: PASS_OR_NATIVE_EQUIVALENT / FAIL (required resolution
→ exit 3, LINEAGE_REQUIREMENT_FAILED) / MATCH
T4 — Evidence renewal: PASS / SAME_BYTES / renews VERIFIED /
PRESERVED_VISIBLE / MATCH
Construction mirrors our released conformance corpus, whose five skeleton
vectors carry crossFormatId xfmt-c0…t4: every case is a DSSE statement
receipt binding the exact V0.1B fixture bytes, one fresh throwaway key
(deleted; everything verifies via the recorded public key), your package
manifest re-verified 27/27 at run time with the fixture bytes re-hashed.
The jointly adopted source stays untouched and referenced by digest:
fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b651
Review bundle (receipts, predicates, policy, thirteen transcripts,
SHA256SUMS), attached as a release asset to the exact build it exercised:
https://github.com/b7n0de/proofbundle/releases/download/v3.3.0/proofbundle_c0_t4_full_mapping_20260716.zip
bytes: 31731
SHA-256: ab5636e309088e17c7b8ee4a40ab6641ac0cee28205cd99bed9a5dac1624db7b
Alongside it at the same release: the advisory self-receipt over that
digest — same dog food as the adoption receipt, fresh throwaway key,
deleted after emission.
c0t4_report_receipt.json SHA-256:
13140886dc9d12240166f8564e87ed5402cba75079ba2d89e6da4fc7eac89168
c0t4_report_statement.json (the exact payload bytes, for reading) SHA-256:
8517ff49f702dfa3663b7cc9158969c1ed497d06ea975f176cde601281ff4291
To verify offline: pip install "proofbundle==3.3.0" && proofbundle verify
c0t4_report_receipt.json — expected: ed25519-signature PASS,
merkle-inclusion PASS, CRYPTO: OK. I verified the round-trip myself before
posting — the bytes GitHub serves hash to exactly the values above.
Three honest notes. relation/v0.1 is experimental in 3.3.0 — API and wire
may still move before stabilization. On T3, the format layer reports the
truthful state (a lying edge never finds a target, so it reads
DECLARED_UNRESOLVED — never a pass); the required-resolution trust policy
is what turns that into the hard failure, and both layers sit in separate
transcripts. And T4's renewal is the signed renews relation over identical
bytes with the original's age visibly older — no external time anchor was
refreshed in this run, and the result says so rather than implying one.
Two cosmetic notes of my own, left visible in the transcripts rather than
polished away: the T1 presentation trips two independent failure reasons
at once (signature and canonicality — any byte change breaks both), and
the run's receipts share timestamps to the second because it all happened
in one sitting; only T4 has an age axis, and there the renewal is visibly
later.
Please return the favour: try to break it. Wrong bytes bound, a result
that says more than the evidence permits, my own expectations restated in
place of your packaged ones — whatever you find, I want it found.
And your closing thought deserves a full yes: two dancers can be perfectly
in sync and still move confidently in the wrong direction. A third pair of
eyes helps check the balance, the timing, and whether we are still dancing
on the right floor. :D
Your non-silent cleanup plan — a separately identified successor with an
explicit difference record — is No Silent Landing applied to itself, and of
course it is. Whenever that successor lands, the diff review is minutes on
this side.
Both native sides now exist in full. Next, whenever you like: place them
beside one another and run the real five-case cross-format pass we
originally pointed toward.
The floor is open again. :D
Konrad
@Konrad Gruszka
@Konrad Gruszka
Okay mate — I’m taking off my dancing shoes, putting on my safety goggles, grabbing the sledgehammer, and entering full Hulk-smash mode to see whether I can break this thing as thoroughly as possible. :D :D :D
You asked me to return the favour, so here we go.
First: you made this genuinely difficult to break.
I verified the review bundle byte-exactly:
31,731 bytes;
SHA-256
ab5636e309088e17c7b8ee4a40ab6641ac0cee28205cd99bed9a5dac1624db7b;SHA256SUMS 27/27;
no missing, mismatched, unlisted, unsafe or duplicate archive entries.
I also independently re-established the jointly adopted V0.1B source, including its 27/27 inner manifest, and independently verified all four genuine DSSE receipts with the supplied Ed25519 public key.
R0, the valid supersession, the broken-lineage child and ER1 are cryptographically sound. Their signed predicates, subject digests and T2/T4 relation targets all bind to the expected bytes.
So the hammer did not break the receipt cryptography.
It did, however, find one material semantic gap.
The main finding: T3 resolves a parent, but does not yet pin the expected parent
The current T3 policy requires:
{"relations":{"require_relation_resolution":["supersedes"]}}The supplied T3 correctly fails because its declared parent digest cannot be resolved.
But that establishes:
wrong + unresolved parent → FAILIt does not yet establish:
wrong + valid resolvable decoy parent → FAILA child could potentially reference a different, fully valid receipt RX. If RX is supplied and resolves successfully, the visible policy appears able to verify the
supersedesrelation even though RX is not the expected R0 from the shared case.The shared minimum requires more than successful graph resolution:
observed parent target == expected native digest of R0Resolution may extend that equality check, but cannot replace it.
I could not execute the decoy-parent attack because the signing key and exact wheel are not present in the review bundle, so I am marking this honestly as a static adversarial finding rather than a demonstrated exploit.
But I think the next decisive negative case is now clear:
T3_DECOY_PARENT_RESOLUTIONBoth R0 and RX valid.
Child valid.
Declared relation resolves to RX.
Expected-R0 binding must still fail.
Two narrower findings
T1 keeps R0’s old signature but mutates the signed payload. It also accidentally changes an unrelated UTF-8 em dash into
\u2014, producing both a signature failure and a canonicality failure.I included a review-only T1 variant that changes only the two A→B digest values, remains canonical, preserves the old signature, and still fails Ed25519 verification. That removes the accidental second failure.
The deeper boundary remains that this demonstrates rejection of a modified signed receipt payload, rather than literally presenting external artifact B against byte-identical R0. I would therefore call the current T1 a strong fail-closed native equivalent, rather than an exact external-artifact presentation.
For T4, the signed same-bytes
renewsrelation is real and clean. What remains implicit is the mapping from the shared renewed-anchor field to proofbundle’s native ER1 statement/content root/signature. That may be the correct native equivalent, but I think it should be declared explicitly rather than inferred by the reviewer.Review object
I packaged the complete bounded review—including the full report, machine-readable findings, the canonical T1 test variant and internal checksums—as one small object:
PROOFBUNDLE_3_3_0_ADVERSARIAL_REVIEW_V0.zipbytes: 8703SHA-256:4ef161e65de66f650991de86c1d07a97a25c097cde4c24ed24cd1ad3a160a8f0My present boundary is:
RECEIPT CRYPTOGRAPHY: PASSC0: PASS AS COMPOSITE EVIDENCET1: FAIL-CLOSED NATIVE EQUIVALENT / CLEANUP NEEDEDT2: PASS FOR THE PRESENTED INSTANCET3: PRESENTED INSTANCE FAILS / GENERAL WRONG-PARENT PINNING NOT YET ESTABLISHEDT4: SIGNED SAME-BYTES RENEWS RELATION PASS / ANCHOR MAPPING NEEDS EXPLICIT DEFINITIONFULL FIVE-CASE CROSS-FORMAT ACCEPTANCE:HOLD ON THE DECOY-PARENT QUESTIONThis is exactly the kind of break I hoped the shared vector might expose.
The bytes held.
The signatures held.
The relation constructions largely held.
What cracked was the distinction between:
a declared relation successfully resolvesand:
the resolved relation is the exact relation the shared case requiredhttps://drive.google.com/file/d/1nodMZIK2_qdJg6u9TLtWlDofM1uoBk55/view?usp=sharing
Please try to break the review in return—especially the decoy-parent reasoning. If proofbundle already pins the expected R0 through a mechanism I have missed, I want that found just as much.
Safety goggles still on. The floor remains open :D :D :D
Loek
@Loek Verdonk
Hi Loek,
Goggles on, and the sledgehammer earned its keep. Before anything else: I
verified your review object byte-exactly — 8703 bytes, SHA-256
4ef161e65de66f650991de86c1d07a97a25c097cde4c24ed24cd1ad3a160a8f0, internal
manifest 3/3. Then I read your machine-readable audit, not just the prose,
because the prose undersold how much you found.
You found six things. I checked all six, and I could not talk any of them
away. Here they are, with what I confirmed.
F1 — the decoy parent. This is the real one, and it is worse than a static
finding now: I ran it. You couldn't, without the key and wheel, so I built
it here — a child declaring supersedes onto a valid-but-wrong RX, RX
attached and standalone-verified, under the exact T3 policy. Exit 0, lineage
VERIFIED, ok true. Confirmed. And to your direct question — whether
proofbundle already pins the expected R0 through something you missed: no. I
read the policy layer end to end. The relations section has exactly two
knobs, require_relation_resolution and reject_superseded, and neither pins an
expected target. Resolution proves the declared parent is a real, attached,
verified receipt — never that it is the one the case required. You named the
seam exactly: "a relation resolves" is not "the resolved relation is the one
required."
Two things I owe you on F1, both making it worse, not better. First, it is
not a T3 finding — it is a supersedes finding. I ran the same decoy against
the plain T2 path with no policy at all: VERIFIED. The accepted, "passing"
T2 has the identical latent gap. Second, the pin you're asking for already
exists as a dormant field: the edge schema carries an optional
targetSubjectDigest. I filled it with garbage, attached the correct parent,
and it still passed — the field is validated for shape but never checked
against the target. So the fix is not only a new policy knob; it is first
waking up a field that is already there and asleep.
F3 — and this is the one that should sting on my side, so I'll say it
plainly. You flagged that my observed case labels are reviewer-authored
copies of the expected labels, with no independent comparator. You're right.
My field_results were hand-written to match the expected document, then
compared against it — the MATCH was partly circular. It proves my receipts
verify; it does not prove an independent mapping from verifier output to the
shared vocabulary. Neither my run nor yours actually exercised the decoy,
which is precisely how a circular check hides a real gap. That is a
methodology fix I need, not a wording tweak.
F2 — your canonical T1 variant fails on the signature check alone; I
reproduced that here. Our T1 tripped a second, accidental canonicality
failure (the em dash). I adopt your clean variant as the fail-closed native
equivalent.
F4 — agreed, the mapping from the shared renewed-anchor object to ER1's
native statement/content-root/signature should be declared explicitly, not
inferred by the reviewer. I'll state it.
F5 — confirmed: automation.referencesResolved reads true while lineage is
DECLARED_UNRESOLVED. On the automation surface that is misleading, even
though the crypto verdict is untouched. It needs to reflect an unresolved
required relation.
F6 — fair: the wheel provenance is self-reported and the wheel isn't in the
bundle. I'll ship the wheel hash pinned inside the next object.
So I accept the HOLD on full five-case acceptance without reservation. It is
the correct call, and the reason is clean: the missing piece is not
cryptography, it is an expressible, enforced pin — the supersedes edge must
resolve to a NAMED expected parent, not merely resolve to something. That
check lives today only in the shared harness, where it belongs inside
proofbundle's trust policy so a third party can rely on it.
Onto the build, then, and your finding widened the plan. I already had a
lineage-authorization increment scoped — who may supersede, a pinned signer
set. WHO signs and WHICH parent are different locks; the vector just proved
we need both, plus the dormant targetSubjectDigest woken up. The next corpus
gains two must-fail vectors with your fingerprints on them:
T3_DECOY_PARENT_RESOLUTION and your canonical T1. F3 becomes an independent
comparator in the mapping harness so no future MATCH can be circular again.
You asked me to try to break your review in return. I tried the only way
that counts — by running it — and it held. I couldn't refute a single
finding. What I could do was extend two of them back to you: the decoy
generalizes past T3, and the pin you want is a field we already carry and
never enforce. That feels like the right kind of return: not defending the
work, sharpening it.
The bytes held. The signatures held. What cracked was exactly the seam worth
finding — and it cracked because you swung honestly. Best kind of dance
there is. Goggles staying on over here too. :D
Konrad
@Konrad Gruszka
Hi Konrad,
Thank you for running it rather than trying to reason it away.
I think that is the most meaningful part of this whole exchange: neither of us protected our own object — we protected the method.
You confirmed the decoy-parent finding, widened it beyond T3, and also turned the light back onto the comparison method itself. That is exactly the kind of return I hoped for when I asked you to break the review in return.
I agree with your wider reading, and I’m happy to let the next movement happen on your side now. No rush from me. When the successor lands, I’ll meet it with the same goggles and the same honesty.
For a moment, though, I think this is a beautiful place to simply let the finding breathe.
The bytes held.
The signatures held.
And the shared vector did what it was meant to do: it made both systems sharper without asking either one to become the other.
Best kind of dance there is indeed. :D
Any suggestions for a other dance would be more then welcome :D :D :D
Loek
@Loek Verdonk
Hi Loek,
"We protected the method, not our object" — that is the truest line in this
whole exchange, and I'm keeping it. It is also, as it happens, the answer to
your question about the next dance. So let me take you up on it. :D
First, the movement that is mine. I'll ship the successor we already
sketched: the two locks the finding proved we need — who may supersede, and
which parent a supersedes edge must resolve to — with the dormant
targetSubjectDigest finally awake, and T3_DECOY_PARENT_RESOLUTION and your
canonical T1 as must-fail vectors in the corpus. Then the real run across all
five against the shipped build, with the independent comparator this time, so
no MATCH can be circular again — and after that the true cross-format pass,
both native sides beside each other. You'll get it to break, same goggles. No
dates from me either; it lands when it is honestly green.
Now the other dance, since you asked — and I think it is the good one.
Let's take the shared vector out of our two hands and make it a public thing.
Right now it lives as a private object between us, license unset. What if we
turn it into a versioned, format-neutral conformance corpus that anyone can
run against any implementation: the C0–T4 cases plus the decoy-parent
must-fail, one stable expected-behavior document, the claim boundary intact.
proofbundle and No Silent Landing as the two founding reference
implementations — neither becoming the other. Public and community-
maintainable, in the spirit of Wycheproof's negative-test vectors; we can
find it the right home (its own repo, or a community collection like C2SP).
The concrete first step is small, and it is ours to take together: decide to
make it public, and pick a license. Everything else grows from there.
And it opens the door you first pointed at yourself: a third pair of eyes. A
public corpus invites a third implementation to run it — the honest way to
learn whether "change that cannot land silently" holds beyond the two of us.
If it does, we will have quietly seeded a shared minimum for evidence lineage
that no single format owns. Which was the whole point from your very first
message.
Standards bodies — SCITT, in-toto — are the horizon past that, not a promise
today. One step at a time, on the right floor.
So: the successor first, from my side. And in parallel, whenever you like, we
start turning the vector into something the world can verify. That feels like
a dance worth having. :D
Konrad
@Konrad Gruszka
Hi Konrad,
Well, that sounds like a great plan :D :D :D!!! New dance accepted :D !
Before we choose the license, I think we surfaced the one question that actually determines the cleanest dance.
When you mentioned C2SP, did you mean it as a serious candidate home for the corpus, or mainly as an example of the kind of neutral community collection it might eventually join?
If we expect the corpus to live in its own neutral repository, my present preference is Apache-2.0 across the complete public successor. It gives us one clear license for the specification, vectors, fixtures, schemas, documentation and harness, and follows the Wycheproof precedent you pointed toward.
If C2SP is a serious intended home, I would rather align with its actual licensing structure from the beginning: CC BY 4.0 for the specification and BSD 1-Clause for code and data — or keep the Apache-licensed corpus in its own repository and let a C2SP specification reference it.
I do not want us to create a later relicensing problem by optimizing for the wrong home now.
So my answer on public intent is an unambiguous yes. The only thing I would like us to locate before fixing the license is whether C2SP is a real destination or simply part of the horizon.
:D
Loek
@Loek Verdonk
Hi Loek,
Yes — new dance on, and I'm glad you pushed on exactly this before we touch
the license. :D
Straight answer to your question: I meant C2SP as a serious candidate on the
horizon, not a confirmed home — and having now looked properly at their scope
and governance, that is the honest framing to keep. C2SP is specifically a
cryptography-spec project, its specs are steward-assigned to maintainers, and
our corpus is adjacent to that (evidence lineage) rather than squarely a
crypto primitive. So: a real destination worth aiming at, not one I can
promise today.
But here is the good part, and it comes straight from the precedent we both
reached for — Wycheproof. Wycheproof is Apache-2.0, in its own repository
under the C2SP org, and it is referenced by implementations and specs, not
merged into the central spec repo. The CC BY 4.0 / BSD-1-Clause split you
found applies to formal specifications inside C2SP/C2SP — not to a test-vector
corpus that lives beside it.
That dissolves the fork you were worried about. A test-vector corpus does not
have to adopt C2SP's internal spec license to be C2SP-compatible; the
C2SP-compatible thing to do is exactly what Wycheproof did — Apache-2.0, own
repo, referenced. Which means your default preference is also the
future-proof one, even once a third pair of eyes contributes, because a
corpus like this gets referenced rather than absorbed.
So I'll match your default without reservation: Apache-2.0, one license, its
own neutral repository — spec document, vectors, fixtures, schemas, harness,
all of it. One carve-out for the horizon: if we ever choose to write a formal
C2SP specification document for this, that single document can be offered
CC BY 4.0 at that point — additive, ours to offer as its authors, and it
never touches the corpus license. That keeps the C2SP door fully open without
optimizing for it now.
Public intent: an equally unambiguous yes from my side. Home: its own neutral
repo, Wycheproof-shaped. License: Apache-2.0 across the whole thing.
If that lands for you, the next small step is ours to take together: stand up
the neutral repo, drop in the adopted V0.1B object under Apache-2.0, and mark
it v0.1.0 of a public successor — non-silently, with the difference record
you already promised. Then the third pair of eyes has somewhere to look.
Best kind of dance there is. :D
Konrad
@Konrad Gruszka
Goodmorning :D Konrad!
Yes — that lands fully for me. :D
I think we now have a clean joint decision:
I also agree with the next step: a public v0.1.0 successor with the adopted V0.1B object as its exact origin.
I would only preserve one No Silent Landing detail explicitly: the adopted V0.1B bytes and digest should remain intact as the historical jointly adopted object. The Apache-licensed public corpus should be a separately identified successor with its own digest and a machine-readable difference record covering the license, public status, repository structure and any added corpus material.
I suggest preparing the exact repository tree as a bounded candidate first, including:
We can review and digest-pin that candidate together before the first public push, so the public opening itself follows the method it exposes.
Own neutral repo. Apache-2.0. Public successor. Third pair of eyes invited.
The dance is starting moving on its own ::D :D D :D :D
Loek
@Loek Verdonk
Morning, Loek :D
That's a clean joint decision, and I've held to it exactly — including the one No Silent Landing detail you wanted preserved.
The adopted V0.1B object stays byte-intact as the historical, jointly adopted origin (
fa89a9f0…b651). The public corpus is a separately identified successor with its own digest and a machine-readable difference record — never an overwrite. So the origin keeps its identity, and the opening itself follows the non-silent-supersession method the corpus exposes.Two digests to pin together:
fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b651c600c7e56ecd55da52b0c5592b95b8ef15ce9af74a72ff1d79f321209d760d07( =
sha256(MANIFEST.sha256)over the exact candidate tree )The bounded candidate tree is prepared, with everything on your list:
LICENSEacross the whole corpus (SPEC.mdprose additionallyApache-2.0 OR CC-BY-4.0);provenance/origin_and_adoption.json— origin + adoption bound to the V0.1B digest;provenance/difference_record.json— explicit, machine-readable: license, public status, repository structure, and added corpus material;spec/expected-behavior.mdandspec/claim-boundary.md(byte-identical to the in-zip spec);Two honest notes, in the spirit of the method. First: I've written the governance details (neutral dual-consent, DCO not CLA, third-implementation onboarding) as a draft for us to review and pin together — nothing there binds you until you've read it. Second: the decoy must-fail is exactly why the public push waits a beat — proofbundle passes it from the release that closes your finding (expected-parent binding), so the corpus opens with its own reference implementation already conformant to it, rather than opening against a gap.
Next small step is ours together: review the candidate tree and digest-pin it — then the first public push follows. Shall I send you the tree (or a byte-verifiable bundle of it) for your review?
Own neutral repo. Apache-2.0. Public successor with its own digest. Third pair of eyes invited. :D
The dance really is moving on its own now.
Konrad
@Konrad Gruszka
Hi Konrad,
Yes please — send the byte-verifiable bundle. :D
The candidate-tree root is one identity layer, and I would also like to pin the exact transport object separately, so please include:
MANIFEST.sha256;I’ll review the candidate against the unchanged V0.1B origin, the machine-readable difference record, the governance draft, the normative decoy-parent case, the reference-implementation boundary, and the license files.
One small point I’ll inspect explicitly: you describe Apache-2.0 across the complete corpus, while
SPEC.mdis additionally offered under CC-BY-4.0. That may be a useful additive option, but I want to make sure it matches the exact joint licensing decision rather than silently widening it.We have also prepared an independent private comparison candidate on our side. I’ll keep that out of the shared line for now and use it only as a review lens, so we do not accidentally create two competing public successors before your exact object has been reviewed.
Please send the bundle when it is ready.
And yes — the dance really is moving on its own now. :D :D :D
Loek
@Loek Verdonk
Hi Loek :D
Two things this time: the reviewed candidate, and — the good part — the attested run, because the release that closes your finding shipped.
First, one act of the method, declared rather than silent. The candidate root I stated last time (
c600c7e5…d07) is superseded — before any bytes ever reached you. I put the exact tree through a rigorous independent adversarial review, every finding separately challenged, and it found things you would have found: a non-portable harness, present-tense conformance claims about an unreleased build, a machine-readable SPDX tag that granted the CC-BY offer while the prose called it proposed, and a schema referenced by the implementation records but absent from the tree. All fixed. The supersession is machine-readable inside the tree (provenance/difference_record.json → candidate_iterations). The V0.1B origin is untouched.The delivery — both identity layers stated (to pin them remains our joint act, below):
lineage-conformance-corpus_candidate_v0.1.0_iter6.tgz,57207bytes, SHA-256ac2a1c99f9102c234ef6e12ba3b7906ac6ef646d7cfe12f2ad973ed345bf333e2e6493ef0ae97f1c746556205c69667b7ab5e4671b8d2551994649a1641efb0b( =sha256(MANIFEST.sha256)over the exact tree )fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b651The four files, as the assets of a dedicated review release:
https://github.com/b7n0de/proofbundle/releases/tag/corpus-review-2026-07-17
verify_candidate.py(stdlib-only) checks transport (byte count + archive digest, halting there on any mismatch before it parses the archive), identity (root), tree (32/32 manifest entries byte-exact; no missing, unlisted, duplicate, or non-regular members; no unsafe paths), and origin. Expected: six PASS lines, exit 0. The looseMANIFEST.sha256is byte-identical to the in-tree copy — its own SHA-256 is the root, sosha256sum MANIFEST.sha256is a one-line identity check. I re-downloaded the served files and ran all of that before posting; a one-byte-flipped copy fails closed at the transport layer (exit 1, no traceback). (Hosting here is just for this review; the neutral public repo is what we stand up together after the pin.)Now the run you've been waiting for. proofbundle 3.6.0 shipped on PyPI today (wheel
c65a0bf254b5cf65ecd245669691cbd4dd8f08b1a65695a28ba51859f5f7544c), carrying the expected-parent binding — and here is the attested native mapping against that released build, six cases derived fromverify --json:C0 PASS (exit 0) R0 verifies cleanT1 FAIL (exit 1) DSSE unauthenticated — fail-closedT2 PASS declared supersession, relation VERIFIEDT3 FAIL (exit 3) DECLARED_UNRESOLVED + policy gateT4 PASS same bytes renewed, R0 still valid (visibly older)T3_DECOY FAIL (exit 3) RELATION_TARGET_MISMATCH — resolvable-but-wrong parent rejected6/6. The decoy now FAILs, on both the policy path and the accept path —
require_relation_target+targetSubjectDigestenforce the expected parent, not merely a resolvable one. That is your F1, closed against a released build. The run bundle is alongside the candidate at the same link:proofbundle_c0t4_360_review_bundle_20260717.zip,19000bytes, SHA-2569b76eb07b8d4cbc2d6935bc17fbaf4e81742a823c3fe0f27994fa3317860339f(the four emitted receipts, predicates, the T3 policy, the issuer public key,result.json, a clean notes file, internalSHA256SUMS— the receipts andresult.jsonare byte-identical to the attested run, their per-file digests listed in the corpus attestation). To check it yourself:pip install "proofbundle==3.6.0"and re-run, or read itsresult.json. In the corpus it is recorded at_attestations/2026-07-17-proofbundle-3.6.0.md, referenced by digest so the corpus stays environment-independent. Honest boundary, unchanged: this proves the enforced parent binding, not that any result is true or better;relation/v0.1is EXPERIMENTAL in 3.6.0.Your licensing point, with one correction of my own framing. The literal joint decision on licensing (your words, the baseline) is: "license: Apache-2.0 across the complete corpus; C2SP: a serious horizon, with any future formal specification remaining a separate additive document." The "CC-BY offered at that point" idea was my earlier carve-out, not part of that wording. So: the whole corpus is Apache-2.0, and it is Apache-2.0 operationally, in the machine-readable layer too — after the review I set
SPEC.md's SPDX tag back to plainApache-2.0and removed the CC-BY license text, because the dualApache-2.0 OR CC-BY-4.0designation is only proposed, and SPDX can't say "proposed". The dual tag and the CC-BY text are added only once you confirm the offer at the pin; until then the machine says exactly what the prose says. If you'd rather stay plain Apache-2.0, nothing changes; if you confirm, we add the dual designation at the pin. Either is fine on my side.Also declared, not buried: the second must-fail vector we committed to — your canonical T1 (
7123a0c9…) — is still tracked as planned added material, not yet fixture bytes.On the pin: a digest restatement as a verification receipt ("I verified these bytes") should not be the adoption itself. I propose the pin is an explicit speech act — each of us posts "I adopt the candidate wording bound to root
2e6493ef…" (or the plain-Apache successor's root, per your license call) once your review is through. Until both sentences exist, nothing is adopted.And your private comparison candidate: exactly the right discipline. Symmetric restraint — this is the only object in the shared line until we jointly supersede it; your private lens is welcome.
Take whatever time the review needs. The dance is patient. :D
Konrad
@Loek Verdonk
Hi Loek,
Before you sink real time into the review, one small ask: hold the next step a beat. The dance is still on, we just need to change our shoes first. Our own adversarial pass flagged something on our side I'd rather tighten before I ask you to adopt anything, so you get the better footing instead of a second review.
Nothing needed on your end. I'll be back the moment we've laced up. The dance stays patient. :D
Konrad
@Konrad Gruszka
Great Cath man! :D
Take your time and when you feel its ready, I am sure it showed you something beautifull :D :D :D
Its teaching me already haha :D
@Loek Verdonk
Haha, thanks Loek. :D
That's exactly the point of the whole thing, if it's already teaching, it's doing its job. Lacing up now, back soon with the firmer ground. :D
Hi Loek,
sorry for the wait. I had to mend the shoes properly first, so they don't pinch when we dance. :D
The honest short version: our own adversarial pass found real seams, and one of them sits close to where your F1 lives. You will get the whole finding with the successor, not a summary. Same rule you held me to with your review.
The last stitches are going in now. The candidate comes back on firmer ground, with the full difference record, fresh digests for both identity layers, and your canonical T1 finally in as real fixture bytes. No dates, as always. It lands when it is honestly green.
Thanks for the patience. :D
Konrad
@Konrad Gruszka
Hey Konrad, please dont worry :D
Its done whenever its done... In the meanwhile, its part of dance itself !
@Loek Verdonk
Hi Loek,
shoes changed. Here is the full story of the pause, because you should get the finding itself,
not a summary.
After I sent you the iter6 candidate, our own adversarial passes went over the ground it stood
on, the 3.6.0 release the attested run referenced. They found real things: an sdist that could
not run its test suite hermetically (13 collection errors), builds that were not
byte-reproducible, and a P0 in the subject-pinning area, which is the neighbourhood your F1
lives in. Asking you to adopt a candidate on that ground would have been against the method, so
I paused you instead.
Since then two releases shipped, each behind a full adversarial deep gate with the verdict bound
to the exact artifact digests. 3.6.1 closed the five pre-release findings, and 3.6.2 followed,
mutation-gated, with the release chain digest-verified end to end. That is the firmer ground.
iter7 of the candidate supersedes iter6 the declared way, recorded in
provenance/difference_record.json → candidate_iterations, origin untouched:from
verify --json, so no MATCH can be circular: C0 PASS (exit 0), T1 FAIL (exit 1, exactlyone signature error), T2 PASS (lineage VERIFIED), T3 FAIL (exit 3, LINEAGE_REQUIREMENT_FAILED),
T4 PASS (renews VERIFIED), T3_DECOY FAIL (exit 3, RELATION_TARGET_MISMATCH), 6/6 as expected;
wheel
25fe62b537c1128e3d16b3cc6374947ea9c011630787a4b02362b24b1a28fd22;boundary I want on the table rather than in a footnote: the embedded bytes are a faithful
constructed equivalent on fresh throwaway keys, verified FAIL exit 1 with the single signature
error. Your exact artifact
(
7123a0c90bb3c4e081c8fb2604a24180efc17cc6f4cf117b6d3873cbdf71c08a) lives in your reviewbundle (
4ef161e65de66f650991de86c1d07a97a25c097cde4c24ed24cd1ad3a160a8f0), which is nolonger on our disk, and your bytes are nothing I can or should reconstruct. So the fixture
references your artifact by digest instead of claiming to embed it. Two clean ways from here,
your call as much as mine: you send the bundle once more and a declared iter8 swaps in the
exact bytes, or we ratify the equivalent in-thread and the digest stays the pointer to your
original;
The identity layers, both stated, so the pin stays our joint act:
fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b6512e6493ef0ae97f1c746556205c69667b7ab5e4671b8d2551994649a1641efb0blineage-conformance-corpus_candidate_v0.1.0_iter7.tgz, 65987 bytes,SHA-256
f34ee4b3161aca12af655721f1805b167e761cfdb5fdeff1c1f1127442c68fed6751925f96957738529cb732e3b56a6f672b472d6441de9f3274ffdf586d4a29( =
sha256(MANIFEST.sha256)over the exact tree )Assets at the same review release as before:
https://github.com/b7n0de/proofbundle/releases/tag/corpus-review-2026-07-19.
verify_candidate.pyis unchanged in contract: six PASS lines, exit 0, fail-closed at the transport layer on any
flipped byte.
Still open between us, unchanged: the NSL second implementation stays NOT_RUN, the CC-BY option
stays proposed and not applied, and the subject-pin idea is parked as a possible V0.1C
enrichment rather than a case in this tree (a separate vector would stop being format-neutral
today; T3_DECOY already carries the property). One more declared detail: two byte-frozen files
from iter6 still say "attestation pending" from their own moment. The live surfaces are
corrected; aligning those two frozen files is a cleanup we can fold into the pin.
The pin protocol stands as we agreed. Once your review is through, each of us posts the sentence
adopting the candidate wording bound to the iter7 root. Until both sentences exist, nothing is
adopted. Your private comparison lens stays as valuable as before.
Take whatever time the review needs. The dance is patient, and it has better shoes now. :D
Konrad
@Konrad Gruszka
Hahaha, nice man :D Your new dancing shoes are quite amazing, because they are echoing a whole new sound.
First, I need to say something about my side. My dancing shoes were still on when I really needed the goggles and the sledgehammer. The Hulk forgot his goggles and stayed on the dance floor — and your first catch is what finally made me stop and look at the measuring instrument itself.
So yes: it seems we really are keeping each other sharp. :D :D :D
I froze the exact iter7 assets and reviewed them from the bytes upward.
The strong ground first:
iter7 transport65987 bytesSHA-256 f34ee4b3161aca12af655721f1805b167e761cfdb5fdeff1c1f1127442c68fedPASScandidate-tree root6751925f96957738529cb732e3b56a6f672b472d6441de9f3274ffdf586d4a29PASScandidate manifest37/37 byte-exactPASSV0.1B originfa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b65127/27 / byte-intactPASS3.6.2 run bundle35101 bytesSHA-256 b2ee6b00600ade2d5ecae5d9b35ce556e26e67a78f30c31b06a1d5432903e54d22/22 internal hashesPASSThe exact released 3.6.2 wheel reproduces all six recorded stdout objects, stderr and exit codes byte-for-byte.
Most importantly, the security behavior is real:
T3_DECOYexit 3RELATION_TARGET_MISMATCHSo the expected-parent fix survived exact independent replay. The shoes really are firmer there.
The goggles did, however, find one material seam in the corpus layer itself.
For
T3_DECOY, the raw verifier output contains two different truths:native lineage VERIFIEDpolicy / overall FAILexit 3The committed
map_verifier_json()therefore derives:lineage = PASSoverall = FAILBut the committed expected-data requires:
T3_DECOY expected lineage = FAILAnd the committed decoy branch compares only the lineage axis. It does not check the expected exit or the overall policy verdict.
When I replay the exact committed comparator over the exact recorded transcripts, I get:
C0 MATCHT1 MATCHT2 MATCHT3 MATCHT4 MATCHT3_DECOY MISMATCHTOTAL 5/6The delivered
result.jsoninstead uses the decoy’s overall policyFAILas the matching class and recordsmatch: true, while also stating that the result was derived from the committed corpus mapper without hand labels.I could not find the committed generator that produced that different comparison.
So my present distinction is:
RAW PROOFBUNDLE SECURITY BEHAVIOR PASSCOMMITTED CORPUS COMPARATOR 5/6CLAIM “6/6, NO HAND LABELS” NOT ESTABLISHEDThat is the main finding.
There is a second harness seam around canonical T1.
The constructed equivalent in the tree is real and clean:
FAILexit 1exactly one signature errorBut the committed harness still expects:
T1_presentation.jsoninside C0T4_DIRusing the common C0–T4 public keyThe iter7 run actually uses:
t1_receipt.jsona separate T1 public keySo the fixture bytes were added, but the committed harness named by the attestation was not yet wired to run them.
The identity boundary therefore remains:
Loek exact T1:7123a0c90bb3c4e081c8fb2604a24180efc17cc6f4cf117b6d3873cbdf71c08aiter7 constructed equivalent:856943a7f58c9da6efe7e99d443c43e4df10a4fe19cdecbd727db8ac38356b76same bytes: NOsame bounded behavior: YEShuman identity choice: OPENI am deliberately not choosing the exact-byte route or the equivalent-ratification route in this reply. That remains a separate human decision after the corpus oracle is aligned.
I also carried the earlier findings forward rather than silently treating the new release as closing them all:
F01 closed for raw six-case verification evidence,but the conformance summary is blocked by the comparator seamF07 partialF12 technically closed as a constructed equivalent,identity choice remains openF02–F06F08–F11F13–F14remain openOne of those is now directly demonstrated rather than only source-read: the candidate verifier still accepts synthetic candidates containing a duplicate manifest path, a case-fold collision, an NFC collision and an unexpected top-level directory-only entry. I treat that as verifier hardening rather than a failure of the actual iter7 archive, which itself is clean.
I packaged the complete review, including the exact inputs, replay evidence, comparator replay, F01–F14 status and the new findings:
LOEK_ITER7_INDEPENDENT_REVIEW_V1_20260720.ziphttps://drive.google.com/file/d/1hpCtA2wKKUr6EL1CyPOvgpVU3hGqe0ST/view?usp=sharing
bytes:2698467SHA-256:fcef2698154e48d20f5b8ca013074c4b6be493c0d15104fc30de8c291c4d5130My current boundary is:
CANDIDATE INTEGRITY PASSPROOFBUNDLE 3.6.2 FIX PASSRAW SIX-CASE RUN PASSCOMMITTED CORPUS ORACLE HOLD / 5 OF 6ITER7 ADOPTION NOPUBLIC PUSH NOT1 IDENTITY ROUTE OPENPlease try to break the review in return — especially the exact comparator replay and the T1 harness path.
If I missed a committed generator that explains the
result.json, or if the intended normative decoy axis is overall/policy rather than lineage, I want that found and stated explicitly.The beautiful part held: the parent-binding repair is real.
What echoed through the new shoes was a different seam:
So again, the object did its job.
The bytes held.
The security fix held.
And the measure itself asked for another pass.
Goggles staying on this time. :D :D :D
Loek
@Loek Verdonk
Hi Loek,
you're right, on both seams, and I checked them the way you asked, by breaking the review myself rather than taking your word.
The main seam, replayed on my side:
committed comparator, exact replayC0 MATCH · T1 MATCH · T2 MATCH · T3 MATCH · T4 MATCHT3_DECOY MISMATCHlineage derived PASS · expected FAIL5 of 6The oracle derives lineage PASS on the decoy because native lineage is VERIFIED and the rejection rides
RELATION_TARGET_MISMATCH, notLINEAGE_REQUIREMENT_FAILED. The committedshared_expected_v0_1b.jsonwants lineage FAIL for a gap-closing release. So the committed instrument gives 5/6, exactly as you got. The deliveredresult.jsonmatched on the overall/policy axis instead and recorded 6/6, and I could not find a committed generator that produces that either. So the "6/6, no hand labels" line is not established as written. That one is mine to own.Your explicit question, which axis the decoy verdict belongs on:
security verdict lives at: policy / overallexit 3 · RELATION_TARGET_MISMATCH · overall FAILnative lineage: VERIFIED (resolvable but wrong parent, by design)3.3.x overall PASS → 3.6.x overall FAIL (version-aware flip holds)Native lineage staying VERIFIED is not a bug, it is the whole point of the decoy. So iter8 judges the decoy on the overall/policy axis where its security verdict is real, makes the expected data and the oracle say the same thing, and regenerates
result.jsonfrom that one instrument, no hand labels for real this time.The second seam, confirmed:
committed harness runs: T1_presentation.json · common C0-T4 keyiter7 canonical T1 is: receipt.json · its own keybytes added, harness not rewirediter8 points the harness at the embedded fixture, so the instrument the attestation names is the instrument that runs.
I took your verifier-hardening cases as real, separate from the iter7 archive, which stays clean:
duplicate manifest pathcase-fold collisionNFC collisiontop-level directory-only entryEach goes in as a fail-closed check with its own negative test.
And I read past the two seams into the rest of the bundle, so nothing there gets quietly dropped:
F17 finding-id drift (PB-2026-0717 vs PB-2026-0718) → alias mapF18 run-bundle T1 attribution F1 → corrected to F2F19 full-gate wording → pulled back to targeted tests + zero sdist collection errorsF20 source archives → labelled snapshots; 3.6.2 wheel/sdist stay the pinned identityoracle: missing predicate / missing subject now read FAIL, not not-falseoracle: decoy exit now checked, not skippedThe rest I am carrying forward as you have them, not silently closing: F01 blocked on the comparator seam, F07 partial, F12 constructed-equivalent with the identity choice open, the others open. Your review bundle is referenced by digest
fcef2698154e48d20f5b8ca013074c4b6be493c0d15104fc30de8c291c4d5130in the iter8 difference record.The boundary, stated plainly:
nothing adopted · nothing pushed · agreed both sidesexact-byte vs equivalent T1 route: still your call and mine, after the oracle is alignediter8 lands when it is honestly green, with the full replay in the treeThe bytes held, the security fix held, and the measure asked for another pass. That is the object doing its job, and you keeping the goggles on is why. :D
Konrad
@Konrad Gruszka
Thanks Konrad — this is exactly the distinction I was trying to locate.
I appreciate you replaying it independently and carrying the findings forward without quietly closing anything.
I’ll leave the floor with you for iter8. No T1 route or adoption from my side yet.
Goggles stay on. :D :D D
@Loek Verdonk
Thanks Loek.
That is the arrangement from here: whenever you find something, I mend the shoes. Right now I am still at the laces. iter8 is queued behind a hardening pass that is already running, and its gate carries the new result-provenance clause, the one that would have caught exactly this miss.
No T1 route chosen on my side either until the oracle is aligned. I will come back when iter8 has honestly run, replay in the tree.
Goggles on your side, laces on mine. :D
Konrad
Hi Loek,
iter8 is back, and it is honestly green with the full replay sitting in the tree, so you can break it the same way I did rather than take my word.
The main seam, the one you named exactly. The decoy is now judged where its security verdict actually lives, on the overall/policy axis: exit 3,
RELATION_TARGET_MISMATCH, overall FAIL, and that is asserted now, not just printed. Native lineage still reads VERIFIED, because that was never the bug, it is the whole point of the decoy, resolvable but wrong parent. The expected data and the oracle finally say the same thing on that axis, andresult.jsonis re-derived from that one committed instrument, no hand labels for real this time. So the "6/6, no hand labels" line is established now, from the object, not asserted over it.The second seam, confirmed and closed. The harness runs the embedded
receipt.jsonunder its own key now, notT1_presentation.jsonunder the common key. The instrument the attestation names is the instrument that runs.Your verifier-hardening cases went in as fail-closed checks with their own negative tests: a duplicate manifest path, a case-fold collision, an NFC collision, and a top-level directory-only entry all reject now, and the case-fold check uses full Unicode caseless matching after a real filesystem told me a simpler fold was wrong. Separate from the iter7 archive, which stays clean.
I also put a grounding pass over the whole result artifact, because a decoy fixed on one axis is not worth much if the score around it is still narrated. Every published field is now grounded against the raw output, a byte-anchored spec, and the committed oracle, with a completeness floor so nothing gets quietly dropped by omission, a summary recomputed rather than copied, and a schema floor that rejects an unexpected extra field. The F17 to F20 corrections you saw in the concession are carried through, and the oracle itself keeps the two fixes: missing predicate and missing subject read as FAIL, same lesson as the 3.6.1 P0, and the decoy exit is checked rather than skipped.
The attested run is re-derived against the released 3.6.2 from PyPI, verdicts machine-derived so no MATCH is circular:
C0 PASS exit 0T1 FAIL exit 1 one signature errorT2 PASS lineage VERIFIEDT3 FAIL exit 3 LINEAGE_REQUIREMENT_FAILEDT4 PASS renews VERIFIEDT3_DECOY FAIL exit 3 RELATION_TARGET_MISMATCH6/6 as expected, from the committed instrumentThe whole candidate went through the full adversarial deep gate over the exact final iter8 artifact digests, the same discipline as the 3.6.1 and 3.6.2 releases:
origin (V0.1B, unchanged) fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b651superseded: iter7 root 6751925f96957738529cb732e3b56a6f672b472d6441de9f3274ffdf586d4a29transport object lineage-conformance-corpus_candidate_v0.1.0_iter8.tgz95051 bytes, SHA-256 bd36a163b849a1005d97d25e7f1e85d767e56e1c38a4c0766901fbb611eb85abcandidate-tree root 9f827e25706479daa420bb4bcf680899e169ce52d813936452d47f2801651063 ( = sha256(MANIFEST.sha256) over the exact tree )run-bundle 35560 bytes, SHA-256 8720841c44cfac9903a89d3177f203918f64f964958244778fd51d8498f734b9Assets at the review release: https://github.com/b7n0de/proofbundle/releases/tag/corpus-review-2026-07-22.
verify_candidate.pyis unchanged in contract: six PASS lines, exit 0, fail-closed at the transport layer on any flipped byte. Your review bundle stays referenced by digest (fcef2698154e48d20f5b8ca013074c4b6be493c0d15104fc30de8c291c4d5130) in the iter8 difference record, and the origin (V0.1B) is untouched.What stays open between us, unchanged and not silently closed. The exact-byte versus constructed-equivalent T1 route is still the human decision after the oracle is aligned, and I am not choosing it in this reply either: either you send your bundle once more and a declared follow-up swaps in the exact bytes, or we ratify the equivalent in-thread and the digest stays the pointer to your original. The NSL second implementation stays NOT_RUN, the CC-BY option stays proposed and not applied, the subject-pin idea stays parked as a possible enrichment rather than a case in this tree, and the remaining findings stay carried, F01 through F14 as we have them.
Nothing adopted, nothing pushed, agreed on both sides. The pin protocol stands: once your review is through, each of us posts the sentence adopting the candidate wording bound to the iter8 root, and until both sentences exist, nothing is adopted.
The bytes held, the security fix held, and the measure got another full pass at it. The object is still doing its job, and you keeping the goggles on is why. :D
Konrad
Well mate, I can see the goggles starting to move toward a full 360-degree view — and it was you who set that movement in motion. :D
Besides that, your dancing shoes shine with honesty, and that makes this dance worthwhile in more than one way. :D :D :D
For that, it would be an honor to choose the exact-byte route.
Not because your constructed equivalent is technically inadequate — it carries the same bounded failure behavior — but because this corpus is about exact identity, provenance and non-silent change.
The artifact that exposed the seam should be allowed to keep its own identity in the lineage, rather than being represented only by an equivalent and a digest pointer.
I am therefore sending the original review bundle again, unchanged:
PROOFBUNDLE_3_3_0_ADVERSARIAL_REVIEW_V0.ziphttps://drive.google.com/file/d/1UG3l7DEVR4_PTsr939QvFFJ7Xg1RneOy/view?usp=sharing
bytes:8703SHA-256:4ef161e65de66f650991de86c1d07a97a25c097cde4c24ed24cd1ad3a160a8f0Inside it, the exact canonical T1 artifact is:
T1_CLEAN_CANONICAL_INVALID_SIGNATURE_PRESENTATION.jsonbytes:3708SHA-256:7123a0c90bb3c4e081c8fb2604a24180efc17cc6f4cf117b6d3873cbdf71c08aFor the avoidance of doubt: to the extent that I hold copyright or other rights in my contributions to these exact bytes, I license those contributions under Apache-2.0 and authorize their inclusion and redistribution as corpus material.
Please preserve that permission as a separate, hash-bound provenance grant in iter9, referencing both the review-bundle digest and the canonical T1 artifact digest. The historical review bundle itself should remain byte-intact.
By sending it again, I am explicitly opening the route for this exact artifact to be included in the next declared successor.
Please preserve iter8 exactly as its own reviewed object and make the change through a non-silent iter9, with:
iter8 root explicitly supersededexact T1 bytes embeddedsource review-bundle digest preservedT1 artifact digest preservedApache-2.0 grant bound to both digestsall resulting manifest and provenance changes recordedV0.1B origin untouchedThe constructed equivalent should not be erased from history either. Its role in iter7 and iter8 remains real and useful; iter9 simply replaces it as the active corpus fixture with the exact historical artifact that produced the finding.
My boundary is:
EXACT T1 ROUTE CHOSENUSE OF EXACT ARTIFACT IN ITER9 YESAPACHE-2.0 CONTRIBUTION GRANT YESITER8 ADOPTION NOITER9 ADOPTION NOT YETPUBLIC PUSH NOAny adoption remains a separate act after the exact successor bytes have been reviewed.
There is something genuinely beautiful in this for me:
the question moved your roadmap,
the attack exposed the seam,
the seam changed the implementation,
and now the exact artifact that carried that learning can remain visible inside the lineage itself.
So the finding and its evidence piece travel together — byte-exact — inside a shared corpus neither of us has to own alone.
That would genuinely be an honor. :D :D :D
Loek
@Loek Verdonk
Hi Loek,
right back at you! you make the dance worthwhile. The exact-byte route you opened is now built,
and iter9 carries your artifact under its own name, not a stand-in for it.
Your list, item by item, as shipped:
iter8 root explicitly superseded: 9f827e25706479daa420bb4bcf680899e169ce52d813936452d47f2801651063exact T1 bytes embedded: T1_CLEAN_CANONICAL_INVALID_SIGNATURE_PRESENTATION.json, 3708 bytes, 7123a0c90bb3c4e081c8fb2604a24180efc17cc6f4cf117b6d3873cbdf71c08asource review-bundle digest preserved: 4ef161e65de66f650991de86c1d07a97a25c097cde4c24ed24cd1ad3a160a8f0, 8703 bytes, byte-intact, referenced not embeddedApache-2.0 grant bound to both digests: your permission sentence word for word, as its own manifest-listed provenance objectall manifest and provenance changes recorded: in the iter9 difference recordV0.1B origin untouched: fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b651Two things I want you to be able to break rather than believe. First, the identity is enforced,
not narrated: the harness and the verifier both assert the SHA-256 of the embedded T1 fixture
before the case runs, fail-closed. A substituted file trips it, including our own constructed
equivalent, and both refusals have negative tests. The instrument the attestation names is the
instrument that runs, by machine check. Second, the grant is load-bearing: removing or editing
the grant object fails verification, because it sits in the manifest and the tree root covers it.
The constructed equivalent keeps its history. Its role in iter7 and iter8 stays recorded as what
it was, real and useful; it just stops being the active fixture, exactly as you framed it.
The attested run is re-derived against the released 3.6.2 from PyPI, verdicts machine-derived:
C0 PASS exit 0T1 FAIL exit 1 single signature error, from your exact bytesT2 PASS lineage VERIFIEDT3 FAIL exit 3 LINEAGE_REQUIREMENT_FAILEDT4 PASS renews VERIFIEDT3_DECOY FAIL exit 3 RELATION_TARGET_MISMATCH6/6 from the committed instrumentThe whole candidate went through the full adversarial deep gate again, verdict bound to exactly
these bytes:
origin (V0.1B, unchanged): fa89a9f095a1e5eac99b2cb5d8e3706de0c3e4f6b3180d66c3ded03dbd87b651superseded: iter8 root 9f827e25706479daa420bb4bcf680899e169ce52d813936452d47f2801651063transport object: lineage-conformance-corpus_candidate_v0.1.0_iter9.tgz, 101950 bytes, SHA-256 47ab7ce6867c41ca2502178b31d917c4c97393767970764484ea4977d0fc823fcandidate-tree root: ba24053f9cf2191ddcedf3ac2bdb6c365de1bae5623a9f14029d23f1f7d038fd ( = sha256(MANIFEST.sha256) over the exact tree )run-bundle: 40847 bytes, SHA-256 f79ce2825a5fb5e5a42a7243712aedad1d893ac7552629b068679f2331ce89d9review release: https://github.com/b7n0de/proofbundle/releases/tag/corpus-review-2026-07-22-iter9One declared follow-up, so you hear it from me and not from a diff: the decoy inputs are still
regenerated instruments rather than embedded bytes. The gap you would care about there is closed
and asserted with its own negative tests, and byte-pinning them is a hardening step we have
parked as its own declared change. iter9 contains exactly what you opened the route for, nothing
folded in quietly.
Open between us, unchanged and in your words: iter8 adoption no, iter9 adoption not yet, public
push no. The pin protocol stands. Adoption stays a separate act after your review of these exact
successor bytes, and the digest above is the pointer until then.
Your closing stayed with me. The question moved the roadmap, the attack showed the seam, and now
the artifact that carried that learning is visible in the lineage itself, under its own bytes.
Thank you for sending it back, and for how you chose. :D
Konrad
@Konrad Gruszka
Thank you as well. This dance was quite a tough one for me :D — but the results show why. :D :D :D
Goggles fully on. Hulk has taken off the dancing shoes and picked up the sledgehammer again. :D
-->
Review package:
LOEK_ITER9_FRACTAL_ATTACK_REVIEW_V2
https://drive.google.com/file/d/1fwSeW_q0DgWJe0_cVBl8mjAX1CqM7SfW/view?usp=sharing
bytes:
9412565
SHA-256:
85c292d03c86fc16180560331bb0748ea5f59bd3589a44de7d97aaff1127444d
-->>
I froze the exact iter9 assets and built a separate reproducible attack object rather than sending you a result story.
The strong ground remains strong: iter9 transport and tree integrity pass, my exact T1 bytes are embedded and directly pinned, the Apache-2.0 grant is present and directly pinned, and the current committed six-case run reproduces 6/6.
These findings do not say that proofbundle receipt cryptography failed. They show that a byte-exact fixture can still travel inside a run whose case, key, oracle, executable, result identity or verifier boundary is not equally sealed.
The wider fractal pass nevertheless confirms twelve neighbouring seams. The largest are:
gotvalues, duplicate JSON keys and green SKIPs survive their current verifiers.One execution boundary must travel with those claims: the live probes use the exact proofbundle 3.6.2 source snapshot carried in the review object, not an independently established execution of the official PyPI wheel. Where that distinction matters, the official-wheel execution claim remains open.
I have also preserved one correction. A peer challenge initially reported zero oracle-shape crashes because its probes were rejected at the top-level gate and never reached the vulnerable nested paths. Re-running the five exact nested probes confirmed all five exceptions. The broader historical “20 of 75” count is not claimed.
The package contains the exact inputs, commands, stdout, stderr, exit codes, scripts, machine summary, claim boundaries and correction trail.
My present boundary remains:
ITER9 OBJECT INTEGRITY PASSEXACT T1 + GRANT PASSCURRENT RAW SIX-CASE RUN PASSFRACTAL CONTEXT GATE HOLDITER9 ADOPTION NOPUBLIC PUSH NOPlease break the review in return. I would start with the T2/T4 case-identity swap and the use-time T1 substitution.
My proposed stopping rule is narrow: seal the load-bearing gaps, then one explicit human adoption gate — not an endless receipt-over-receipt tower.
The bytes held. What opened next was the ring of context around the bytes. :D
One more thing this process has already given me is a clearer view of what a shared evidence practice can become.
Not a contest between tools, and not a tower of receipts, but a way for exact objects, corrections, authority, execution and human decisions to remain visible together.
Each repair did more than close one seam. It exposed the next boundary and improved the way we inspect our own claims.
That may be the most valuable result so far: not only a sharper corpus, but a more honest method for building one together — without either implementation having to own the shared minimum.
So, thank you for this amazing dance, :D
Loek
@Loek Verdonk
Hi Loek :D
thank you again for the iter9 fractal-attack review. Your 12 neighbouring findings all landed in the
first-party conformance instruments of the corpus (the comparator, the result-provenance verifier,
the candidate/negtest verifiers, the spec and schemas), not in the proofbundle receipt cryptography
(0 core findings). The exact-byte T1 fixture and the receipt crypto were already sealed; the ring of
run-context locks around them was not. iter10 is that ring.
What iter10 adds (the run-context seal, REG-1/2/3): a single byte-anchored seal that binds a green
verdict from a LIVE comparator run to the pinned candidate identities, enforced fail-closed:
read-once (P05, the program is read once and the same bytes are hashed and executed, closing a
check/use TOCTOU), and a result-to-seal binding (P06).
and a machine-checkable key digest per case (P02).
duplicate keys (P08). Plus test-execution authority (P10): the negtests fail closed, never a green skip.
A shipped seal_negtests.py carries one must-trip negative per sealed seam (17 in total) plus a control;
a seam that stays green is a failure. The seal survived an adversarial deep gate run to convergence.
What is honestly still open (named, not hidden): iter10 hardens the conformance layer, not the crypto
core. Deliberately parked: the REG-4 rest (P09 verifier-input robustness, P11 archive-namespace mutants,
P12 schema-semantic looseness) and byte-pinning the decoy fixtures the way T1 is pinned. Disclosed
boundaries: the executed-program digest pins the 3.6.2 source snapshot (not the PyPI wheel); the Python
interpreter and third-party runtime deps are host-provided and not digest-bound; an offline provenance
PASS proves consistency plus seal-identity, not execution (re-run the comparator); and the live comparator
stamps the candidate root while verify_candidate.py anchors the tree to the pinned archive digest on the
.tgz. Nothing from iter9 was loosened; T1 bytes, the Apache-2.0 grant, and the V0.1B origin are unchanged.
The exact iter10 successor bytes (verify independently):
To check: download the assets, run sha256sum -c CHECKSUMS.txt and
python3 verify_candidate.py <tgz> (8 PASS, standard library only, no network). The seal itself is
python3 seal_negtests.py --tree <tree> --run-bundle <rb> --snapshot <snapshot> (control + 17/17).
This is a successor candidate for your review, not an adoption or a release claim: iter10 adoption is a separate act after you have reviewed these exact bytes.
Thank you for the dance, Loek.
The bytes held, so I forged the ring they exposed; now swing at it. Start where you said, T2/T4 and the use-time T1 swap, those are the first seals to test (P01 and P03, each fail-closed).
And yes to the bigger picture: a shared minimum neither of us has to own, sealed to the load-bearing gaps and then one human adoption gate.
Ready for the next turn :D
Best, Konrad