The session-fixture-layout gate requires every session JSONL fixture in
the canonical packed layout (maximal delta runs per kind/block, as
migrate:packed-session-fixtures rewrites); the packChunks: false knob
violated that invariant and failed the snapshot job. Revert the knob and
canonicalize the recorded fixture instead: the live log's
eager-drain-packed rows migrate to the maximal-run layout a burst replay
reproduces, so the fixture stays replay-deterministic and canonical.
The scenario previously carried an authored fixture; W4 of #1119 review
requires a live transcript. Recording surfaced two composition bugs that
are fixed here alongside it:
- provider ids: the app and the replay catalog both named the old
'deepseek' provider, which no adapter registers; both now use
'deepseek-official'
- the live config lacked persistenceCompression: none, so record-mode
sessions were written zstd-compressed and could not be harvested
(the snapshot twin already forced plaintext)
Recorded logs also need deterministic replay:
- packChunks: false in both configs — the eager-drain batch boundaries
that split packed delta runs are timing-dependent, so a packed log of
a long reasoning stream cannot replay-match its live record
- the fixture's request/header config and request/context are normalized
to the replay-produced minimal shape (the live adapter logs model
capabilities llm-replay has no data for), and tool-result path
separators are canonicalized to '/' for the Linux golden
posixOnly is restored now that the fixture is recorded.
glob/grep now run the @vscode/ripgrep binary via ctx.subprocess with a plain
argv vector: no system rg install, no shell layer, unconditional registration.
The load-time command -v rg probe and the bash-seam coupling are removed;
timeouts ride the cooperative exec.signal plus the seam's terminate
escalation. The fs-glob-sampling ACP snapshot executes the real packaged
binary against an mtime-pinned fixture. Adds the packaged-ripgrep-search
Agent Note, updates the roster-note facts and both shipped-composition e2es,
and regenerates the doc catalogs and third-party notices (surfacing
pre-existing manifest drift plus the new @vscode/ripgrep row; the notices
generator also learns pnpm 11's truncated virtual-store names).
Resolve the agent-loop import conflict by retaining both durable request context and runtime policy context. Refresh the combined session fixtures and regenerate documentation catalogs. Mark PDF artifacts as binary so staged whitespace checks do not parse PDF bytes as text.
The master merge left docs/event-producer-consumer.md stale (regenerated) and
the master-introduced fs-glob-sampling scenario now carries the search-card
`meta` this branch projects from glob (refreshed golden).
The merge combined ReadResultView (this branch) and WebResultView (master)
into ToolResultView; refresh cordis-inspect-jsdoc for the merged union and
workspace-context for the read window offset now in persisted meta.
- Add a search result-view scenario to the TUI tool-card test so the
card:'search' fallback branch (no view content -> raw result content) is
covered; restores transcript.ts branch coverage to 100%.
- Refresh the cordis-inspect-jsdoc golden for the kind -> shape rename in the
ToolResultView JSDoc that cordis_inspect echoes.
An empty read window (byte cap below the first selected line: `lines: []`
with `totalLines > 0`) dropped `offset` from the persisted presentation
meta, so a replayed read card could not report where the window starts or
where a continuation resumes. Carry `offset` on `FsReadMeta`,
`ReadResultView`, and the `presentationMeta` projection, and validate it in
`readMetaFromMeta` (1-based integer; the first line number may not fall
below it). Re-record the ACP fixtures and the cordis api catalog.
Also correct the Note's `parallel-file-reads` golden path
(examples/tui-agent -> apps/cli) and record the pre-card replay-degradation
tradeoff in the Decision section.
The rename to deepseek-official reached cordis.snapshot.yml but not its
persistent-tools sibling, so the replay catalog no longer owned the route the
agent asks for. The SDK server then mounted the real adapter, which failed the
turn on a missing key. Re-records the six transcripts and the two diagnostics
cards that still carried the old route name.
Address the code-review bot findings on the web result card:
- web_fetch's card truncated now derives from the shared renderFetchOutput
helper, matching the effective truncation the model-facing text reflects
(provider cap, source cut, or output cap), instead of the provider-only flag.
- Drop the redundant content copy from both web result views; a UI without the
web capability falls back to the raw tool/result content. Narrow the TUI
transcript view.content access accordingly.
- Set the result-state title from the call args (query/url) so a window-
truncated replay keeps a title.
- Project meta from the seam result types rather than hand-rolled value types.
- Sync the card vocabulary across core tools README, docs/core-data-structures,
the adding-a-tool cookbook, and the tool-web package README (both languages,
re-recorded pairings); regenerate the cordis api-catalog and cordis-inspect
snapshot; revise the Agent Note.
web_fetch now projects presentationMeta ({url, statusCode, truncated}) onto its
tool/result, so the web-fetch scenario carries that meta; cordis-inspect-jsdoc
shifts with the widened ToolResultView type surface. Model-facing text is
unchanged. Refreshed keyless.
The read tool now projects presentationMeta ({path, lines, totalLines}) onto
its tool/result, so every scenario with a read call carries that meta; the
cordis-inspect snapshot's embedded type surface gains ReadResultView /
ReadFileLine / the widened ToolResultView. Model-facing text is unchanged.
Refreshed keyless via test:snapshot:refresh. The unrelated goal.snapshot
SQLite ExperimentalWarning failure is pre-existing on clean master.