Headline this week is a new authorship notes backend built for massive monorepos. refs/notes/ai works great at most scales, but on repos landing ~1k commits/hour the fetch-merge-push cycle can lose to contention and some users' notes pushes get dropped. The new HTTP backend swaps in a commit-addressable key-value store with a local SQLite cache and async daemon flush — fully opt-in, no change for existing users.
We also extended transcript capture to subagents, finished migrating Codex hooks to inline TOML, and added a batch of new attributes on metric events for downstream analytics.
- HTTP notes backend (opt-in) — set
notes_backend.kind = "http" in ~/.git-ai/config.json to swap refs/notes/ai for a commit-addressable HTTP store. git push no longer touches the notes ref, reads are local-first via SQLite, and git pull pre-warms the cache for up to 500 commits behind new tips.
git ai notes migrate — bulk-uploads existing refs/notes/ai content for repos moving onto the HTTP backend.
- Transparent everywhere else —
log, blame, diff, show, search, rebase/amend, virtual attribution, range authorship, and stats all route through a single notes_api module that dispatches by backend kind.
Building on last week's transcript streaming rewrite, this week was about getting more signal out of long-running sessions without a performance or memory hit.
- Incremental reads with byte-offset watermarks — the new
CopilotCliAgent (and the streaming pipeline more broadly) tracks where it last left off in each transcript file and only reads new bytes on each sweep, instead of re-parsing the whole file. Flat memory and near-constant CPU even on multi-hour sessions.
- Subagent transcript sweep — when a Claude checkpoint fires, the transcript worker discovers and enqueues any subagent transcripts under the session's
subagents/ directory, linking them via external_parent_session_id. Full agent trees reconstruct end-to-end without re-walking everything on every checkpoint.
- Per-event timestamps for every agent — agents now provide a concrete
u32 timestamp per transcript event instead of falling back to SystemTime::now(), fixing ordering bugs in mixed-agent sessions and removing a wall-clock dependency from the hot path.
- Inline TOML hooks — migrated Codex from the deprecated
hooks.json to inline [[hooks.PreToolUse]] in config.toml, and from codex_hooks to hooks under [features]. Existing hooks.json entries are cleaned up at install time.