Skip to content

Commit fddf536

Browse files
committed
test(agentsessions): pin the corpus shapes by fixture instead of by the reviewer's disk
Reported by @Vasanthdev2004: the two real-corpus tests fail for anyone with a real store, and pass on CI only because the runner has none. He is right, and the mechanism is worse than a threshold being too tight. Both tests assert STATISTICS over whatever store the machine running them happens to have, which is not a property of this package. The same code at 582fa47 reported "44 of 44 rollouts, 43 with a model" and "360 of 367 transcripts" here and "0 with a model" and "15 of 21 (71%)" for him. Green for the robot, red for the contributor, and the assertion never ran where a regression would actually land, because CI skips. Reproduced his exact numbers by constructing a store shaped like his and running the tests at 582fa47 against it: codex_test.go:184: no session got a real title codex_test.go:187: no session got a model - turn_context is being discarded again --- FAIL: TestTheRealCodexCorpusStillParses family1_test.go:253: indexed 15 of 21 real transcripts (71%) --- FAIL: TestTheRealCorpusStillParses Against the same store this branch passes and says why: no session in the live store carries a model: every rollout here has its turn_context outside the head budget. TestARolloutWithALateTurnContextIndexes- WithoutAModel pins that shape deterministically (2 rollouts) ## What the shapes actually are Enumerated against the real 44-rollout and 367-transcript stores here. MODEL. turn_context is the only record carrying one; session_meta has no "model" key at all. It lands at line 4-8 and byte offset 15KB-175KB here, comfortably inside the head budget, and outside it on his machine. The session is still listed, titled, addressable and importable - only the label is missing - and Discover walks the whole date-partitioned store on every picker open, so the bounded read is the right trade. The fixture pins the current behaviour rather than asserting recovery, and says in the comment that teaching the index to recover it should fail this test deliberately rather than drift. DROPS. cwd is only ever carried by user, attachment and system records; the preamble types never carry it. All 7 unindexed transcripts here are single bridge-session stubs with no cwd anywhere - legitimate, since a session with no workspace cannot be resumed into one. There is also a real defect behind the same "no cwd" verdict, and nothing distinguishes them in the output: the cwd-bearing record is subject to MaxLineBytes, and a truncated record fails to parse and is skipped whole. That is already happening to the opening user record in 30 of 367 transcripts here; they survive only because Claude Code writes a small attachment next that also carries cwd - 73 of the 360 indexed sessions (20%) take their cwd from an attachment for exactly this reason. One without that rescue would vanish and look like a stub. TestAWorkspaceInAnOverlongRecordIsStillFound pins it; shrinking MaxLineBytes below the record's length drops the session and fails the test. ## Also - Rebased onto main. His note said 2 behind (#890, #903); it was 14 by the time this was done. Clean, and the merged tree builds. - Longest testdata path 133 -> 108 chars for the Windows checkout limit, by shortening the two fixture roots and the rollout stem. The trailing uuid is kept because codexID reads the session id from it. - The live-store tests now report their counts instead of asserting them. They still fail hard on a non-empty store indexing nothing, and on an index entry missing a field the CLI prints - the parts that are about the code. Three mutations, each caught by the test written for it: removing the cwd guard indexes both unresumable stubs; shrinking MaxLineBytes drops the long-cwd session; raising MaxLines lets the head scan reach the late turn_context. Pre-existing here and unrelated: TestRunDoctorFormatsRedactedProviderDiagnostics and TestRunDoctorConnectivityProbesProvider exit 3 in this environment. Origin-Session: local-13d543 | Claude Code | 2 prompts Origin-Snapshot: a939509c08a8
1 parent 9162381 commit fddf536

10 files changed

Lines changed: 230 additions & 12 deletions

File tree

