# MyMistakes.md > **Two jobs**, distinguished by heading: > > 1. **Per-task failure log** β€” updated before every commit touching that task: > current iteration + why the last one failed. On task complete, committed AND > pushed β†’ truncate to this stub. A new task does NOT seed this file until its > first failure. > 2. **Recipes registry** (DERIVED-SOLUTION RULE, see `AGENTS.md` πŸ”¬) β€” the durable > home for one-off derived solutions, recipes, and how-tos. The moment you work > out a reusable solution, write it here **in the same session**. GREP THIS FILE > FIRST when you hit a "I've done this before but have to figure it out again" > wall. Recipe entries stay permanently (they are NOT truncated on task > completion) β€” only the failure log truncates. ## πŸ”¬ Recipes registry ### Shrink / re-encode an image for the README (screenshots β†’ small hero image) Worked out 2026-08-29 (the recipe was NEVER recorded the first time it was done, so it had to be re-derived from scratch β€” that's the incident this entry exists to end). **Approach:** a throwaway Windows-dotnet console app uses WPF's imaging stack (`System.Windows.Media.Imaging`) β€” same framework the app runs on, zero NuGet packages, high-quality downscale via `TransformedBitmap`. Screenshots compress **far smaller as JPEG than PNG** (PNG 1400px = ~1.2MB; JPEG q82 1400px = ~188KB). **Recipe (run via the Windows dotnet host from WSL):** 1. Create `imgresize.csproj` targeting `net8.0-windows` with `true` (SDK controller). Put it in a Windows-visible temp path, e.g. `C:\Users\gramp\AppData\Local\Temp\imgresize` β€” NOT `/tmp` (Windows dotnet can't reach a Linux-only path reliably). 2. `Program.cs`: load `BitmapImage` (`CacheOption=OnLoad` β†’ `Freeze()`), downscale with `TransformedBitmap(src, new ScaleTransform(scale, scale))` to max width (1400 for the README hero), encode with `JpegBitmapEncoder { QualityLevel = 82 }`, save. 3. Run: ```bash "/mnt/c/Program Files/dotnet/dotnet.exe" run -c Release --project . -- "C:\Users\gramp\Downloads\Screenshot 2026-08-29 075626.png" "C:\Users\gramp\Documents\Code\projects\ytLive\docs\ytLlive-preview.jpg" 1400 ``` 4. Point `README.md` at the `.jpg` (not `.png`). **Result:** 3.2MB screenshot β†’ 1400Γ—794 β†’ **188KB** `ytLlive-preview.jpg` in `docs/`. --- ## Splitting a large file into partials β€” NEVER `awk … > SRC` while awking SRC (2026-08-31, Commit D) Tried to split `SocialsDialogViewModel.cs` in one line: `{ awk '…' SRC; echo ""; awk '…2…' SRC; } > SRC`. The **first write truncated SRC to 1 line**, so the second `awk` read the already-truncated file β†’ the whole source was lost (1 line left). Recovered with `git checkout -- SRC`, then redid it, but the same bug could have meant making it up from scratch. **Rule:** when a cut needs N blocks from one source into N files, never write a block back onto the source that the `awk`s still read. Instead: 1. Read the source **once** at the start into temp files (`mktemp -d`, one file per block), with a `$D` variable you carry forward. 2. Verify block sizes (`wc -l`) and brace balance (`python3 -c` counting `{`/`}`) before touching any real file. 3. Then assemble each new file from `cat D/block …` β€” never truncating the source until every read is done. `git status` can't save you here if you don't notice until the file is gone β€” `git checkout -- ` from the last commit is the recovery. Cheap insurance: restore-then-retry, do it atomically from temp files the first time. --- ## Verifying an ffmpeg decode contract from WSL (no real CLR needed) (2026-08-31, TASK 21) When a change depends on ffmpeg producing output with an exact frame-size contract (rawvideo WΓ—HΓ—4 BGRA), you can prove the **command + frame accounting** here without any .NET process: 1. Fetch a **static Linux ffmpeg** into `/tmp/opencode` (no sudo needed): `curl -sLO https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz && tar -xf …` 2. Generate a tiny known clip: `ffmpeg -f lavfi -i "testsrc2=duration=1:size=640x360:rate=30" -pix_fmt yuv420p clip.mp4` 3. Decode with **exactly the app's args**: `-f rawvideo -pix_fmt bgra -vf scale=640:360 -an` 4. Assert `total_bytes % (W*H*4) == 0` (python3) β†’ exact integer frames, no pad. **Why not a dotnet-spawned ffmpeg here:** the only CLR on this box (`/home/gramps/bin/dotnet`) is a **Windows-bound shim** β€” `Process.Start` resolves paths to `\\wsl.localhost\Debian\…` and throws "not a valid application for this OS" when handed a Linux ELF ffmpeg. So never plan to have dotnet exec a Linux ffmpeg here; verify the contract with shell/python instead, and leave the CLRβ†’real-ffmpeg run to the native Windows suite.