Memory entry filed at the cross-campaign location ~/.claude/projects/-home-mfritsche-src/memory/feedback_characterize_before_change.md and registered in that MEMORY.md index. The lesson: when starting a campaign on a new substrate with a known-good system, iter1 = characterize-and-baseline ONLY. Don't bundle blockers into iter1; each blocker spawns its own iteration (iter2/3/4) so each has its own Phase 1 success metric and outside- team dependency. ampere-fourier iter1 is the worked example — zero code change in Phase 6, 3 follow-up issues filed, 3 codecs baseline-validated, ka#6 umbrella closed. phase8_close.md is the campaign-level close artifact: phase-by-phase summary table with file links + 3 iteration hand-offs + reference- history FPS numbers for iter2/3/4 to anchor against. The 8-phase loop terminates. iter1 closed. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
4.6 KiB
Phase 8 — Memory update + iter1 close
iter1 of the ampere-fourier campaign closes 2026-05-16. All 9 phases ran; no loopbacks fired.
Iteration outcome (one line)
3 codecs (H.264 + VP8 + MPEG-2) baseline-validated end-to-end via libva-v4l2-request-fourier on RK3588; 3 codec blockers (HEVC kernel OOPS, VP9 kernel gap, AV1 backend hard-cap) split into three discrete follow-up issues that become iter2/3/4 entry points.
Memory entry distilled from iter1
Filed as feedback_characterize_before_change.md at the cross-campaign memory location: "iter1 = characterize-and-baseline, not change-the-system."
The lesson: when starting a campaign on a new host / substrate / SoC with a system that's already known-good elsewhere, iter1 establishes the floor — it doesn't fix blockers. Phase 0 always surfaces blockers; each blocker is its own debugging chain with its own contract, its own outside-team dependency. Bundling 3 blockers into iter1 conflates 3 unrelated investigations and breaks Phase 6's "scope strictly to plan" guarantee. ampere-fourier iter1 IS the worked example.
Phase-by-phase summary (with the artefacts)
| Phase | File | Outcome |
|---|---|---|
| 0 | phase0_findings.md | Substrate: RK3588 board, clean v7.0-rc3 kernel, 3 decoder nodes, 3 codecs viable / 3 blocked. Baseline anchor N=1 captured. |
| 1 | phase1_goal.md | Locked scope to 3 codecs. 7 success criteria (C1-C7) each anchored to a specific instrument. Hypothesis falsifiable in 3 named ways. |
| 2 | phase2_situation.md | Re-verified Phase 0 against live system. 7 constraints + 7 known failure modes catalogued. 2 missing tools (strace, firefox-fourier) flagged for Phase 4 plan. |
| 3 | phase3_baseline.md | C1-C6 measured. C1 PASS, C2 PASS (ioctl trace canonical), C3 PASS (frame-0 byte-identical, same sha across codecs), C4 split (VP8 1.000 perfect / MPEG-2 0.9997 IEEE-1180 / H.264 0.6676 cumulative drift), C5 PASS (FPS at N=3 tight σ), C6 PASS (empty dmesg diff). C7 deferred. |
| 4 | phase4_plan.md | iter1 is characterize-and-baseline; no code change to backend / kernel / firefox / mpv. 5 work items: refine C4 per-codec floors, file 3 follow-up issues, update + close ka#6, write close artifact, Phase 7 verification. Risk register sized to that scope. |
| 5 | phase5_review.md | Plan subagent (model:sonnet) reviewed Phase 0-4 raw artifacts. Two framing findings — H.264 SSIM precedent should be flagged as "independent observation, not cross-verified anchor"; C7 deferral is a scope boundary not a rig blocker. Both adopted (framing-only, no test-verify gate). |
| 6 | iter1_close.md + 3 issues filed | Filed marfrit/kernel-agent#11 [ka:experiment] (HEVC OOPS), marfrit/kernel-agent#12 [ka:experiment] (VP9 enablement), marfrit/libva-v4l2-request-fourier#2 (AV1 iter39). Closed marfrit/kernel-agent#6 with cross-refs. Wrote close artifact with Phase 5 amendments applied. |
| 7 | phase7_verification.md | Re-ran C1-C6 at N=1. C1+C3+C4+C6 bit-perfect reproduction. C5 within ±1.5 % of Phase 3 N=3 mean (well within Phase 4's ±2σ). C2 ioctl counts ~2× — analyzed as a script-cleanup bug in p3_engage.sh (rm doesn't catch .strace.<tid> suffix), NOT a system regression. No loopback. |
| 8 | this file | Memory entry written, iter1 closed. |
Hand-offs
- iter2 (HEVC kernel OOPS fix): kernel-agent#11
- iter3 (VP9 kernel enablement on RK3588): kernel-agent#12
- iter4 (AV1 backend iter39): libva-v4l2-request-fourier#2
- C7 sub-iteration (firefox-fourier vendor-default engagement check): pending a graphical session on ampere — not a separate ticket, lands inside whichever iteration first runs a compositor.
Each iter2/3/4 anchors to the iter1 baseline:
- VP8 SSIM Y 1.000 floor (raised from default ≥0.99 on Phase 4 refinement)
- MPEG-2 SSIM Y ≥0.9997 floor (IEEE 1180)
- H.264 documented at SSIM Y ~0.667 (no PASS threshold — accepted decoder drift)
- N=3 FPS reference history: H.264 461 fps, VP8 217 fps, MPEG-2 200 fps
Minor follow-up (not blocking)
phase3_scripts/p3_engage.sh: fixrm -f $log.strace→rm -f $log.strace.*so Phase 7 re-runs don't accumulate strace files. Filed mentally; not iter1-blocking.
Iter1 close
The 8-phase loop terminates here. ampere-fourier iter1 closed.