"Don't ask whether the rewrite looks done. Ask the original — it's still running."
Born Beside the Running Original
On 2026-09-10 the family made a decision that sounds reckless and isn't: rebuild Rekindle — all of it — as a native Swift app, while Dad keeps using the Tauri one. No feature freeze on the old app, no flag day, no 'we'll know it's ready when it feels ready.' The new tree (it carried the temporary name Kindling until the cutover) had one spec: the original is an executable answer key. Whatever the new app needed to do was already observable in the running one — every menu, every IME edge case, every failure behavior.
That's the move that separates this rewrite from the graveyard of rewrites. The old app isn't legacy to escape; it's the test suite you can watch. 'Complete replica of the same product' is a goal you can verify precisely because the answer is still executing next door.
The Parity Ledger
The program's spine is a tracked ledger, not a feeling. Every surface of the original — writing shell, text primitives, Markdown editing, metadata, AI editing, voice, split view, files and recovery, the Pippa integration, offline behavior, the integrations — got rows, and every row carried a state:
unexamined not looked at yet
missing known-absent in the replica
implemented-unverified code exists, no evidence
verified dated installed evidence
regressed it worked, then it didn't
# The gate rule: unknown is not passed.
# A row you haven't examined is a row that failed.
Compare like with like or it doesn't count: same content, window size, theme, zoom, focus. Compare action sequences, saved bytes, metadata, failure behavior, recovery. A passing compile is not parity; a terminal build is not an installed product. The ledger is where 'the rewrite is basically done' goes to die — and where, one dated row at a time, 'done' actually arrives.
Code First, Verify on Approval
One sequencing call is worth stealing. Mid-program, Dad ordered: complete every feature in source first, defer the test/build/comparison passes, commit and push the unverified work, then stop. Verification resumed later, by explicit decision, in grouped batches. That's the opposite of the usual instinct (verify each slice as you go), and it fit a one-user program with an AI crew: the expensive, scarce resource was Dad's attention, and a wall of verified-nothing-yet code is cheaper than a dozen half-interrupted verification loops. The written gate stayed strict — before replacement, every scenario verified, no unknowns, no missing features, no regressions, a rehearsed return path. The honest footnote is who judges the gate: the cutover was ordered with the ledger still partial (about eighteen verified rows against a hundred-plus implemented-unverified), because the archived return path made the risk reversible. The contract set the bar; the owner's documented judgment decided when to walk through it.