Skip to content

LLP 0282: is_sidechain is three-valued, and the Claude live producers never write false - #930

Draft
philcunliffe wants to merge 2 commits into
masterfrom
llp-0282-is-sidechain-three-valued
Draft

LLP 0282: is_sidechain is three-valued, and the Claude live producers never write false#930
philcunliffe wants to merge 2 commits into
masterfrom
llp-0282-is-sidechain-three-valued

Conversation

@philcunliffe

Copy link
Copy Markdown
Contributor

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_sidechain is 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:1195
  • hypaware-core/plugins-workspace/codex/src/backfill.js:656
  • hypaware-core/plugins-workspace/claude/src/transcripts.js:692

Write true or nothing, never false:

  • hypaware-core/plugins-workspace/claude/src/projector.js:354 (proxy, gated on the x-claude-code-agent-id header)
  • hypaware-core/plugins-workspace/claude/src/telemetry/projection.js:191 (OTEL, gated on the agent.name attribute)

So a consumer writing where is_sidechain = false to 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:291 asserts is_sidechain === false on 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 false on 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 the hypaware-analyst / hypaware-query guidance 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, in Draft. 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 master and 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.

… 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>
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