‎internal/agentsessions/codex_test.go‎

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,25 @@ func TestTheRealCodexCorpusStillParses(t *testing.T) {
178178
if len(found) == 0 {
179179
t.Fatal("no Codex sessions indexed from a non-empty store")
180180
}
181-
// Both of these were zero before the fixes above; a regression takes them
182-
// back to zero rather than to some slightly-lower number.
181+
// REPORTED, NOT ASSERTED. What these counts measure is the shape of the store
182+
// on the machine running them, which is not a property of this package: the
183+
// same code reported "44 of 44 rollouts, 43 with a model" on one machine and
184+
// "2 of 2, 0 with a model" on a reviewer's. Failing on the second is a red
185+
// build for the contributor and a green one for CI, which is backwards — CI
186+
// has no store and skips, so the assertion never ran where a regression would
187+
// actually land.
188+
//
189+
// The shapes behind both numbers are pinned by construction in
190+
// fixture_corpus_test.go, which runs everywhere and cannot skip. What this
191+
// test is still good for is noticing a shape the fixtures do not cover, so it
192+
// prints its counts and leaves the judgement to the reader.
183193
if titled == 0 {
184-
t.Error("no session got a real title — the context-injection filter has stopped working")
194+
t.Logf("no session in the live store got a real title; if that is unexpected here, "+
195+
"the context-injection filter may have drifted (%d rollouts)", total)
185196
}
186197
if modelled == 0 {
187-
t.Error("no session got a model — turn_context is being discarded again")
198+
t.Logf("no session in the live store carries a model: every rollout here has its "+
199+
"turn_context outside the head budget. TestARolloutWithALateTurnContextIndexesWithoutAModel "+
200+
"pins that shape deterministically (%d rollouts)", total)
188201
}
189202
}

‎internal/agentsessions/family1_test.go‎

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,13 +245,20 @@ func TestTheRealCorpusStillParses(t *testing.T) {
245245
}
246246
}
247247

