Skip to content

Document the remaining work as a handover - #24

Merged
contrasam merged 2 commits into
mainfrom
claude/gumbo-open-work-doc
Jul 26, 2026
Merged

Document the remaining work as a handover#24
contrasam merged 2 commits into
mainfrom
claude/gumbo-open-work-doc

Conversation

@contrasam

Copy link
Copy Markdown
Collaborator

docs/OPEN-WORK.md — everything still open after 0.3.0, written to be picked up cold.

0.3.0 shipped four of the report's eight items plus two defects that weren't on it. What's left is currently spread across a merged report, a dozen PR threads, and findings made while implementing — none of which survives a fresh context.

What it contains

Each item carries the evidence, so nobody has to re-derive why it matters:

  • The probe output for the multi-tag version defect (next QUEUE-only append got localId=4 (expected 1))
  • The measured 43 vs 51 step count for Catalyst's live corruption
  • Which mutation survivors are worth killing, and the two classes that are notFileChannel::force, which no in-process test can distinguish, and trim's index purge, which survives because the code is redundant rather than because the test is weak

It records ordering, not just a list, because parts are sequenced: the fault-injection harness belongs before D2 (D2 is a partial-write problem and would be its first customer), and the multi-tag version goes last as the only item carrying a log-migration cost.

Two items changed rank against the report, with reasons

A4 (capabilities) moves up from 7th. It was ranked as polish on the grounds that adapters didn't meaningfully differ — and 0.3.0 made them differ. The same append(request, expectedVersion) is fenced across processes on FoundationDB and fenced within one writer on the file adapter. That distinction exists only in prose right now, which is precisely how D4 happened.

D2 moves down. The directory lock from #7 means a second writer now fails loudly, so D2 is needed to make multi-writer usable, not to stop it being dangerous.

Also recorded

§0 is the release blocker: the 0.3.0 tag isn't pushed, with the exact commands and the reason it couldn't be done from the session that cut the release. Plus a coordinate mismatch worth settling first — pom.xml says com.cajunsystems, the README says com.github.CajunSystems, and Catalyst's existing 0.2.0 dependency therefore isn't resolving from JitPack.

Three process hazards that cost real time here:

Doc only; no code changes. Linked from the README's Further reading.


Generated by Claude Code

0.3.0 shipped four of the report's eight items plus two defects that were
not on it. What is left is spread across a merged report, several PR
threads, and a set of findings made while implementing — none of which
survives a fresh context.

docs/OPEN-WORK.md collects it with the evidence attached, so each item can
be picked up without re-deriving why it matters: the probe output for the
multi-tag version defect, the measured 43-vs-51 step count for Catalyst's
live corruption, the mutation survivors that are worth killing and the two
classes that are not.

It records ordering rather than just a list, because some of it is
sequenced: the fault-injection harness belongs before D2 since D2 is a
partial-write problem and would be its first real customer, and the
multi-tag version goes last because it is the only item carrying a
log-migration cost.

Two items changed rank against the report and the doc says why. A4
capabilities moves up: it was ranked as polish on the grounds that adapters
did not meaningfully differ, and 0.3.0 made them differ — the same
conditional append is fenced across processes on FoundationDB and within one
writer on the file adapter, a difference that currently exists only in
prose. D2 moves down: the directory lock means a second writer now fails
loudly, so D2 is needed to make multi-writer usable rather than to stop it
being dangerous.

Also records the three process hazards that cost time: a stacked PR merged
after its base leaves its content behind while reporting success, review
comments arrive after replies, and a passing test is not evidence the test
works — two here passed against the defect they were written for.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01May7agoupeXATCaWSDttAW
@greptile-apps

greptile-apps Bot commented Jul 26, 2026

Copy link
Copy Markdown

Greptile Summary

Documents the remaining post-0.3.0 work and clarifies failure semantics.

  • Adds a prioritized handover covering release tasks, unresolved defects, adapter capabilities, testing gaps, and process hazards.
  • Correctly scopes the trim index-purge guidance to FileBasedPersistenceAdapter and distinguishes InMemoryPersistenceAdapter.
  • Links the failure-semantics and open-work documents from the README.

Confidence Score: 5/5

The documentation-only PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
README.md Adds links to the failure-semantics and open-work documentation.
docs/FAILURE_SEMANTICS.md Clarifies that the file adapter’s trim purge remains necessary for bounding index memory and does not generalize to the in-memory adapter.
docs/OPEN-WORK.md Adds a detailed, prioritized handover of unresolved release, correctness, API, testing, and process work, including the corrected adapter-specific trim guidance.

Reviews (2): Last reviewed commit: "Correct the trim-purge guidance: name th..." | Re-trigger Greptile

Comment thread docs/OPEN-WORK.md Outdated
…lete it

Review finding, and the advice was wrong twice over.

It told a reader the trim index purge is redundant and worth deleting,
without naming the adapter it was derived from. That claim came from
FileBasedPersistenceAdapter, whose reads clamp to max(fromSeqnum,
trimSeqnum). InMemoryPersistenceAdapter has no trim point at all — no
trimSeqnum field, no read-time clamp — so there the removal *is* the
enforcement, and following the guidance would make reads return trimmed
entries. Deleting trim's implementation on the advice of a document about
why a mutant survives is a bad way to lose data.

The second error is that "delete it" is wrong even where it was derived.
The purge is unobservable through reads on the file adapter, which is why no
read-based test kills the mutant — but it bounds the in-memory index, and
unbounded index growth is a listed cross-cutting concern. The mutant
survives because it guards an invariant the tests do not assert, memory,
not because the code does nothing. Those are different findings and only one
of them means "delete".

Both documents are corrected, since FAILURE_SEMANTICS.md carried the same
sentence and is already on main. It also now records that InMemory's own
surviving mutant on trim is a different one, a negated conditional, so
nobody merges the two again.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01May7agoupeXATCaWSDttAW
@contrasam
contrasam merged commit 1e79e92 into main Jul 26, 2026
5 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.

2 participants