| 1 | # v0.9.2 real-session media plan (#4906) |
| 2 | |
| 3 | > **Status: pending the dogfood recording.** The site renders a visible |
| 4 | > "recording pending release candidate" state (`web/lib/media-manifest.ts` → |
| 5 | > `first-fleet-session`, rendered by `web/components/session-media.tsx` on |
| 6 | > `/docs/guide`). No placeholder, staged, or recycled footage ships. This file |
| 7 | > is the exact procedure for producing the real assets once the v0.9.2 release |
| 8 | > candidate is stable and dogfooded, and the checklist for flipping the |
| 9 | > manifest entry to `published`. It authorizes local recording only — never a |
| 10 | > deploy, tag, or publication. |
| 11 | |
| 12 | ## What gets recorded |
| 13 | |
| 14 | One continuous real session of the v0.9.2 release candidate, on a **sealed |
| 15 | local route** (loopback Ollama, exactly like the canonical screenshot in |
| 16 | `docs/public-surface-facts.json` → `screenshot.capture`; no paid or hosted |
| 17 | provider, no live account): |
| 18 | |
| 19 | 1. Install / launch: `codewhale` in a scratch repository. |
| 20 | 2. First keyless session: constitution-first setup, then a read-only Plan-mode |
| 21 | exploration. |
| 22 | 3. Provider connection: configure the local Ollama route (provider · model · |
| 23 | reasoning tier visible). |
| 24 | 4. One Fleet workflow: `codewhale fleet init`, a small `fleet run`, and the |
| 25 | receipt at the end. |
| 26 | |
| 27 | Terminal: **120×32**, **Blue Stage dark** theme — identical to the screenshot |
| 28 | contract so the moving and still surfaces read as one product. |
| 29 | |
| 30 | ## Recording procedure (post-dogfood, exact commands) |
| 31 | |
| 32 | Prerequisite: the candidate has passed the local dogfood install per the |
| 33 | release ledger (`scripts/release/install-dogfood.sh`). Seal the environment — |
| 34 | never record against a real home directory or live credentials: |
| 35 | |
| 36 | ```sh |
| 37 | # 1. Sealed scratch environment |
| 38 | export CW_MEDIA_HOME="$(mktemp -d)" |
| 39 | mkdir -p "$CW_MEDIA_HOME/.codewhale" /tmp/cw-media-demo && cd /tmp/cw-media-demo |
| 40 | HOME="$CW_MEDIA_HOME" CODEWHALE_HOME="$CW_MEDIA_HOME/.codewhale" \ |
| 41 | env -u DEEPSEEK_API_KEY \ |
| 42 | tmux new-session -d -s cw-media -x 120 -y 32 |
| 43 | |
| 44 | # 2. Start the local inference route (separate shell) |
| 45 | ollama serve & # loopback only; model pulled in advance, e.g. `ollama pull <model>` |
| 46 | |
| 47 | # 3. Record with VHS (same tool as the canonical screenshot) |
| 48 | # Write the tape to docs/evidence/v092-first-fleet-session.tape, replaying |
| 49 | # the four beats above, then: |
| 50 | vhs docs/evidence/v092-first-fleet-session.tape |
| 51 | # → produces the GIF fallback |
| 52 | |
| 53 | # 4. Derivatives |
| 54 | ffmpeg -i first-fleet-session.gif -movflags +faststart -pix_fmt yuv420p \ |
| 55 | -vf "scale=1280:720" -an web/public/media/first-fleet-session.mp4 |
| 56 | ffmpeg -i first-fleet-session.gif -frames:v 1 \ |
| 57 | web/public/media/first-fleet-session.png # poster frame |
| 58 | cp first-fleet-session.gif web/public/media/first-fleet-session.gif |
| 59 | ``` |
| 60 | |
| 61 | Then hand-write the caption tracks and transcript from the actual recording |
| 62 | (never auto-generated filler): |
| 63 | |
| 64 | - `web/public/media/first-fleet-session.en.vtt` and |
| 65 | `web/public/media/first-fleet-session.zh.vtt` — WebVTT, one cue per beat. |
| 66 | - `docs/evidence/v092-first-fleet-session-transcript.md` — the full command |
| 67 | and receipt transcript, with the same evidence-standard header as |
| 68 | `docs/evidence/v091-empty-work-surface-receipt.md`. |
| 69 | |
| 70 | ## Acceptance checklist (flip `status` to `published` only when every box is true) |
| 71 | |
| 72 | - [ ] Recorded from the **exact release-candidate SHA** named in the v0.9.2 |
| 73 | completion ledger, after `install-dogfood.sh`, in a sealed |
| 74 | `HOME`/`CODEWHALE_HOME`. |
| 75 | - [ ] Sealed local route only — no hosted provider, no account, no credentials |
| 76 | visible anywhere in the footage. |
| 77 | - [ ] Poster is a real frame of the recording, PNG, **1280×720**, ≤ **500 KB** |
| 78 | (`MEDIA_BUDGETS.poster`). |
| 79 | - [ ] Video is **1280×720**, ≤ **120 s**, ≤ **10 MB** (`MEDIA_BUDGETS.video`). |
| 80 | - [ ] GIF fallback ≤ **6 MB** (`MEDIA_BUDGETS.gifFallback`); it is offered as |
| 81 | a download link, not described as a static reduced-motion substitute. |
| 82 | - [ ] Captions: `en` and `zh` WebVTT tracks, non-empty, cues match the actual |
| 83 | session beats. |
| 84 | - [ ] Transcript committed under `docs/evidence/` and referenced from the |
| 85 | manifest entry. |
| 86 | - [ ] `web/lib/media-manifest.ts`: set `status: "published"` and fill `poster`, |
| 87 | `video` (with measured `durationSeconds`), `captions`, `gifFallback`, |
| 88 | `transcript`. No other manifest change. |
| 89 | - [ ] Web gates green locally: |
| 90 | `npm ci && npm run prebuild && npm run check:facts && npm run check:docs && npm test && npm run lint && npm run build` |
| 91 | (the media-manifest test checks file presence/bytes and PNG poster |
| 92 | dimensions; verify actual video dimensions/duration here with media |
| 93 | inspection before changing the manifest status). |
| 94 | - [ ] README GIF swap (same recording) is a **separate** commit updating |
| 95 | `docs/public-surface-facts.json` provenance — not part of this flip. |
| 96 | - [ ] **No deploy.** `app.codewhale.net`/codewhale.net deployment stays |
| 97 | manual-dispatch and Hunter-gated per the release ledger. |
| 98 | |
| 99 | ## Sign-off |
| 100 | |
| 101 | Recording, checklist, and manifest flip are maintainer-verified (Hunter) |
| 102 | before the entry ships. The pending state on the site is correct until then. |
| 103 |