248-
// Indexing should account for nearly every transcript. The known-legitimate
249-
// exclusions are single-record stubs (bridge-session), which ran at ~3% of
250-
// the corpus when this was written. A large unexplained gap means the head
251-
// budget or the record shape has drifted.
248+
// REPORTED, NOT ASSERTED — for the same reason as the Codex counterpart. This
249+
// ratio describes the reviewer's disk, not this package: it read 98% here
250+
// (the 7 misses all single-record bridge-session stubs) and 71% on a
251+
// reviewer's smaller store, so the threshold decided who got a red build
252+
// rather than whether anything was wrong. CI has no store and skips, so the
253+
// assertion never ran where a regression would land.
254+
//
255+
// The two shapes behind a drop — no cwd in any record, and a cwd that only
256+
// appears in a record past the per-line cap — are pinned by construction in
257+
// fixture_corpus_test.go, which runs everywhere.
252258
if ratio := float64(len(found)) / float64(transcripts); ratio < 0.85 {
253-
t.Errorf("indexed %d of %d real transcripts (%.0f%%) — too many are being "+
254-
"dropped; check defaultHeadLimit.MaxBytes and the record shape",
259+
t.Logf("indexed %d of %d real transcripts (%.0f%%) in the live store. A low ratio here is "+
260+
"worth looking at by hand: the known-legitimate exclusion is a session with no cwd in "+
261+
"any record, and the known defect is a cwd that only appears past defaultHeadLimit.MaxLineBytes",
255262
len(found), transcripts, ratio*100)
256263
}
257264
t.Logf("indexed %d of %d transcripts in the live store", len(found), transcripts)

‎internal/agentsessions/fixture_corpus_test.go‎

Lines changed: 120 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func fixtureEnv(t *testing.T, redirectVar string, dir string) Env {
2626
}
2727

2828
func TestTheClaudeCodeFixtureParsesEndToEnd(t *testing.T) {
29-
adapter := ClaudeCode(fixtureEnv(t, "CLAUDE_CONFIG_DIR", "claude-config"))
29+
adapter := ClaudeCode(fixtureEnv(t, "CLAUDE_CONFIG_DIR", "claude"))
3030

3131
found, err := adapter.Discover("")
3232
if err != nil {
@@ -55,7 +55,7 @@ func TestTheClaudeCodeFixtureParsesEndToEnd(t *testing.T) {
5555
}
5656

5757
func TestTheCodexFixtureParsesEndToEnd(t *testing.T) {
58-
adapter := Codex(fixtureEnv(t, "CODEX_HOME", "codex-home"))
58+
adapter := Codex(fixtureEnv(t, "CODEX_HOME", "codex"))
5959

6060
found, err := adapter.Discover("")
6161
if err != nil {
@@ -77,3 +77,121 @@ func TestTheCodexFixtureParsesEndToEnd(t *testing.T) {
7777
t.Fatal("Read produced no events from the Codex fixture")
7878
}
7979
}
80+
81+
// WHY THESE FIXTURES EXIST. The TestTheReal*CorpusStillParses tests below assert
82+
// STATISTICS over whatever store the machine running them happens to have, and
83+
// that is not a property of this package. The same code reported "44 of 44
84+
// rollouts, 43 with a model" and "360 of 367 transcripts" here while a reviewer
85+
// with a smaller store got "0 with a model" and "15 of 21 (71%)" and a red
86+
// build. Green for CI, red for the contributor, and the shapes that actually
87+
// caused it were never written down anywhere a test could find them.
88+
//
89+
// These pin the two shapes by construction, so the behaviour is checked on every
90+
// machine and a change to it fails here rather than in a reviewer's terminal.
91+
92+
// A SESSION WITH NO cwd ANYWHERE IS NOT INDEXABLE, and that is correct. cwd is
93+
// only ever carried by user, attachment and system records; the preamble types
94+
// (queue-operation, last-prompt, mode, permission-mode, bridge-session) never
95+
// carry it. A transcript that never reached its first user turn therefore has no
96+
// workspace to bind to, and a picker row for it could not be resumed anywhere.
97+
//
98+
// This is the whole of the gap on the machine this was written on: all 7 of the
99+
// 367 unindexed transcripts were single-record bridge-session stubs.
100+
func TestASessionWithNoWorkspaceIsNotIndexed(t *testing.T) {
101+
adapter := ClaudeCode(fixtureEnv(t, "CLAUDE_CONFIG_DIR", "drops"))
102+
found, err := adapter.Discover("")
103+
if err != nil {
104+
t.Fatal(err)
105+
}
106+
indexed := map[string]ForeignSession{}
107+
for _, session := range found {
108+
indexed[session.ID] = session
109+
}
110+
for _, id := range []string{"bridge", "preamble"} {
111+
if session, listed := indexed[id]; listed {
112+
t.Errorf("%q has no cwd in any record but was indexed as %+v — the picker would offer a session that cannot be resumed", id, session)
113+
}
114+
}
115+
// THE CONTROL, so the two assertions above cannot pass because the whole
116+
// fixture store failed to load and nothing was indexed at all.
117+
good, listed := indexed["good"]
118+
if !listed {
119+
t.Fatalf("the control session was not indexed; the drop assertions above prove nothing. Indexed: %v", found)
120+
}
121+
if good.Cwd != "/w" || good.Title == "" || good.ModelID == "" {
122+
t.Errorf("the control session lost a field the CLI prints: %+v", good)
123+
}
124+
}
125+
126+
// THE cwd-BEARING RECORD IS SUBJECT TO THE PER-LINE CAP, and a session whose
127+
// only cwd sits in a record longer than MaxLineBytes is dropped exactly like a
128+
// stub above — same verdict, different cause, and nothing distinguishes them in
129+
// the output. readBoundedLine keeps the first MaxLineBytes of an overlong record
130+
// and the truncated JSON then fails to parse, so the record is skipped whole.
131+
//
132+
// This is not hypothetical on a real corpus. On the machine this was written on
133+
// the opening user record is already over the cap in 30 of 367 transcripts, and
134+
// 73 of the 360 indexed sessions take their cwd from a following attachment
135+
// record rather than from the user record that should have supplied it. Those
136+
// survive only because Claude Code happens to write a small attachment next. One
137+
// that does not would vanish, and would look like a legitimate stub.
138+
func TestAWorkspaceInAnOverlongRecordIsStillFound(t *testing.T) {
139+
adapter := ClaudeCode(fixtureEnv(t, "CLAUDE_CONFIG_DIR", "drops"))
140+
found, err := adapter.Discover("")
141+
if err != nil {
142+
t.Fatal(err)
143+
}
144+
var longcwd *ForeignSession
145+
for i := range found {
146+
if found[i].ID == "longcwd" {
147+
longcwd = &found[i]
148+
}
149+
}
150+
if longcwd == nil {
151+
t.Fatalf("a session whose cwd record fits the real per-line cap was dropped. Indexed: %v", found)
152+
}
153+
if longcwd.Cwd != "/w" {
154+
t.Errorf("longcwd indexed with Cwd %q, want /w", longcwd.Cwd)
155+
}
156+
}
157+
158+
// turn_context IS THE ONLY RECORD CARRYING THE MODEL, and it is not always near
159+
// the top. session_meta has no "model" key at all — enumerated across a real
160+
// 44-rollout store, only turn_context does — so a rollout whose turn_context
161+
// falls outside the bounded head scan indexes with an empty ModelID. This is the
162+
// shape behind a reviewer's "2 titled, 0 with a model": their rollouts had it
163+
// late, the ones here have it at line 4-8.
164+
//
165+
// The session is still listed, titled, addressable and importable; only the
166+
// model label is missing. That is the intended trade — Discover walks the entire
167+
// date-partitioned store on every picker open and must stay cheap — so this test
168+
// pins the CURRENT behaviour rather than asserting the model is recovered. If
169+
// the index is ever taught to recover it, this test should fail and be updated
170+
// deliberately, not silently drift.
171+
func TestARolloutWithALateTurnContextIndexesWithoutAModel(t *testing.T) {
172+
adapter := Codex(fixtureEnv(t, "CODEX_HOME", "codex-late"))
173+
found, err := adapter.Discover("")
174+
if err != nil {
175+
t.Fatal(err)
176+
}
177+
if len(found) != 1 {
178+
t.Fatalf("expected exactly the one late-turn_context rollout, got %d: %v", len(found), found)
179+
}
180+
session := found[0]
181+
// The session is NOT lost — that is the part that matters.
182+
if session.Cwd == "" {
183+
t.Errorf("a rollout with a late turn_context lost its workspace too: %+v", session)
184+
}
185+
if session.ModelID != "" {
186+
t.Errorf("ModelID is %q; the head scan is not supposed to reach a turn_context past the line budget. "+
187+
"If the index was deliberately taught to recover it, update this test and the comment above it.", session.ModelID)
188+
}
189+
// And it still imports, which is what "not lost" has to mean in practice.
190+
events, err := adapter.Read(session.ID, ReadOptions{})
191+
if err != nil {
192+
t.Fatalf("a rollout indexed without a model failed to import: %v", err)
193+
}
194+
if len(events) == 0 {
195+
t.Error("the late-turn_context rollout imported no events")
196+
}
197+
}

internal/agentsessions/testdata/claude-config/projects/-Users-example-workspace-demo/fixture-session.jsonl renamed to internal/agentsessions/testdata/claude/projects/-Users-example-workspace-demo/fixture-session.jsonl

File renamed without changes.
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
{"type": "session_meta", "payload": {"id": "00000000-0000-4000-8000-000000000002", "cwd": "/w", "timestamp": "2026-08-01T10:00:00Z"}}
2+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 0"}]}}
3+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 1"}]}}
4+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 2"}]}}
5+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 3"}]}}
6+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 4"}]}}
7+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 5"}]}}
8+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 6"}]}}
9+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 7"}]}}
10+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 8"}]}}
11+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 9"}]}}
12+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 10"}]}}
13+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 11"}]}}
14+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 12"}]}}
15+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 13"}]}}
16+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 14"}]}}
17+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 15"}]}}
18+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 16"}]}}
19+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 17"}]}}
20+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 18"}]}}
21+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 19"}]}}
22+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 20"}]}}
23+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 21"}]}}
24+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 22"}]}}
25+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 23"}]}}
26+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 24"}]}}
27+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 25"}]}}
28+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 26"}]}}
29+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 27"}]}}
30+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 28"}]}}
31+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 29"}]}}
32+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 30"}]}}
33+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 31"}]}}
34+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 32"}]}}
35+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 33"}]}}
36+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 34"}]}}
37+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 35"}]}}
38+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 36"}]}}
39+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 37"}]}}
40+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 38"}]}}
41+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 39"}]}}
42+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 40"}]}}
43+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 41"}]}}
44+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 42"}]}}
45+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 43"}]}}
46+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 44"}]}}
47+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 45"}]}}
48+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 46"}]}}
49+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 47"}]}}
50+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 48"}]}}
51+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 49"}]}}
52+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 50"}]}}
53+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 51"}]}}
54+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 52"}]}}
55+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 53"}]}}
56+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 54"}]}}
57+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 55"}]}}
58+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 56"}]}}
59+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 57"}]}}
60+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 58"}]}}
61+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 59"}]}}
62+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 60"}]}}
63+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 61"}]}}
64+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 62"}]}}
65+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 63"}]}}
66+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 64"}]}}
67+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 65"}]}}
68+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 66"}]}}
69+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 67"}]}}
70+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 68"}]}}
71+
{"type": "response_item", "payload": {"type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "step 69"}]}}
72+
{"type": "turn_context", "payload": {"model": "gpt-5.6-sol", "cwd": "/w"}}

internal/agentsessions/testdata/codex-home/sessions/2026/08/01/rollout-2026-08-01T10-00-00-fixture0-0000-0000-0000-000000000001.jsonl renamed to internal/agentsessions/testdata/codex/sessions/2026/08/01/rollout-00000000-0000-4000-8000-000000000001.jsonl

File renamed without changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"type":"bridge-session","sessionId":"b0000000-0000-4000-8000-000000000001","bridgeSessionId":"bridge_01","lastSequenceNum":0}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{"type":"queue-operation","timestamp":"2026-01-01T00:00:00Z"}
2+
{"type":"user","cwd":"/w","timestamp":"2026-01-01T00:00:01Z","message":{"role":"user","model":"m","content":"port the parser"}}

0 commit comments

Comments
 (0)