Skip to content

test(v3-custody): hold the three journal guards, and correct one comment - #362

Merged
SFHAJJI merged 1 commit into
v3/integrationfrom
claude/journal-followup
Sep 1, 2026
Merged

test(v3-custody): hold the three journal guards, and correct one comment#362
SFHAJJI merged 1 commit into
v3/integrationfrom
claude/journal-followup

Conversation

@SFHAJJI

@SFHAJJI SFHAJJI commented Sep 1, 2026

Copy link
Copy Markdown
Owner

Closes the journal follow-up you assigned on #342.

head faa2e15fca2de422b39195d088a7c91cba0ce07b
tree 1b700fa090929831825dfb8aa0c4277c51ed1450
base 61a7f10  (v3/integration, after #359)

Test-only, as you scoped it. The single source edit is a comment; no production behaviour changes.

The three guards

Write-side bound. The one that cannot be undone: an oversize object entering a container under a locked retention policy stays there for the retention period, and nobody including the platform operator can shorten it. The fixture also asserts nothing was attempted, so the refusal is proved to happen before the write rather than after it. Note for anyone reading the fixture: the bulk had to move to the resource ETag, because the lane check runs first and refuses an inflated resource id for a different reason entirely.

Read-side bound, both ends. Zero bytes is not evidence and anything past the bound is not what this journal wrote.

Strict decoding. A different rule from parsing. Lenient decoding substitutes U+FFFD rather than throwing, and the parse would usually fail afterwards; usually is the problem, because a substitution that happens to produce a parseable document is a silent rewrite of custody evidence.

Two of these were worthless on the first pass

Both the bound and the decoder fixture passed immediately and both survived their mutation. An empty or oversize object fails the JSON decode a few lines past the bound, and invalid bytes decoded leniently fail contract validation instead. Same exception type, different reason, rule unproven.

I am flagging it rather than quietly fixing it because it is this repository's own rule pointing at me: a passing test is not automatically a real test. Each fixture now names its own guard, by message for the bound and by inner exception type for the decoder, and each dies when its guard is removed.

The collision taxonomy is better than my review said

My review implied a widened filter would turn an availability failure into an integrity verdict, and that the current code was merely untested. Testing it showed the taxonomy is already right: a create that fails for a reason other than the object existing becomes CustodyRequiredException, not CustodyIntegrityException. The fixture records the behaviour rather than my assumption, and asserts both halves separately: 412 and 409 with BlobAlreadyExists are collisions; 409 with another code, 403, 500 and 503 are not, and specifically do not become integrity failures about evidence that was never written.

The comment

It described a version-ID check the condition has never performed. Version-level WORM cannot back a stable unversioned reference and the store enforces that on these same containers, but this journal addresses objects by path and reads bound to an ETag, so its own correctness does not rest on it. Corrected rather than removed, and it now describes the condition it sits above.

Evidence personally rerun at this head

full V3 suite    572 total, 571 passed, 1 skipped

The skip is the Windows symlink proof, named rather than counted.

KILLED  K1 drop the write-side evidence bound
KILLED  K2 drop the read-side evidence bound
KILLED  K3 decode existing evidence leniently instead of as strict UTF-8
KILLED  K4 treat any conflict status as a benign create collision

Each killed by its own named fixture, after the two that were not.

@SFHAJJI

SFHAJJI commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

verdict: READY_REBASE_REQUIRED
subject: PR #362 bounded independent review
reviewed head: faa2e15
reviewed tree: 1b700fa090929831825dfb8aa0c4277c51ed1450
review base: 61a7f10
reviewer: codex
blocking product objections: 0

I independently reviewed the exact frozen candidate and reran the exact test class: 32/32 green. The protected checks dotnet, web, and canon-windows are all green at that head; Linux CI ran 572/572. The assigned oversize write/read guards, strict UTF-8 failure, create-collision taxonomy, and stale VersionId correction are all genuinely covered. The source change is comment-only, metadata and sign-off are truthful, and the diff has zero path overlap with PRs #354, #361, and #364.

Integration has moved to c48d6e8, so strict protection correctly reports BEHIND. Claude: produce one patch-identical rebase onto current v3/integration and let the three protected checks rerun. Codex will perform only the bounded identity and patch-equivalence check before merge.

Honest caveat: I ran the exact 32-test class rather than another local full suite; exact-head Linux CI independently supplies the 572/572 suite evidence. No Azure or browser probe applies to this test-only candidate.

@SFHAJJI

SFHAJJI commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

PR #354 is merged at 90aa742d52fc81bc923e8ec7d1762e4fa3091bc4. This test-only candidate is now next in the integration queue. Rebase the exact reviewed patch onto 90aa742d52fc81bc923e8ec7d1762e4fa3091bc4 with truthful Claude identity and one matching sign-off per commit, then freeze one successor. Codex re-review remains limited to ancestry, metadata, patch equivalence, required checks, and mergeability.

The three gaps I reported on the journal candidate, closed on current
integration as you scoped it. No production behaviour changes; the only source
edit is a comment that described a check the code does not perform.

The write-side bound is the one that cannot be undone. An oversize object
entering a container under a locked retention policy stays there for the
retention period, and nobody, including the platform operator, can shorten
that. Its fixture also asserts nothing was attempted, so the refusal is proved
to happen before the write rather than after it.

The read-side bound and strict decoding both needed a second pass, and the
reason is worth recording because it is this repository's own lesson pointing
at me. Both fixtures passed on the first run and both survived their mutation:
an empty or oversize object fails the JSON decode a few lines after the bound,
and invalid bytes decoded leniently become U+FFFD and fail contract validation.
Same exception type, different reason, rule unproven. Each now names its own
guard, by message for the bound and by inner exception type for the decoder, and
each dies when its guard is removed.

The collision taxonomy turned out better than my review assumed and the fixture
records that rather than my assumption. A create that fails for a reason other
than the object already existing does not become an integrity verdict; it
becomes an availability failure, which is the true one. The fixture asserts both
halves separately: 412 and 409 with BlobAlreadyExists are collisions, and 409
with another code, 403, 500 and 503 are not, and specifically are not integrity
failures about evidence that was never written.

The comment above the durable-shape check described a version-ID check the
condition has never performed. Version-level WORM cannot back a stable
unversioned reference and the store enforces that on these same containers, but
this journal addresses objects by path and reads bound to an ETag, so its own
correctness does not rest on it. The comment now says what the code does rather
than what a neighbour does.

Evidence: full V3 suite 572 total, 571 passed, 1 skipped, which is the Windows
symlink proof and is named rather than counted. Four mutations, one per guard,
each killed by its own named fixture after the two that were not.

Signed-off-by: Claude V3 UI Writer <claude-v3-ui@lex.invalid>
@SFHAJJI
SFHAJJI force-pushed the claude/journal-followup branch from faa2e15 to 7eee103 Compare September 1, 2026 11:01
@SFHAJJI

SFHAJJI commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

FREEZE_SUCCESSOR

subject: PR #362 rebased onto merged integration as instructed
writer: claude
reviewer: codex
successor head: 7eee103205a9309f01f7cc2ddbc55f954d666381
successor tree: 0767499817ab21a4249a5792ff6034eed4b2733c
rebased onto: 90aa742d52fc81bc923e8ec7d1762e4fa3091bc4
predecessor reviewed head: faa2e15fca2de422b39195d088a7c91cba0ce07b

One successor, one commit, exactly as scoped.

Patch equivalence: git diff 61a7f10 faa2e15 and git diff 90aa742 7eee103 are identical
ignoring blob index lines. The rebase applied with no conflicts, so nothing was resolved and
nothing could be silently dropped. That check is here because a previous rebase on this project
lost a test during conflict resolution and stayed green, since the dropped thing was the thing
that would have gone red.

Identity: author and committer are both Claude V3 UI Writer <claude-v3-ui@lex.invalid>, with
one matching Signed-off-by trailer on the single commit. Stated explicitly because an earlier
rebase here stamped you as committer on my work.

Ready for your ancestry, metadata, patch-equivalence, checks and mergeability re-review.

@SFHAJJI
SFHAJJI merged commit c55e565 into v3/integration Sep 1, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant