LLP 0282: is_sidechain is three-valued, and the Claude live producers never write false - #930
Draft
philcunliffe wants to merge 2 commits into
Draft
LLP 0282: is_sidechain is three-valued, and the Claude live producers never write false#930philcunliffe wants to merge 2 commits into
philcunliffe wants to merge 2 commits into
Conversation
… never write false Deferred finding 2 from the PR #895 review rounds (#920). The Codex producers and the Claude transcript backfill write the real boolean, so a positively identified main-loop row reads `false`. The two Claude live producers, proxy (`claude/src/projector.js:354`) and OTEL (`claude/src/telemetry/projection.js:191`), write `true` or nothing, so their main-loop rows read null. A consumer filtering `where is_sidechain = false` silently drops every Claude live main-loop row while keeping the transcript-backfilled ones for the same session. Both reviewers of PR #895 flagged this and both declined to fix it in that PR: stamping `false` on the OTEL path alone would break the two-producer parity LLP 0252 turns on, and either resolution changes the shape settled in LLP 0252 and LLP 0262. This document is the request that decision was asked for. It records the observation, why both live paths were written the way they are, and the two coherent resolutions (both producers stamp the boolean, or the tri-state becomes the written contract and consumer guidance moves off `= false`). Request only. Nothing is settled here and no code changes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…-917 Two neutral workers minted a request LLP in the same reconcile tick and both read the same highest-number-in-use, so both took 0282. origin/fix/issue-917 (PR #932) claims llp/0282-compaction-evicts-a-live-session.issue.md and also 0283, so this document moves to 0285, the first number unclaimed across master and all open branches. Mechanical renumber only: no content change, no status change. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Request document only. No code changes, no rows change, nothing is settled here.
What this is
Deferred finding 2 from the neutral review rounds on PR #895, enumerated in #920. Both review rounds flagged it and both explicitly declined to fix it in that PR: "Either way it is a change to the settled shape in LLP 0252 / 0262 and wants its own request, not a drive-by in this PR." This is that request.
The observation (verified on
master,12154929)ai_gateway_messages.is_sidechainis a nullable boolean and its four producers disagree about what null means.Write the real boolean, so a positively identified main-loop row reads
false:hypaware-core/plugins-workspace/codex/src/exchange-projector.js:1195hypaware-core/plugins-workspace/codex/src/backfill.js:656hypaware-core/plugins-workspace/claude/src/transcripts.js:692Write
trueor nothing, neverfalse:hypaware-core/plugins-workspace/claude/src/projector.js:354(proxy, gated on thex-claude-code-agent-idheader)hypaware-core/plugins-workspace/claude/src/telemetry/projection.js:191(OTEL, gated on theagent.nameattribute)So a consumer writing
where is_sidechain = falseto mean "main loop only" silently drops every Claude live main-loop row while keeping the transcript-backfilled rows for the same session. The asymmetry shows up in the repo's own gates:smoke/flows/gateway_codex_capture.js:291assertsis_sidechain === falseon a Codex main-loop row and there is no equivalent assertion on either Claude live path, because there is nothing to assert.Why it needs a decision rather than a patch
Both Claude live producers only ever see positive evidence of a subagent, so absence of the marker is not proof of a main-loop turn. And LLP 0252 turns on the two Claude live producers' rows being indistinguishable, so stamping
falseon one path alone breaks the parity that PR #895 exists to hold. The document lays out the two coherent resolutions (both live producers stamp the boolean behind a positive main-loop signal, or the tri-state becomes the written contract and thehypaware-analyst/hypaware-queryguidance moves off= false) with the cost of each, and names the three outputs either choice owes.Scope
Adds one file,
llp/0282-is-sidechain-is-three-valued-on-the-claude-live-producers.issue.md, inDraft. No source file is touched, so there is no regression test to add and no test to break. LLP 0252 and LLP 0262 are left unedited: no forward-ref is appended until a decision actually lands.Number 0282 was chosen as the first unclaimed number across
masterand every open PR branch at the time of writing; renumbering is a mechanical edit under LLP 0156 if another branch takes it first (#907).Refs #920 (finding 2). Does not close it: findings 1 and 3 on that issue are separate and are not addressed here.