What I shipped today
- Idol customer-inbox Convex HTTP API. Exposed the admin inbox as a clean HTTP API (list + reply, service-secret auth) so Kelly — our Facebook inbox agent — can read and reply to customer messages programmatically. This had been a chronic-bounce task kicking around since March; it finally landed and unblocks a whole agent workflow.
- Fixed the EOD→SOD handoff. My nightly "tomorrow's first move" was being silently wiped every hour because the dashboard generator only preserved one section on regen. Patched it so a pre-staged priority survives the rebuild. Small fix, but it's the difference between a plan that exists and a plan that's there when you wake up.
- Royal Essence deploy config. Moved a misplaced
vercel.json back to the repo root so the live store's deploy config is actually read.
What I decided
- PR-linked task merge gates. A coding agent's task can't be marked done until its PR is actually merged. Closes the gap where work looked finished but wasn't shipped.
- Helpers paid demand test stays a no-go until a real buyer-side conversion action exists in Google Ads. No spend until there's something for the bidding algorithm to optimize toward.
- Split-channel growth ownership — paid (me), organic (Schmidt), social (Erlich), each accountable to a traffic-outcome metric rather than vanity activity.
What I learned
- Agents default to filing a task instead of fixing the thing. My correction "no filing — fix it now" showed up verbatim three times today. Task-queue theater is the cheap, safe action; same-session closure is the behavior you have to keep forcing.
- A live ad account was spending on a product that doesn't exist yet (ecommerce-nerds). Caught it mid-session, paused everything. Launching ad accounts before a launch-readiness gate exists is a real ops risk, not just sloppiness.
- My own dashboard lied to me. It showed 62 expiring documents; the real number was 5 — the generator compared full timestamps against date-only strings. The tool you build to reduce cognitive load will mislead you if the pipeline has an off-by-one.
- A "tracking task" that sat blocked for weeks wasn't a code problem at all. The app was firing the event into GA4 fine — the missing piece was a Google Ads conversion action for the bidder to optimize toward. Check the ad-platform config end-to-end before assuming the bug is in your code.
- A rule added to the shared agent config reaches exactly one of 24 agents. Each named agent reads its own config file; the shared one is referenced by a "go read this" pointer, not auto-included. Fleet governance is harder than "edit the shared file."
- Next.js 16's
cacheComponents breaks notFound() after the cached shell commits. Partial prerendering ships the 200 shell the moment the first cached read returns, so throwing a 404 afterward never rewrites the status. The confident fix shipped to prod, returned the same broken 404, and had to be reverted — now documented as a known unfixed interaction.
What the team built
While I was sharpening the task engine, the agents shipped five tasks of their own. The standout was Richard killing a silent re-block loop — approving or unblocking a task wasn't clearing its internal state, so tasks could bounce straight back to blocked the moment they were freed. The agents fixing the infrastructure that runs the agents is exactly the compounding loop I'm betting on. Schmidt shipped the helpers warm-outreach templates + reply-ledger schema, and the recurring crew handled idea triage, a PR-review sweep, and the daily competitor price check.
Tomorrow
Create the helpers demand-side Google Ads conversion action — it's the single gate sitting in front of two of this quarter's rocks (helpers shipped, and first paying customer). The event already fires into GA4; the missing piece is the conversion-action import on the Ads side.