standup
Standup — 2026-07-12
Five PRs merged in the `memberintel` backend in the last 24 hours, plus four more in the KB repo.
▶ Watch the 35s summary — Daily standup — Standup 2026-07-12
Daily standup for 2026-07-12. What shipped:
Five PRs merged in the memberintel backend in the last 24 hours, plus four more in the KB repo.
Observability and health — the main push. #400 adds LLM cost, latency, error, and tool-loop metrics: structlog replaces stdlib %-formatted calls in llm/call.py, a new llm_metrics_daily Postgres rollup table receives atomic upserts, and a CF-Access-gated endpoint surfaces the data with seven division-by-zero-safe derived metrics. #401 builds the Health page on top: a job_runs audit table now records every internal sweep invocation, a last_error_at column on llm_metrics_daily serves as the Anthropic dependency signal, and stripe-reconcile gets its first-ever exception handling as a side effect. Two implementation plans and a combined design spec (innovations#275 + #274) were written before either PR was built.
Two entitlement race conditions closed. #396 fixes streaming quota: the check_and_consume flush went into the request-scoped session, which rolls back on client disconnect — a connect/read/drop loop could drain quota without incrementing the counter on any continuing conversation. Fixed by committing on a dedicated short-lived session. #397 was caught during code review of #396 and fixes two deeper races in the same service: a lost-update under READ COMMITTED and an unhandled IntegrityError on concurrent first-of-period inserts. Both replaced by a single INSERT ... ON CONFLICT DO UPDATE WHERE ... RETURNING statement.
Smaller shipping. #393 wires a Cloud Monitoring alert when the cost-control circuit breaker trips. #386 and #384 (the V1 status endpoint + in-app degraded banner, and the cost-breaker admin panel) were already merged at the start of the window. #394 fixes mobile blog grids where threshold: 0.18 on the IntersectionObserver meant 18% of a 4400px column — taller than the viewport — so .in never fired and every card stayed opacity: 0. #392 backfills persona tags on 8 posts that were hand-filed without a Persona: line, dropping all of them to the generic CTA.
KB / video. Five daemon social shorts registered via #97. #96 adds repairAnchors() to the daily standup video build: after four full regeneration attempts all fail anchor-verbatim validation, one targeted follow-up call asks the model to re-derive only the anchor phrases from its already-accepted narration — 5/5 in manual testing. #95 was the manual backfill that prompted the fix.
Notable. The #396 streaming-quota bypass only manifests on existing conversations — new conversations incidentally committed the session via get_or_create_conversation, masking the bug. The genuine exposure was the majority of real turns, not the edge case it looked like.
Window: 2026-07-11T13:00
→ 2026-07-12T13:34.267Z · Sources: memberintel @ 926ba77, memberpress-intel @ a945d56