Skip to content

feat: Streaming Diff Oven — port of #5 onto main (agent-agnostic)#8

Open
apresmoi wants to merge 9 commits into
mainfrom
feat/streaming-diff-core
Open

feat: Streaming Diff Oven — port of #5 onto main (agent-agnostic)#8
apresmoi wants to merge 9 commits into
mainfrom
feat/streaming-diff-core

Conversation

@apresmoi

@apresmoi apresmoi commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

Builds on @alowpoly's #5 (their Streaming Diff Oven) and the design we worked out together in that thread — this ports those concepts onto current main's oven framework and makes capture agent-agnostic (Codex and Claude Code).

Opened as a separate PR only because #5's branch is ~48 commits behind on the old layout, so it can't take these commits without a destructive rebase. This is #5's concepts on current main, co-authored with @alowpoly. @alowpoly — please review; happy for this to supersede #5, or to fold in however you prefer.

What it does

Watch an agent edit your repo, live. As the agent runs file-mutating tools, hooks bracket each call and publish a timestamped, session-scoped diff feed to git-ignored .local/; the dashboard streams it over SSE.

agent edit �� hook (pre/post) �� burnlist streaming-diff capture �� .local feed (immutable @2 cards + atomic manifest)
                                        �  CLI writes, no HTTP, no token
                                        �
                    dashboard server � polls manifest �� SSE �� browser (diff cards)

Design decisions (vs #5)

  • No tokens â�� the CLI writes .local/ atomically; the dashboard is a strict read-only observer (self-heal/pruning live only in the CLI writer path).
  • Preâ��post snapshot diff, not git diff HEAD â�� the pre-hook snapshots the hinted files, post diffs against that, so pre-existing dirty-tree changes are never misattributed to the tool.
  • URL-addressed streaming â�� no manual tab-attach; open the oven â�� recent-feeds list â�� open a feed. Reconnect via native Last-Event-ID.
  • Honesty is structural â�� anything opaque/timed-out/truncated/denied/redacted/unavailable renders partial; the @2 contract rejects a captured card that contains withheld content. There is no exact claim for hook-based capture.
  • Content policy â�� deny-by-default: .env/keys/credentials/secret-looking/ignored/symlink-escape are hard-denied and never copied; secret patterns redacted before any write; capture covers tracked + non-ignored-untracked files (untracked resolved only within hinted paths).
  • Cut for scope â�� role/task roster deferred; Visual Parity stays its own oven; the watch fallback was dropped.

Layers (commit-by-commit)

  1. a9ea913 engine � @2 contract, capture core, LCS line diff, durable journal (atomic manifest + contiguous ring buffer + reconnect)
  2. 4f75ab8 wiring � ensure-feed + one-time binding, streaming-diff CLI, hash-based feed keys (case-insensitive-FS safe)
  3. 4a16d38 server � oven package + SSE handler (res-owning, heartbeat, subscriber caps, leak-free cleanup) + synthetic-event E2E
  4. f4a54ad renderer � StreamingDiff.tsx + EventSource client (text-only, XSS-safe)
  5. 1930da7 adapters � Codex/Claude hook adapters + burnlist hooks install/uninstall/status
  6. 003049a final review fixes

Install

burnlist hooks install --agent codex,claude   # merges into .codex/hooks.json + .claude/settings.json

Merge-never-clobber, exact-ownership uninstall, honest tracked-vs-untracked config modes. Hooks always exit 0 and can't block the agent (stdin-capped, bounded subprocesses); the agent still owns first-run execution consent.

Verification

npm run verify is green (354 tests, incl. HTTP/SSE integration + a socketless synthetic acceptance test that drives capture�journal�server�SSE). Built through an adversarial review loop; please poke holes, especially at: the pre�post attribution, the read-only-observer boundary, the content/redaction policy, and the Codex/Claude adapter payload mapping.

apresmoi and others added 6 commits July 15, 2026 13:05
Co-authored-by: Agustin Capeletto <174887634+alowpoly@users.noreply.github.com>
Co-authored-by: Agustin Capeletto <174887634+alowpoly@users.noreply.github.com>
Co-authored-by: Agustin Capeletto <174887634+alowpoly@users.noreply.github.com>
Co-authored-by: Agustin Capeletto <174887634+alowpoly@users.noreply.github.com>
Co-authored-by: Agustin Capeletto <174887634+alowpoly@users.noreply.github.com>
Co-authored-by: Agustin Capeletto <174887634+alowpoly@users.noreply.github.com>
@apresmoi apresmoi force-pushed the feat/streaming-diff-core branch from 003049a to 95ebf3d Compare July 15, 2026 11:05
@apresmoi apresmoi changed the title feat: Streaming Diff Oven (agent-agnostic, ported onto main) feat: Streaming Diff Oven — port of #5 onto main (agent-agnostic) Jul 15, 2026
apresmoi and others added 3 commits July 15, 2026 13:51
…nstall per review

Co-authored-by: Agustin Capeletto <174887634+alowpoly@users.noreply.github.com>
… binary consistency

Co-authored-by: Agustin Capeletto <174887634+alowpoly@users.noreply.github.com>
…e 18 CI)

Co-authored-by: Agustin Capeletto <174887634+alowpoly@users.noreply.github.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