ADR-0036: Tiny-AI Wave 1 scope expanded beyond D20–D23¶
- Status: Superseded by ADR-0107
- Date: 2026-04-17
- Deciders: Lusoris, Claude (Anthropic)
- Tags: ai, dnn, cli, framework, mcp
Context¶
ADR-0020 through ADR-0023 locked the four tiny-AI capabilities and their user surfaces at an abstract level, but did not specify which checkpoints ship in Wave 1 or which encoder-side hooks are in scope. The user directed a broader Wave 1: "blow the shit out of the tinyai topic... thats a great function".
Decision¶
Wave 1 adds, beyond ADR-0020–0023: (a) ship baseline checkpoints for C1/C2/C3 into model/tiny/ (today empty); (b) LPIPS-SqueezeNet (~2.5M) as externally-validated FR baseline, exposed as a new libvmaf feature extractor; (c) MobileSal saliency (~2.5M) feeding both a saliency-weighted VMAF variant (scoring side) and a per-CTU QP-offset ROI map (tools/vmaf-roi, encoder side); (d) TransNet V2 (~1M) shot boundaries + per-shot CRF predictor CLI (tools/vmaf-perShot) emitting an encoder-ingestible sidecar. Encoder-side hooks: extend vmaf_pre from luma-8bit to 10-bit + chroma; add new vmaf_post ffmpeg filter for post-reconstruction NR scoring; FastDVDnet temporal pre-filter (~2.5M, 5-frame window) — deferred if Wave 1 is too wide but still in-scope. Op-allowlist expansion: whitelist Loop and If with a bounded-iteration guard (reject unbounded trip_count, default cap 1024) — unlocks MUSIQ attention, RAFT optical flow, small VLMs. Scan stays rejected. MCP surface: new describe_worst_frames tool that runs a local VLM (SmolVLM ~256M, Moondream2 1.8B Q4 fallback) on N worst-VMAF-delta frames and returns plain-English artifact descriptions. Full roadmap: docs/ai/roadmap.md.
Alternatives considered¶
| Option | Pros | Cons | Why not chosen |
|---|---|---|---|
| Ship baseline C1/C2/C3 checkpoints only | Small scope; bisectable | Does not honor user's "blow it out" directive; encoder-side stays untouched | Rejected |
| Expand Wave 1 (chosen) | Each added model <3M params, shares ORT infra, marginal cost low | Op-allowlist must expand | Rationale matches |
Rationale note: narrow option rejected because (a) user explicitly asked to go wide, (b) every model is tiny and shares infra, (c) encoder-side work needs the same allowlist + tensor-I/O extensions, so splitting across waves duplicates infra changes. Loop/If allowlist expansion is the single largest risk, mitigated by the bounded-iteration guard. describe_worst_frames is intentionally last-priority — debugging affordance, not critical scoring path.
Consequences¶
- Positive: Wave 1 delivers LPIPS / saliency / shot-boundary / NR / encoder-side hooks together.
- Negative: larger PR footprint; op-allowlist must admit Loop/If safely.
- Neutral / follow-ups: ADR-0039 (runtime op walk), ADR-0040 (multi-input API), ADR-0041 (LPIPS extractor), ADR-0042 (docs rule) all descend from this expansion.
References¶
- Source:
req(user: "blow the shit out of the tinyai topic... thats a great function" + popup answers + "well yeah, thats an adr, I allow it") - Related ADRs: ADR-0020, ADR-0023, ADR-0039, ADR-0040, ADR-0041, ADR-0042