docs(memory): split the frame pipeline out of ai.md into docs/ai

ai.md is the mandatory read every session; at 2,702 lines / ~64k tokens it
costs the whole subsystem history even when the task never touches it. This
is a verbatim move, not a compression - nothing is deleted and each stub is
written from the moved text.

- docs/ai/frame-pipeline.md: 'Frame cadence', 'Per-element composite timing +
  scene dump', 'What the first instrumented take said', 'Render budget',
  'Scene compositor' and 'Live frame pipeline', byte-identical, plus a short
  'Related in ai.md' footer and two stale 'below' pointers corrected.
- ai.md keeps two stubs carrying the invariants that must not be missed
  (overlay on every render path, VideoFrame.Epoch, StripPool threads,
  Release-only render numbers; arrival-stamped rawvideo, non-blocking submit,
  stop order, burned _outputIndex judge) and links the new file.
- docs/ai/index.md + docs/index.md route the split; schema.md inventory lists
  the new tier.
- 4 index-row references and 2 TASKS.md anchors repointed; ai.md's Services
  row too.

Measured: ai.md 63.6k -> 47.1k tokens, 2,702 -> 1,975 lines. Progressive
disclosure per schema.md convention 5. No source touched; no push.
This commit is contained in:
2026-10-26 10:25:21 -07:00
parent ef60f1f3b6
commit 804b1d2f5f
8 changed files with 881 additions and 774 deletions
+18
View File
@@ -0,0 +1,18 @@
# docs/ai — index
Subsystems split out of [`ai.md`](../../ai.md) (2026-10-26) so a session pays only for the
subsystem its task touches. The split is a **verbatim move**: history, traps and measurements are
unchanged, and `ai.md` keeps a short stub carrying the load-bearing invariants plus a link here, so
no rule is reachable only from a file you forgot to open.
Read the file whose row matches the task. There is no required reading order.
| File | Covers | Read when |
|------|--------|-----------|
| [`frame-pipeline.md`](frame-pipeline.md) | Render budget & measurement (`FrameCadence`, per-element composite timing, scene dump), `SceneCompositor` design + `StripPool`, and `FramePump` from scene snapshot to encoder (pacing, pool/paste caches, backpressure, teardown, health stats) | Touching the compositor, the render loop, per-frame cost, `Services/Encoder/*`, or debugging dropped/juddering frames |
## Split-out yet to come
The remaining `ai.md` blocks are being moved in staged units (capture, YouTube/alerts/auth, product,
UI patterns/theming, audio/recording/encoder). Add the row when the file lands; do not create empty
placeholders.