Estate
Estate Review — Three-Day Mobile Sprint
A durable snapshot of ~three days (16–19 Jul) of mostly phone-driven estate work — what shipped, what it enables, and where the seams are.
Situation
Over three days the estate gained live external awareness (TomTom traffic joining weather/news, with a proactive commute watch), a second Google account (MK Community Energy) folded into calendar and inbox, a Model Settings screen turning hardcoded routing into data-driven presets, an eval battery wired to gate pushes and page on regression, the Pebble watch promoted to a glance surface, and a round of assistant-proactivity fixes — while the VM→Goose migration advanced to Increment 4a. The method held throughout: design doc → plan → small PRs → merge.
The one systemic weakness was the last mile: build outran landing. Almost everything is merged to main but inert — the edge is undeployed, three secrets are unset, several VM jobs aren't pulled or cron'd, and one whole increment sits on an un-PR'd branch. The estate is 🔴 RED, driven entirely by two concrete, fixable Tier-A items — not by anything the new work broke.
Key decisions
Reason about the physical day
TomTom traffic joins weather and news as a collect→interpret→surface loop; the weekday-morning commute watch (defaults OFF) is the first proactive nudge grounded in live-world data.
Owner-tagged accounts
A multi-account registry gives every calendar event and inbox item a data_owner tag — the groundwork for a clean work / personal / mk-community-energy split the vault already enforces.
Model choice as a dial, not a redeploy
Routing moved from hardcoded providersForTier into config:routing KV with a UI — the self-serving loop designated as the first doer dogfood task.
Regression becomes a gated signal
The eval battery + /status verdict + weekly canary turn "did that change break the persona?" from a vibe into a paged signal — aimed at the silent-failure class that hid the 13-day auth outage.
Off the lapsed subscription for good
Each Goose/OpenRouter increment retires another routine from the lapsed claude CLI — the durable answer to the 30 Jun incident, not a re-auth stopgap.
Architecture
Six capability surfaces plus a migration increment, landed across the mallory (edge/app) and mallory-runtime (Tower/VM) repos and the vault.
/live/places config, PWA traffic card, proactive commute watch (mallory).mallory + mallory-runtime).config:routing KV with a web UI (mallory).POST /eval/report, /status verdict, OpenRouter fallback, weekly Tower canary (mallory + mallory-runtime).notify() fan-out to the Timeline with per-kind wrist policy; briefing / nudge / reminder / traffic pins (mallory)./reflect + nightly cron, /journal, Deadline Hardener calendar-write (dry-run by default).Risks & guardrails
Build outran landing
Near-everything is merged but inert — undeployed edge, three unset secrets, VM jobs not pulled or cron'd. The RED state is a landing gap, not a regression.
🔴 slack-email-monitor failing
"Unparseable pull" since 17 Jul — a connector routine not yet migrated off the lapsed CLI. While down, work-Slack/Gmail ball-in-court items silently don't reach the Waiting surface.
🔴 calendar-sync paused
Deliberately paused during the google_mk multi-account cutover; the agenda is stale-served (labelled as such) until the rollout + Inc 4a deploy tail complete.
One stranded increment
VM→Goose Inc 3 (Asana dev-backlog) is code-complete on a branch that was run on-box but never PR'd; Inc 4a leap-frogged it, so the recipe can't deploy.
Out of scope
vault · 01 Projects/Mallory Estate Review 2026-07-19/00-design-document.md