feat(session): make uncertainty expressible instead of implied - #546
Conversation
yordis
commented
Aug 22, 2026
- The catalog could not say what did not happen: a call that returned a handle rather than an outcome, a namespace seen without its contents, a target named and never applied. Each of those absences defaulted to looking like success, and the log is never truncated, so it would keep that forever.
- The contract lands ahead of the runtime so the runtime cannot quietly invent semantics for the cases it finds inconvenient.
- Two accepted decisions moved rather than being worked around: ADR#0057 fences stream incarnations by subject, and ADR#0058 withdraws ADR#0035 facet 8's "no query protos" clause instead of leaving twelve query protos silently contradicting it.
The catalog was close to right. What it could not say was what did not happen: a call that returned a handle rather than an outcome, a namespace seen without its contents, a target named and never applied, a projection answering from a view it cannot vouch for. Every one of those absences defaulted to looking like success, and a log that is never truncated keeps that lie forever. The contract lands before the runtime so the runtime cannot quietly invent semantics for the cases it finds inconvenient. Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
PR SummaryMedium Risk Overview ADR#0059 fences JetStream rebuilds: live session subjects are never evicted; incarnation is a subject token; retired streams are sealed. This amends ADR#0035 facet 7 so cold-storage eviction is no longer allowed, and ADR#0060 withdraws facet 8’s “projection value is the read contract.” Queries stay Also records what is not in the schema (language, external work ids, per-tool telemetry) and closes the FX study’s open questions. Usage settlement lives in its own domain so billing retries never append to the keep-forever session log. Reviewed by Cursor Bugbot for commit 7b50046. Bugbot is set up for automated code reviews on this repo. Configure here. |
|
Important Review skippedToo many files! This PR contains 126 files, which is 26 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (207)
📒 Files selected for processing (126)
You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Main landed its own 0057 and 0058 while this branch was open. Different filenames meant git merged both without complaint, so the collision would have shipped as two ADRs answering to each number. The session pair moves to 0059 and 0060 because main's were accepted first. Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Code Coverage SummaryDetailsDiff against mainResults for commit: 7b50046 Minimum allowed coverage is ♻️ This comment has been updated with latest results |
The completeness/omitted_count invariant and every field guard on SessionRecovered shipped without a single test, so the one rule that stops a salvage from claiming completeness and loss at once was enforced by nothing a change could trip over. Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
A bare ADR number tells a reader a decision exists but not where to read it, and the renumbering that resolved the collision with main is exactly the kind of drift a plain-text mention cannot survive. Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>