¶ 2026-08-08 Bodylog profile chat reliability
- Deployed Bodylog PR #869 as image
gitea.app.lan/bodylog/bodylog.dev:sha-b0a927cefb3c.
- Replaced the single
gpt-5.4-mini Flex chat route with one typed capability/cost policy: Luna for low-risk outreach, Terra for ordinary routing and single-domain work, and Sol for routing repair, multi-domain replies, visualizations, and confirmed mutations.
- Added JSON-constrained tool selection and one automatic Sol repair using the same private conversation.
- Unrecovered routing failures now remain in owner-scoped chat history under the configured retention period.
- Confirmed product reports load support context only and cannot emit measurement guidance or unrelated visualizations.
- Removed routine success banners and constrained confirmation content to the chat viewport.
At 2026-08-08 09:31 UTC, production recorded a gpt-5.4-mini tool-selection response without a following reply or persisted exchange. The preceding report confirmation delivered successfully, but selected unrelated body/profile context. The request volume was small and does not support overload as the root cause.
- Repository: 184 backend tests passed; 16 disposable-database tests were exercised by CI; 143 frontend tests passed; production frontend build passed.
- Deployment rolled out with one ready replica and zero restarts.
https://bodylog.dev/healthz and the frontend returned HTTP 200.
- The deployed bundle omits the old routine success copy and contains narrow-screen wrapping.
- Production-key smoke requests completed successfully for
gpt-5.6-luna, Terra JSON routing with medium reasoning, and gpt-5.6-sol. One authenticated browser turn remains required to confirm end-to-end routing and the selected model in persisted production usage telemetry.
- An authenticated chat attempt against PR #869 failed before any model usage or exchange was recorded. The pod remained healthy, and the same production-key Terra request shape returned HTTP 200 in a direct probe, identifying a transient provider-call path rather than an unsupported model or request format.
- PR #871 added bounded retries for Responses API transport and 5xx failures, stage-specific privacy-safe provider diagnostics, durable private retention of failed turns, and a single non-duplicated UI error.
- Workflow 7581 passed and deployed
gitea.app.lan/bodylog/bodylog.dev:sha-d0819ae8baf1; rollout completed with one ready replica, zero restarts, and HTTP 200 health and frontend checks.
- Validation: 185 backend tests passed locally with 16 database-gated tests exercised by CI, 144 frontend tests passed, and the production frontend build passed.
- Authenticated chat retry and resulting production telemetry remain the acceptance gate.
- The retained authenticated retry exposed the exact provider rejection: the tool-selection
prompt_cache_key was 82 characters while the Responses API maximum is 64.
- PR #872 replaced tool-selection, repair, answer, and outreach cache keys with stable bounded digests that preserve separation by stage, context version, model, and model-policy version.
- Workflow 7583 passed and deployed
gitea.app.lan/bodylog/bodylog.dev:sha-e706405c81cf; the rollout completed with one ready replica, zero restarts, and HTTP 200 health.
- Validation: 185 backend tests passed locally and the database-gated suite passed in CI. One authenticated chat retry remains the final acceptance gate.
At 10:36-10:44 UTC, authenticated production chat completed four consecutive tool-selection/reply pairs using gpt-5.6-terra and gpt-5.6-sol on the default service tier. The waist/language report and the separate stale-Garmin-weight report were both explicitly confirmed, applied, and delivered exactly once on their first outbox attempts. The Garmin report contained no transcript or unrelated health context and was classified as recurring high risk with human review required.
Redeploy the preceding healthy image gitea.app.lan/bodylog/bodylog.dev:sha-d0819ae8baf1 through the repository-managed workflow. No database migration or secret change was introduced.