Dashboard › opencode-lore › Session 1CneZ2ZEf2mS
1CneZ2ZEf2mShWmjqIndependent READ-ONLY adversarial correctness review of immutable candidate /home/byk/Code/opencode-lore-responses-reference-v2. Base 2cbf40060c67df229731cf1b9e34d5bf22ec2145; head change wywumkptssoy commit 8063355cb328; expected diff hash 007a15b7fd1bcf9b346d89911b2353098b6fec408c12d3b6fcc24a498a37a356. No edits/format/install/VCS/server/network/DB/exhaustive rerun. Verify identity/status/conflicts/two files/hash start/end. Inspect every changed line and relevant callers/tests. Review item_reference lifecycle: private accumulation before suppression/limits; exact added/done/terminal shorthand validation; terminal-only same-ID/type replacement prevention; sparse principal/continuation projection; source/effective index bounds before recall/follow-up side effects; collision cross-product; no public reference IDs/events; terminal reconstruction; failure output []; retries/rollback/cancellation/backpressure; high-cardinality complexity; accumulator/postResponse fidelity. Assess fail-first/mutation evidence. Report PASS/CONCERN/MUST-FIX with exact file:line and concrete failure. Never empty. End exactly MERGE or DO-NOT-MERGE.
<skill_content name="jj-guide"> # Skill: jj-guide # jj Guide for AI Agents Jujutsu (jj) is a Git-compatible VCS with mutable commits, automatic snapshotting, no staging area, and first-class conflicts. This skill teaches you how to use it safely from a non-interactive agent environment. If `.jj/` exists in the repo root, this is a jj repo. **Use `jj` commands, not `git`.** In a colocated repo (`.jj/` *and* `.git/`), git tools can read the state, but mutations should go through `jj` so the operation log stays consistent. ## Critical Rules - **NEVER** use interactive flags (`-i`, `--interactive`). TUI prompts hang in agent environments. This applies to `jj split -i`, `jj squash -i`, `jj commit -i`, `jj resolve`, `jj diffedit`, etc. - **ALWAYS** pass `-m "msg"` when describing/committing. Without `-m`, an editor opens and hangs. - **VERIFY** mutations with `jj st` and `jj log` after `squash`, `abandon`, `rebase`, `restore`, `commit`. ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2</path> <type>directory</type> <entries> .craft.yml .git .github/ .gitignore .jj/ .lore.md .oxfmtrc.json .oxlintrc.json AGENTS.md CHANGELOG.md codecov.yml LICENSE node_modules/ package.json packages/ patches/ pnpm-lock.yaml pnpm-workspace.yaml quality/ README.md scripts/ stryker.config.mjs supabase/ tsconfig.base.json tsconfig.json vitest.config.ts vitest.evals.config.ts vitest.mutation.config.ts (28 entries) </entries>
<path>/home/byk/Code/opencode-lore-responses-reference-v2/AGENTS.md</path> <type>file</type> <content> 1: <!-- This section is maintained by the coding agent via lore (https://github.com/BYK/loreai) --> 2: ## Long-term Knowledge 3: 4: For long-term knowledge entries managed by [lore](https://github.com/BYK/loreai) (gotchas, patterns, decisions, architecture), see [`.lore.md`](.lore.md) in the project root. 5: <!-- End lore-managed section --> 6: 7: ## Review 8: 9: See [`quality/REVIEW.md`](quality/REVIEW.md) for the review heuristics and workflow — regression-test discipline, adversarial-order state setup, fan-out registry coverage, recurring bug-class batteries, and the two-reviewer rule. Every non-trivial PR requires an adversarial correctness review before merge. 10: 11: # Project Overview 12: 13: Lore is a **three-tier memory architecture** for AI coding agents. ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/quality/REVIEW.md</path> <type>file</type> <content> 1: # Review Heuristics — Lore 2: 3: This document codifies the review bar for pull requests. It exists because 4: adversarial review has repeatedly caught correctness bugs that a green test 5: suite missed — skip/early-return branches, lifecycle sequences, and fan-out 6: registry gaps. Institutionalizing these patterns so they compound. 7: 8: The review workflow (§6) is referenced from AGENTS.md. 9: 10: --- 11: 12: ## 1. Regression-test discipline 13: 14: Every adversarial-review finding that surfaces a defect **must** land a 15: deterministic regression test in the same PR. The test: 16: - fails on the base branch (proving it reproduces the bug), 17: - passes on the fix (proving the fix works), 18: - drives the *real* precondition, not an artificially-constructed state (e.g. ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/package.json</path>
<type>file</type>
<content>
1: {
2: "name": "lore-monorepo",
3: "private": true,
4: "type": "module",
5: "license": "FSL-1.1-Apache-2.0",
6: "description": "Monorepo root for Lore — three-tier memory architecture",
7: "main": "./packages/opencode/src/index.ts",
8: "exports": {
9: ".": "./packages/opencode/src/index.ts"
10: },
11: "packageManager": "pnpm@10.28.0",
12: "volta": {
13: "node": "24.16.0",
14: "pnpm": "10.28.0"
15: },
16: "pnpm": {
17: "onlyBuiltDependencies": [
18: "esbuild",
19: "onnxruntime-node",
20: "sharp"
21: ],
22: "overrides": {
23: "basic-ftp": "5.3.1",
24: "ip-address": "10.2.0",
25: "fast-xml-parser": "5.7.3",
26: "@huggingface/hub": "2.11.0",
27: "onnxruntime-node": "1.27.0",
28: "yaml": ">=2.8.3",
29: "esbuild": ">=0.28.1",
30: "@opentelemetry/core": ">=2.8.0",
31: ...
The working copy has no changes. Working copy (@) : zkttmwun b30b51fc (empty) (no description set) Parent commit (@-): wywumkpt 8063355c fix/responses-private-references-v2 | fix(responses): keep item references private Warning: These bookmarks have conflicts: fix/responses-private-references Hint: Use `jj bookmark list` to see details. Use `jj bookmark set <name> -r <rev>` to resolve.
zkttmwuntxzmuzpvktwywottxtyqxxtn b30b51fc2df58ae55a58170c315057892a5f05c5 parents=8063355cb32832bd8fac492bcbba7da22ae1976c conflict=false empty=true description= wywumkptssoyokzxuqtnkmlrtmqquurq 8063355cb32832bd8fac492bcbba7da22ae1976c parents=2cbf40060c67df229731cf1b9e34d5bf22ec2145 conflict=false empty=false description=fix(responses): keep item references private pxrvwsvvkmpoxnsqmrkwrnlqvvkoltwz 2cbf40060c67df229731cf1b9e34d5bf22ec2145 parents=e977b4b1da8f8197c3238466d41de0bccd8eb054 conflict=false empty=false description=feat(cch): add seeds for Claude Code up to 2.1.272 (#1780)
M packages/gateway/src/pipeline.ts M packages/gateway/test/openai-responses-recall-aware-stream.test.ts packages/gateway/src/pipeline.ts | 505 +++++++++----- ...est/openai-responses-recall-aware-stream.test.ts | 760 +++++++++++++++++++++- 2 files changed, 1098 insertions(+), 167 deletions(-)
(no output)
007a15b7fd1bcf9b346d89911b2353098b6fec408c12d3b6fcc24a498a37a356 - f711a1dafa4aae40d1001f9ae6f7d245db7f35b0b355898044045db19b8a6ea3 - 007a15b7fd1bcf9b346d89911b2353098b6fec408c12d3b6fcc24a498a37a356 - f711a1dafa4aae40d1001f9ae6f7d245db7f35b0b355898044045db19b8a6ea3 -
Modified regular file packages/gateway/src/pipeline.ts:
...
7826 7826: }) => Promise<Response>;
7827 7827: /** Test-only override for the stream inactivity deadline. */
7828 7828: sseInactivityMs?: number;
7829: /** Test-only deterministic operation counter for identity-index regressions. */
7830: _onIdentityIndexOperationForTest?: () => void;
7829 7831: /**
7830 7832: * Called when a `recall` function_call is fully parsed. Runs the recall
7831 7833: * (LTM search + optional LLM result) and returns the pieces needed to
... ...
Modified regular file packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
...
2019 2019: expect(JSON.stringify(completedResponse)).not.toContain("item_reference");
2020 2020: });
2021 2021:
2022: test("privately accumulates a done-only sparse Codex item_reference", async () => {
2023: const completion: {
2024: response?: GatewayResponse;
2025: successful?: boolean;
2026: } = {};
2027: const privateIdentity = "msg_done_only_private";
2028: const client = streamResponsesRecallAware(
2029: streamFrom([
2030: created("resp_done_only_reference", "gpt-5.6-terra"),
2031: sseEvent("response.output_item.done", {
2032: output_index: 7,
2033: item: { type: "item_reference", id: privateIdentity },
2034: }),
2035: sseEvent("response.completed", {
2036: response: {
2037: id: ...
Found 21 matches
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts:
Line 217: type ResponsesAccState,
Line 252: DEFAULT_MAX_SSE_FRAMES,
Line 7043: maxFrames: DEFAULT_MAX_SSE_FRAMES,
Line 7569: maxFrames: DEFAULT_MAX_SSE_FRAMES,
Line 7794: export function streamResponsesRecallAware(
Line 8001: Math.min(maxSSEFrames, DEFAULT_MAX_SSE_FRAMES),
Line 8110: const maxSparseIndex = Math.min(maxSSEFrames, DEFAULT_MAX_SSE_FRAMES);
Line 8379: const outputIndexForEvent = (
Line 9382: references: ReadonlyMap<number, ReferenceLifecycle>,
Line 9563: type ReferenceLifecycle = { id: string; done: boolean };
Line 9566: references: Map<number, ReferenceLifecycle>,
Line 9654: const assertReferenceLifecyclesComplete = (
Line 9655: references: ReadonlyMap<number, ReferenceLifecycle>,
Line 9678: const stripHiddenReferenceOutput = (
Line 10228: const ...
Found 2 matches
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/stream/openai-responses.ts:
Line 48: export interface ResponsesAccState {
Line 582: export function applyResponsesEvent(
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
180: buildAnthropicRequest,
181: buildAnthropicNonStreamResponse,
182: parseAnthropicResponseJSON,
183: type AnthropicCacheOptions,
184: } from "./translate/anthropic";
185: import {
186: bedrockMantleUrl,
187: isBedrockMantleDispatch,
188: toMantleModelId,
189: } from "./translate/bedrock";
190: import { buildVertexUpstream, vertexHost } from "./translate/vertex";
191: import { getVertexAccessToken, resolveVertexProject } from "./vertex-auth";
192: import {
193: buildOpenAIUpstreamRequest,
194: buildOpenAIResponse,
195: } from "./translate/openai";
196: import {
197: buildOpenAIResponsesUpstreamRequest,
198: buildOpenAIResponsesResponse,
199: parseOpenAIResponsesRequest,
200: } from "./translate/openai-responses";
201: import {
202: accumulateResponsesSSEStream,
203: streamResponsesPassthrough,
204: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/stream/openai-responses.ts</path> <type>file</type> <content> 1: /** 2: * OpenAI Responses API SSE stream accumulator. 3: * 4: * Parses upstream Responses API streaming events and accumulates the full 5: * response into a `GatewayResponse`. The Responses API uses a different 6: * SSE event lifecycle than Anthropic: 7: * 8: * response.created → response.in_progress → 9: * response.output_item.added → response.output_text.delta (repeated) → 10: * response.output_item.done → response.function_call_arguments.delta → 11: * response.function_call_arguments.done → 12: * response.completed 13: * 14: * Reuses `parseSSEStream` from the Anthropic stream module since the 15: * underlying SSE wire format is the same. ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
520:
521: function completeCodexMessageSnapshot(
522: snapshot: Record<string, unknown>,
523: outputIndex: number,
524: terminalContentParts: ReadonlyMap<
525: string,
526: { kind: "text" | "refusal"; value: string }
527: >,
528: ): Record<string, unknown> {
529: if (snapshot.type !== "message" || snapshot.content !== undefined) {
530: return snapshot;
531: }
532: const finalizedContent = finalizedResponsesMessageContent(
533: outputIndex,
534: terminalContentParts,
535: ).map((part) =>
536: part.kind === "text"
537: ? { type: "output_text", text: part.value }
538: : { type: "refusal", refusal: part.value },
539: );
540: return finalizedContent.length > 0
541: ? { ...snapshot, content: finalizedContent }
542: : snapshot;
543: }
544:
545: /** Validated unsuccessful terminal, ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
814: /** Build the final GatewayResponse from accumulated state. */
815: export function finalizeResponsesAcc(
816: state: ResponsesAccState,
817: ): GatewayResponse {
818: const content: GatewayContentBlock[] = [];
819: const sortedIndices = Array.from(state.items.keys()).sort((a, b) => a - b);
820:
821: for (const index of sortedIndices) {
822: const item = state.items.get(index);
823: if (!item) continue;
824: if (item.type === "text") {
825: if (item.content) {
826: for (const part of item.content) {
827: if (part.type === "output_text" && typeof part.text === "string") {
828: content.push({ type: "text", text: part.text });
829: } else {
830: content.push({
831: type: "opaque",
832: responsesItem: true,
833: raw: {
834: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts</path> <type>file</type> <content> 7760: }, 7761: streamSignal, 7762: recallPersistence.rollback, 7763: ); 7764: } 7765: 7766: /** 7767: * True-streaming, recall-aware variant of `streamResponsesPassthrough` for the 7768: * OpenAI Responses API (codex/ChatGPT) — used when the request carries the 7769: * gateway-injected `recall` tool but the client speaks the Responses API. 7770: * 7771: * Unlike the buffered `accumulateResponsesSSEStream` path (which withholds ALL 7772: * client bytes until the entire slow reasoning-heavy upstream completes — the 7773: * cause of opencode's 10s `ProviderHeaderTimeoutError`), this function forwards 7774: * every upstream SSE event to the client AS IT ARRIVES, while transparently 7775: * intercepting a `recall` `function_call` output item: 7776: * 7777: * - **No recall**: forwards everything unchanged (identical to 7778: * ...
Found 66 matches
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts:
Line 7881: const referenceIdentities = new Set<string>();
Line 7882: const outputIdentities = new Set<string>();
Line 7883: const outputIdentityIndices = new WeakMap<
Line 7887: const referenceIdentityIndices = new WeakMap<
Line 7930: let referenceFailureDetected = false;
Line 7932: referenceFailureDetected = true;
Line 8505: if (identities.some((identity) => referenceIdentities.has(identity))) {
Line 8511: outputIdentities.has(identity) || syntheticIdentities.has(identity),
Line 8516: const identityIndex = identityIndexFor(outputIdentityIndices, state);
Line 8518: outputIdentities.add(identity);
Line 8618: referenceIdentities.has(finalCallId)
Line 8624: (outputIdentities.has(finalCallId) ||
Line 8979: outputIdentities.add(finalFunctionIdentity.callId);
Line 8981: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
8300: query: input.query,
8301: scope: input.scope,
8302: id: input.id,
8303: ids: input.ids,
8304: detailOffset: input.detailOffset,
8305: detailLimit: input.detailLimit,
8306: toolUseId,
8307: });
8308: parsedInputs.delete(outputIndex);
8309: return true;
8310: };
8311:
8312: const addUsageTokens = (left: number, right: number): number => {
8313: const result = left + right;
8314: if (
8315: !Number.isSafeInteger(left) ||
8316: left < 0 ||
8317: !Number.isSafeInteger(right) ||
8318: right < 0 ||
8319: !Number.isSafeInteger(result)
8320: ) {
8321: throw new Error("Responses usage token overflow");
8322: }
8323: return result;
8324: };
8325: const mergeUsage = (target: GatewayUsage, source: GatewayUsage): void => {
8326: target.inputTokens ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
9090: ) {
9091: throw new Error(
9092: `Responses reasoning summary ended before completion for index ${outputIndex}:${summaryIndex}`,
9093: );
9094: }
9095: if (
9096: summaryState.authoritativeValueSeen &&
9097: summaryState.authoritativeValue !== finalPart.text
9098: ) {
9099: throw new Error(
9100: `Responses output_item.done changed reasoning summary for index ${outputIndex}:${summaryIndex}`,
9101: );
9102: }
9103: }
9104: }
9105: const finalContent = item?.content;
9106: if (finalContent !== undefined && !Array.isArray(finalContent)) {
9107: throw new Error("Responses reasoning content must be an ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
9410: }
9411: return item as Record<string, unknown>;
9412: });
9413: const expected = [...acc.rawItems.entries()].sort(([a], [b]) => a - b);
9414: const expectedPositions = new Map(
9415: expected.map(([outputIndex], position) => [outputIndex, position]),
9416: );
9417: if (
9418: opts.validation === "public" &&
9419: actualOutput.length !== expected.length
9420: ) {
9421: throw new Error("Responses terminal output changed streamed item");
9422: }
9423: let expectedIndex = 0;
9424: for (const actual of actualOutput) {
9425: const isReference = actual.type === "item_reference";
9426: if (
9427: isReference &&
9428: (typeof actual.id !== "string" ||
9429: !actual.id ||
9430: Object.keys(actual).some((key) => key !== "type" && key !== ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
10020: }),
10021: );
10022: }
10023:
10024: function buildOutputItems(
10025: hiddenIndices: ReadonlySet<number> = new Set(),
10026: ): Array<Record<string, unknown>> {
10027: const finalOutput: Array<Record<string, unknown>> = [];
10028: const sortedIndices = [
10029: ...new Set([...state.rawItems.keys(), ...state.items.keys()]),
10030: ].sort((a, b) => a - b);
10031: for (const index of sortedIndices) {
10032: if (hiddenIndices.has(index)) continue;
10033: const item = state.items.get(index);
10034: if (!item) {
10035: const rawItem = state.rawItems.get(index);
10036: if (rawItem && rawItem.type !== "item_reference") {
10037: finalOutput.push(rawItem);
10038: }
10039: continue;
10040: }
10041: if (item.type === "text") {
10042: if ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
10830: for (
10831: let index = heldContinuationEvents.length - 1;
10832: index >= 0;
10833: index--
10834: ) {
10835: if (
10836: heldContinuationEvents[index].candidateIndex ===
10837: outputIndex
10838: ) {
10839: if (!heldContinuationEvents[index].transactional) {
10840: deferredContinuationBytes -=
10841: heldContinuationEvents[index].chunk.byteLength;
10842: }
10843: heldContinuationEvents.splice(index, 1);
10844: }
10845: }
10846: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
11720: } catch (err) {
11721: rollbackTransaction();
11722: if (principalReader) {
11723: cancelAndReleaseReader(principalReader, signal.reason);
11724: }
11725: principalReader = null;
11726: clearKeepalive();
11727: if (opts.signal?.aborted && !cancelled) {
11728: safeError(opts.signal.reason);
11729: return;
11730: }
11731: if (terminalDelivered) {
11732: if (continuationAttempted && !signal.aborted) {
11733: reportContinuationFailure(
11734: err instanceof RecallContinuationFailure
11735: ? err.category
11736: : (continuationFailureCategory ?? ...
Found 88 matches
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
Line 375: test.each(["failed", "cancelled"])(
Line 1792: type: "item_reference",
Line 1862: test.each([
Line 1978: test("never forwards response-side item_reference lifecycle events", async () => {
Line 1986: type: "item_reference",
Line 1993: type: "item_reference",
Line 2002: output: [{ type: "item_reference", id: "msg_server_only" }],
Line 2017: expect(out).not.toContain("item_reference");
Line 2019: expect(JSON.stringify(completedResponse)).not.toContain("item_reference");
Line 2022: test("privately accumulates a done-only sparse Codex item_reference", async () => {
Line 2033: item: { type: "item_reference", id: privateIdentity },
Line 2040: output: [{ type: "item_reference", id: privateIdentity }],
Line 2058: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
1740: name: "read",
1741: }),
1742: );
1743: expect(completedResponse?.rawOutputItems).toContainEqual(
1744: expect.objectContaining({
1745: id: "fc_terminal_name",
1746: call_id: "call_terminal_name",
1747: name: "read",
1748: }),
1749: );
1750: expect(recallCalls).toBe(0);
1751: });
1752:
1753: test("rejects malformed terminal output items", async () => {
1754: const client = streamResponsesRecallAware(
1755: streamFrom([
1756: created("resp_terminal_malformed", "gpt-5.6-terra"),
1757: textItem(0, "answer", "msg_terminal_malformed"),
1758: sseEvent("response.completed", {
1759: response: {
1760: id: "resp_terminal_malformed",
1761: model: "gpt-5.6-terra",
1762: status: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
2738: ]),
2739: {
2740: validation: "codex",
2741: onComplete: () => {},
2742: onRecall: async () => ({ anchorText: "", resultText: "" }),
2743: runFollowUp: async () => {
2744: throw new Error("should not run");
2745: },
2746: _onIdentityIndexOperationForTest: () => {
2747: operations.count++;
2748: },
2749: },
2750: );
2751:
2752: const output = await drain(client);
2753: expect(output).not.toContain("response.failed");
2754: expect(output).not.toContain("item_reference");
2755: expect(operations.count).toBe(cardinality * 5);
2756: });
2757:
2758: test("rejects an item_reference missing output_item.done", async () => {
2759: const client = streamResponsesRecallAware(
2760: streamFrom([
2761: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
3460: name: "",
3461: arguments: "",
3462: status: "in_progress",
3463: },
3464: }),
3465: sseEvent("response.function_call_arguments.delta", {
3466: output_index: 0,
3467: item_id: "fc_streamed_changed_recall",
3468: delta: privateArguments,
3469: }),
3470: sseEvent("response.completed", {
3471: response: {
3472: id: "resp_terminal_changed_recall",
3473: model: "gpt-5.6-terra",
3474: status: "completed",
3475: output: [
3476: {
3477: type: "function_call",
3478: id: "fc_terminal_changed_recall",
3479: call_id: "call_terminal_changed_recall",
3480: name: "recall",
3481: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
4490: item: { type: "reasoning", id: "rs_changed", summary: [] },
4491: }),
4492: sseEvent("response.reasoning_summary_part.added", {
4493: output_index: 0,
4494: item_id: "rs_changed",
4495: summary_index: 0,
4496: }),
4497: sseEvent("response.reasoning_summary_text.delta", {
4498: output_index: 0,
4499: item_id: "rs_changed",
4500: summary_index: 0,
4501: delta: "secret",
4502: }),
4503: sseEvent("response.reasoning_summary_text.done", {
4504: output_index: 0,
4505: item_id: "rs_changed",
4506: summary_index: 0,
4507: text: "secret",
4508: }),
4509: sseEvent("response.reasoning_summary_part.done", {
4510: output_index: 0,
4511: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
4900: onRecall: async () => ({ anchorText: "", resultText: "" }),
4901: runFollowUp: async () => {
4902: throw new Error("should not run");
4903: },
4904: },
4905: );
4906:
4907: expect(await drain(client)).toContain("response.failed");
4908: });
4909:
4910: test("rejects output_item.done changing reasoning text", async () => {
4911: const client = streamResponsesRecallAware(
4912: streamFrom([
4913: created("resp_reasoning_text_changed", "gpt-5.6-terra"),
4914: sseEvent("response.output_item.added", {
4915: output_index: 0,
4916: item: { type: "reasoning", id: "rs_text_changed", content: [] },
4917: }),
4918: sseEvent("response.reasoning_text.done", {
4919: output_index: 0,
4920: item_id: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
5300: id: "fc_failed_companion",
5301: call_id: "call_failed_companion",
5302: name: "read",
5303: arguments: companionArgs,
5304: },
5305: }),
5306: sseEvent("response.completed", {
5307: response: {
5308: id: "resp_failed_companion",
5309: model: "gpt-5.6-terra",
5310: status: "completed",
5311: output: [
5312: {
5313: type: "function_call",
5314: id: "fc_failed_companion",
5315: call_id: "call_failed_companion",
5316: name: "read",
5317: arguments: companionArgs,
5318: status: "failed",
5319: },
5320: ],
5321: },
5322: }),
5323: ]),
5324: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
5660: });
5661:
5662: test("preserves content_filter continuation terminal and item metadata", async () => {
5663: const citation = {
5664: type: "url_citation",
5665: start_index: 0,
5666: end_index: 6,
5667: url: "https://example.com/lore",
5668: title: "Lore",
5669: };
5670: const followUp = streamFrom([
5671: created("resp_terminal_metadata_followup", "gpt-5.6-terra"),
5672: textItem(0, "answer", "msg_terminal_metadata_followup"),
5673: sseEvent("response.incomplete", {
5674: response: {
5675: id: "resp_terminal_metadata_followup",
5676: model: "gpt-5.6-terra",
5677: status: "incomplete",
5678: incomplete_details: { reason: "content_filter" },
5679: output: [
5680: {
5681: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
6630: ).body!.getReader(),
6631: }),
6632: },
6633: );
6634:
6635: const out = await drain(client);
6636: expect(out).toContain(PUBLIC_RECALL_ERROR);
6637: expect(out).not.toContain(firstEvent);
6638: expect(out).not.toContain(secondEvent);
6639: expect(failures).toEqual(["resource_limit"]);
6640: });
6641:
6642: test("does not double-charge transactional output when retrying a continuation", async () => {
6643: const extension = `event: extension\ndata: ${"x".repeat(600 * 1024)}\n\n`;
6644: const droppedFollowUp = new Response(
6645: new ReadableStream<Uint8Array>({
6646: start(controller) {
6647: controller.enqueue(
6648: new TextEncoder().encode(
6649: created("resp_transactional_retry_dropped", "gpt-5.6-terra") ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
18720: }
18721: },
18722: dropStreamingFinalizer,
18723: true,
18724: requestCredentialFingerprint(req.rawHeaders, config) ?? undefined,
18725: );
18726: }
18727: function finishUnsuccessfulStreaming(resp: GatewayResponse): void {
18728: if (streamingFinalizerRegistered) return;
18729: streamingFinalizerRegistered = true;
18730: scheduleStreamingPostResponse(
18731: sessionState.sessionID,
18732: requestGeneration,
18733: async () => {
18734: await downstreamSettled;
18735: await new Promise<void>((resolve) => setImmediate(resolve));
18736: rollbackRecallPersistence();
18737: if (
18738: requestGeneration !== streamingPostResponseGeneration ||
18739: sessionSignal.aborted
18740: ) {
18741: dropStreamingFinalizer();
18742: ...
Found 28 matches /home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/stream/openai-responses.ts: Line 911: maxSparseIndex: number, Line 917: (outputIndex as number) < maxSparseIndex; Line 988: (parsed.content_index as number) >= maxSparseIndex) Line 1094: (parsed.content_index as number) >= maxSparseIndex || Line 1226: maxSparseIndex: number, Line 1229: while (index < maxSparseIndex && state.rawItems.has(index)) index += 1; Line 1230: if (index >= maxSparseIndex) malformedResponsesEvent(); Line 1483: maxSparseIndex: number, Line 1507: outputIndex = nextResponsesOutputIndex(state, maxSparseIndex); Line 1533: maxSparseIndex: number, Line 1579: outputIndex ??= nextResponsesOutputIndex(state, maxSparseIndex); Line 1629: maxSparseIndex: number, Line 1638: (parsed.output_index as number) >= maxSparseIndex) Line 1646: (parsed.content_index as number) >= maxSparseIndex) Line ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
1600: });
1601: }
1602: if (event === "response.output_item.done") {
1603: reconcileCodexDoneItem(state, outputIndex, item);
1604: if (existing && !responsesDoneItemMatchesAdded(item, existing)) {
1605: malformedResponsesEvent();
1606: }
1607: } else {
1608: if (itemId) {
1609: bindResponsesIdentity(state, state.itemIndexById, itemId, outputIndex);
1610: state.unboundTextItems.delete(outputIndex);
1611: state.unboundToolItems.delete(outputIndex);
1612: }
1613: if (item.type === "function_call" && isNonEmptyString(item.call_id)) {
1614: bindResponsesIdentity(
1615: state,
1616: state.callIndexById,
1617: item.call_id,
1618: outputIndex,
1619: );
1620: }
1621: }
1622: parsed.output_index = outputIndex;
1623: }
1624:
1625: function ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
1450: normalized.callId,
1451: outputIndex,
1452: );
1453: bindCodexEffectiveToolIdentity(
1454: state,
1455: outputIndex,
1456: normalized.callId,
1457: previousEffectiveIdentity,
1458: );
1459: }
1460: normalized.name = reconcileCodexIdentity(normalized.name, item.name);
1461: if (
1462: state.argumentDoneItems.has(outputIndex) &&
1463: item.arguments !== undefined &&
1464: item.arguments !== normalized.args
1465: ) {
1466: malformedResponsesEvent();
1467: }
1468: if (item.arguments !== undefined) {
1469: normalized.args = item.arguments as string;
1470: }
1471:
1472: // Keep the final raw item complete when ChatGPT omits fields that were
1473: // already established by sparse added/delta events.
1474: item.call_id = normalized.callId;
1475: item.name = ...
Found 6 matches
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/stream/openai-responses.ts:
Line 100: "item_reference",
Line 894: .filter((item) => item.type !== "item_reference"),
Line 1156: function codexItemKind(
Line 1302: function validateCodexOutputItem(
Line 2212: (snapshot.type !== "item_reference" &&
Line 2218: if (snapshot.type === "item_reference") {
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
1130: }
1131:
1132: /** `public` enforces OpenAI's lifecycle; `codex` validates ChatGPT's sparse variant. */
1133: export type ResponsesValidationMode = "public" | "codex";
1134:
1135: function isRecord(value: unknown): value is Record<string, unknown> {
1136: return !!value && typeof value === "object" && !Array.isArray(value);
1137: }
1138:
1139: function malformedResponsesEvent(): never {
1140: throw new Error("malformed Responses stream event");
1141: }
1142:
1143: function isNonEmptyString(value: unknown): value is string {
1144: return typeof value === "string" && value.length > 0;
1145: }
1146:
1147: function reconcileCodexIdentity(earlier: unknown, final: unknown): string {
1148: const earlierValue = isNonEmptyString(earlier) ? earlier : "";
1149: const finalValue = isNonEmptyString(final) ? ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
3980: created("resp_added_only_message", "gpt-5.6-terra"),
3981: sseEvent("response.output_item.added", {
3982: item: {
3983: type: "message",
3984: id: "msg_added_only_message",
3985: role: "assistant",
3986: },
3987: }),
3988: completed("resp_added_only_message"),
3989: ]),
3990: {
3991: validation: "codex",
3992: onComplete: () => {},
3993: onRecall: async () => ({ anchorText: "", resultText: "" }),
3994: runFollowUp: async () => {
3995: throw new Error("should not run");
3996: },
3997: },
3998: );
3999:
4000: expect(await drain(client)).not.toContain("response.failed");
4001: });
4002:
4003: test("public mode still rejects an incomplete added-only message ...
Found 47 matches
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/cache-warmer.test.ts:
Line 3027: const sourcePath = "/tmp/test-histogram-reused-source-path";
Line 3028: const targetPath = "/tmp/test-histogram-reused-target";
Line 3029: const otherTargetPath = "/tmp/test-histogram-reused-other-target";
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/lifecycle-lock.test.ts:
Line 361: test("reclaims dead and PID-reused owners without predecessor deletion", async () => {
Line 377: identity: "boot:reused-process",
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/install-script.test.ts:
Line 642: "reclaims a live PID whose process generation was reused",
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
Line 531: call_id: "call_reused",
Line 545: call_id: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
6350: expect(out).toContain(buildAnchor("architecture"));
6351: expect(out).not.toContain("Searching");
6352: // Continuation text streamed inline.
6353: expect(out).toContain("Here is the answer from the continuation.");
6354: // Rebuilt terminal event.
6355: expect(out).toContain("response.completed");
6356: // No raw recall function_call leaked.
6357: expect(out).not.toMatch(/name":\s*"recall/);
6358: // The follow-up's OWN lifecycle/terminal events are suppressed — the
6359: // client sees exactly ONE response.created and ONE response.completed
6360: // (as `event:` boundaries; the rebuilt completed also carries
6361: // "type":"response.completed" in its payload, which is expected).
6362: expect(out.match(/^event: response\.created$/gm)).toHaveLength(1);
6363: ...
<path>/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
3060: name: "",
3061: arguments: "",
3062: },
3063: }),
3064: sseEvent("response.function_call_arguments.delta", {
3065: output_index: 0,
3066: item_id: "fc_sparse_promotion_limit",
3067: delta: privateArguments,
3068: }),
3069: sseEvent("response.output_item.done", {
3070: output_index: 0,
3071: item: {
3072: type: "function_call",
3073: id: "fc_sparse_promotion_limit",
3074: call_id: "call_sparse_promotion_limit",
3075: name: "recall",
3076: arguments: privateArguments,
3077: status: "completed",
3078: },
3079: }),
3080: completed("resp_sparse_promotion_limit"),
3081: ]),
3082: {
3083: ...
26e5e6b70512a2de326eebfb59d6d8f6b4198b098f4f560f353b3f26715b99e4 packages/gateway/src/pipeline.ts 5a5779ba10143315579dec688fe5e80a233da0972c96445b68dd33219672ad51 packages/gateway/test/openai-responses-recall-aware-stream.test.ts
Commit ID: 8063355cb32832bd8fac492bcbba7da22ae1976c
Change ID: wywumkptssoyokzxuqtnkmlrtmqquurq
Bookmarks: fix/responses-private-references-v2 fix/responses-private-references-v2@git
Author : Burak Yigit Kaya <ben@byk.im> (2026-09-14 21:38:23)
Committer: Burak Yigit Kaya <ben@byk.im> (2026-09-16 20:01:23)
fix(responses): keep item references private
M packages/gateway/src/pipeline.ts
M packages/gateway/test/openai-responses-recall-aware-stream.test.ts
Found 68 matches
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/cache-warmer.test.ts:
Line 3123: test("outer rollback keeps unflushed histogram state on the source project", () => {
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/bedrock-runtime.test.ts:
Line 431: test("downstream cancellation promptly cancels the hostile body and disposes the deadline", async () => {
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/gemini-stream.test.ts:
Line 156: test("takes cumulative usage from the finishReason frame and cancels transport tail", async () => {
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/foreground-routes-abort.test.ts:
Line 287: test("pipeline reset aborts an actual Bedrock streaming route and unblocks listener close", async () => {
/home/byk/Code/opencode-lore-responses-reference-v2/packages/gateway/test/llm-adapter.test.ts:
Line 150: ...
The working copy has no changes. Working copy (@) : zkttmwun b30b51fc (empty) (no description set) Parent commit (@-): wywumkpt 8063355c fix/responses-private-references-v2 | fix(responses): keep item references private Warning: These bookmarks have conflicts: fix/responses-private-references Hint: Use `jj bookmark list` to see details. Use `jj bookmark set <name> -r <rev>` to resolve. zkttmwuntxzmuzpvktwywottxtyqxxtn b30b51fc2df58ae55a58170c315057892a5f05c5 parents=8063355cb32832bd8fac492bcbba7da22ae1976c conflict=false empty=true wywumkptssoyokzxuqtnkmlrtmqquurq 8063355cb32832bd8fac492bcbba7da22ae1976c parents=2cbf40060c67df229731cf1b9e34d5bf22ec2145 conflict=false empty=false pxrvwsvvkmpoxnsqmrkwrnlqvvkoltwz 2cbf40060c67df229731cf1b9e34d5bf22ec2145 parents=e977b4b1da8f8197c3238466d41de0bccd8eb054 conflict=false empty=false M packages/gateway/src/pipeline.ts M ...
Codex normalization can bypass reference-failure handling.
normalizeCodexEvent() runs before consumeReferenceEvent() in both principal and continuation paths (packages/gateway/src/pipeline.ts:10327-10335, 10943-10961). The normalizer rejects bounded-index and identity collisions with a generic error (packages/gateway/src/stream/openai-responses.ts:1548-1557, 1634-1640). That leaves referenceFailureDetected false, so the failure projection is not cleared (pipeline.ts:11835-11859).
Concrete failure: emit a visible Codex item, then an out-of-range or colliding item_reference. The synthetic response.failed.output retains the visible item instead of being []. The bound test at openai-responses-recall-aware-stream.test.ts:2439-2485 omits validation: "codex" and prior visible output, so it cannot catch this production path.
Terminal-only shorthand references bypass effective-index preflight.
A terminal shorthand reference is accepted at pipeline.ts:9492-9510, but only explicit added/done references populate reference state (pipeline.ts:9616-9618, 9639-9641). Principal preflight checks referenceIndices.size (pipeline.ts:10651-10655), while continuation preflight checks referenceIdentities.size (pipeline.ts:10887-10892, 11316-11335).
Concrete failure: with maxSSEFrames = 32, place a completed private recall at index 31 and represent it through terminal shorthand. The code accepts it, computes continuation offset 32 through unbounded shiftedOutputIndex(), then runs recall/follow-up side effects. An equivalent explicit reference fails before those effects. Continuation shorthand can likewise reference a locally valid item whose shifted effective index is out of range before nested recall executes. Tests at test.ts:2334-2378 use index 0; boundary tests cover explicit lifecycle references only.
The global stream-byte limit still runs before private accumulation.
...