Skip to content

feat(recording): Session Recording slice 1 — recorder core + gate + funnel tap (#467) - #471

Merged
Juliusolsson05 merged 1 commit into
integration/rendering-pipelinefrom
feat/session-recording-slice1
Jul 7, 2026
Merged

Juliusolsson05 merged 1 commit into
integration/rendering-pipelinefrom
feat/session-recording-slice1

Conversation

@Juliusolsson05

Copy link
Copy Markdown
Owner

First slice of #467 (plan: docs/rendering/session-recording-plan-2026-07.md). Records; no replay yet.

Not yet (next slices): the budgeted debugRetention bucket (required before heavy use), the replay harness, redaction, the note command/UI.

6 recorder tests; full unit suite 399 passing (the one failing file is the pre-existing empty voice-dictation submodule test); both tsc gates clean.

🤖 Generated with Claude Code

…unnel tap (#467)

First slice of the continuous session recorder
(docs/rendering/session-recording-plan-2026-07.md). Produces per-recording
folders; no replay yet.

- Each recording is its OWN folder session-recordings/<recordingId>/ with
  meta.json + events.jsonl, so `rm -rf` one folder removes exactly one
  recording (the requested cleanup affordance).
- SessionRecorder clones GhostJournal's batched-drain writer and adds the
  two things a CONTINUOUS recorder needs that a per-turn ghost log did not
  (both #388-mandated): backpressure (queue cap + drop-oldest + counter)
  and a 128 MiB size cap + tombstone (cap, never rotate).
- SessionRecorderManager taps sendToMainWindow via a decoupled optional
  outbound observer (mainWindow.ts setOutboundObserver) — records the exact
  payloads the renderer receives, filtered to the 9 SessionFeed channels
  (explicit allowlist, NOT the session: prefix which also carries raw PTY).
  Tapping the funnel (not the ledger seam) is what lets replay reach
  fold-layer bugs like #469.
- Attach-Recording-Note plumbing (reserve-instant + fill-on-submit __note
  lines) lands in the recorder now; the command/UI is a later slice.
- Doubly gated: AGENT_CODE_DEV_DEBUG=1 AND AGENT_CODE_SESSION_RECORD=1
  (isSessionRecordingEnabled). The manager + observer are only constructed
  when gated on, so a normal build installs no observer and pays nothing.
  Flushed on before-quit beside ghostJournals.

NOT yet: retention bucket (next slice — required before heavy use),
replay harness, redaction, the note command/UI. 6 recorder tests; full
unit suite 399 passing; both tsc gates clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Juliusolsson05
Juliusolsson05 merged commit 1cdcca8 into integration/rendering-pipeline Jul 7, 2026
@Juliusolsson05
Juliusolsson05 deleted the feat/session-recording-slice1 branch July 7, 2026 21:51
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