Step 1
Scaffold
Built the .NET 8 WPF WinExe project, core folders, MVVM base types, blank window, FFmpeg locator, process manager, and missing-tools startup check.
Decision: plain exe and bundled tools folder. Lesson: the machine first needed the .NET 8 SDK and the generated project had to be flattened.
Step 2
Probing service
Added ffprobe metadata extraction, JSON parsing, no-video-stream rejection, VFR detection, test project, and probe harness.
Decision: separate process I/O from parsing for unit tests. Lesson: nested test and harness sources needed explicit compile excludes.
Step 3
Compression planner
Built the CompressionPlanner, priority modes, bitrate-floor table, source-bitrate cap, resolution ladder, and unit tests.
Decision: calculate bitrate from target MB and duration, then apply documented thresholds. Lesson: even-aligned downscale expectations mattered in tests.
Step 4
FFmpeg encode service
Replaced the stub with EncodeService, FFmpeg argument building, progress parsing, disk guard, two-pass encoding, cleanup, corrective pass, validation, and logs.
Decision: keep the encode service UI-agnostic. Lesson: cancellation returns a clear result and deletes partial output.
Step 5
Sample-clip pre-test
Added sample timing, sample encoding, bitrate adjustment, resolution step-down behaviour, predicted final size, and quality notes.
Decision: make the pre-test optional and skip it for short sources with a clear reason. Lesson: some test cases hit audio-alone limits before planner floors.
Step 6
UI
Built the WPF workflow: drag and drop, file picker, target MB, priority radios, Compress, Cancel, progress, confirmation, results, output paths, settings, and VFR warning.
Decision: thin code-behind only for browse and drop. Lesson: bad TextBlock Run bindings could crash the first UI launch.
Step 7
Edge-case hardening
Added invalid-media rejection, portrait short-edge floors, impossible-target blocking, source-bitrate warnings, disk estimate fixes, pass-log cleanup, network-file notes, and broader orphan sweeps.
Decision: warn and block impossible targets instead of producing broken output. Lesson: portrait video should be judged by short edge.
Step 8
Start menu integration
Added the app icon, project icon wiring, and a PowerShell script that builds Release and creates a Start menu shortcut with the exe folder as WorkingDirectory.
Decision: no installer or MSIX. Lesson: the first script had smart quotes that PowerShell would not parse.
Step 9
FFmpeg setup script
Built setup-ffmpeg.ps1 to provision ffmpeg.exe and ffprobe.exe into tools, with skip, force, 7-Zip, GitHub mirror, temp cleanup, and fallback messaging.
Decision: automate the tools folder. Lesson: assumed zip URLs and non-ASCII punctuation both needed correcting.