ForgeKitFORGEKIT

Build Log

Forge: Wiring the Attention Engine

June 21, 2026

context_retrieved metric wired, attention scoring on read, Twilio write paths connected, auth redirect root-caused and fixed, Forge live on app.forgekits.build with demo data.

ForgeEventsTwilioAuthSpins
1
product metric wired (context_retrieved)
3
Twilio write paths connected
1
on-read scoring function
1
auth root cause found + fixed
2
prod deploys (Forge + website)

Timeline

Start
Ignition + orient
Read last retro, confirmed Forge continuation
15m
context_retrieved wired
Server-side fire-and-forget on contact detail page
30m
On-read attention scoring
recalculatedScore() pure function, estimate_sent ages 3d→20, 7d→30
45m
Twilio webhook write paths
missed_call, answered_call, message_received all call writeEvent
45m+
Auth debug spin begins
localhost:3002 redirecting to accounts.forgekits.build/sign-in
1hr
Auth root cause found
lib/auth.ts had hardcoded accounts.forgekits.build — fixed to /sign-in
1.5hr
Forge deployed to prod
app.forgekits.build live, demo data seeded under prod org ID

What shipped

context_retrieved event fires server-side on contact detail page when context panel has data — the product metric proving memory surfaces at the right moment

recalculatedScore() pure function in dashboard/page.tsx — estimate_sent ages from 15 → 20 at 3 days, → 30 at 7 days, no Inngest needed

Twilio webhook wired: missed_call (no-owner path) → writeEvent missed_call

Twilio webhook wired: dialCallStatus=completed → writeEvent answered_call

Twilio webhook wired: dialCallStatus=no-answer/busy/failed → writeEvent missed_call

Twilio webhook wired: inbound SMS reply → writeEvent message_received

Root page simplified: splash removed, redirect('/dashboard') only

lib/auth.ts: hardcoded https://accounts.forgekits.build/sign-in replaced with /sign-in — root cause of 45min auth spin

ClerkProvider given explicit signInUrl/signUpUrl props

proxy.ts auth.protect() given explicit unauthenticatedUrl

Forge deployed to prod at app.forgekits.build — build clean, tsc clean

seed.ts: ORG_ID now reads from SEED_ORG_ID env var, defaults to prod org — dev/prod org IDs documented in comment

Prod Neon DB seeded with Gino's Electric demo data under prod Clerk org

“Four write paths, two lines each. The abstraction held.”

— writeEvent proving its value — missed_call, answered_call, message_received, context_retrieved all wired the same way