release/v1.28.28 — OpenAI-compatible gateways work; a re-keyed night can no longer vanish#474
Merged
Conversation
…d night can no longer vanish The Local provider speaks the standard JSON wire: response_format by default, one self-healing fallback per endpoint when a server rejects it (dialect cached per base URL) — LiteLLM, OpenRouter, vLLM, LM Studio and plain Ollama all work from the same form, and the form + provider docs now say so. A gateway that shims a Claude-family model behind a synthesized tool call is parsed from the tool-call arguments instead of yielding silently empty insights. The insight token budget is configurable (INSIGHTS_MAX_TOKENS, default 2500, clamped 500-8000) and unified across all six call sites; a reply cut off mid-JSON returns a distinct truncation error instead of a generic parse failure. A briefing withheld by the number-grounding check now says so on the card instead of pretending nothing was generated. The provider test button answers 4xx with a bad_request category instead of claiming the endpoint was unreachable. Sleep repair follow-up: measurements carries a second full unique index — the natural key (type, measured_at, source, sleep_stage) — so a key-format migration could tombstone the old rows while their re-keyed replacements collided with that index and were silently dropped (live incident: a full-history re-sync erased a user's sleep). Planned creates now run a natural-key rescue probe: a match, live or tombstoned, is updated in place — fresh value, the new externalId, deletedAt cleared. A rescue-probe failure holds the watermark so nothing is lost past the overlap.
The dashboard is exactly the surface a user leaves open in a background tab while editing its tile selection elsewhere; with focus refetch off, the stale layout sat visible for up to the poll interval — a save appeared to do nothing, then 'worked' minutes later. staleTime still bounds the refetch to once a minute and the server side is SWR-cached, so a focus flick is a cheap cache hit. Chart batch series stay on the poll (heavier payloads; the tile selection itself lives on the snapshot query).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two work packages. (Deliberately no closing keyword — reporters confirm first.)
Gateway frictions from #470 — Local provider sends standard
response_formatwith a per-endpoint self-healing dialect fallback (cache + one retry on a response_format rejection); tool-call JSON shim parsing (LiteLLM-fronted Claude);INSIGHTS_MAX_TOKENS(default 2500, clamped, unified across all six call sites) + distinct truncation 422; grounding-gate omission surfaced on the briefing card (briefingOmittedReason, additive); test button gainsbad_requestfor 4xx; Local-provider form copy + provider docs name the gateways; env example + compose whitelist extended.Natural-key rescue (sleep-vanish follow-up) — the second FULL unique index
(type, measured_at, source, sleep_stage)silently killed re-keyed inserts whose old-format rows had just been swept (live incident: a full re-sync erased a user's Google sleep history). Planned creates now probe by natural key; any match — live or tombstoned — is updated in place with the fresh value + NEW externalId +deletedAt: null. Probe failure registers on the hard-fail ledger so the watermark holds. One full sync after updating heals affected histories.Gate: typecheck, lint, 13484 unit tests, prettier, build, knip, openapi:check all green.