Repository navigation
release: v1.43.0 - #1227
Merged
Merged
release: v1.43.0#1227
Conversation
…thority
DELETE /api/biomarkers/{id} used a bare requireAuth() while the PUT beside
it requires requireRecordAuth("manage", "labs"). The delete now uses the
same authority and, as a manage-level hard delete, files what it destroyed
(name, unit, reading count) through destroyedDetails.
POST /api/labs/ocr/commit can write a whole report and mint markers, yet it was the one lab write without a ceiling. It now charges the same per-account record-write bucket as POST /api/labs and POST /api/biomarkers and answers 429 record_write.rate_limited once exhausted.
The header is echoed on the response and written into every log line. Both
readers (the proxy and apiHandler) now accept it only when it matches
^[A-Za-z0-9-]{8,64}$ and otherwise use a fresh id.
The proxy no longer calls crypto.randomUUID itself, so it leaves the client-random-id exemption list; the request-id helper uses the shared randomId, which also works without a secure context.
Migrations 0402 to 0410: AI usage levels, biomarker aliases and merges, medication ingredients (with the supplement label run kind), life circumstance fact kinds, AI sections and AUDIT-C, Dawarich context, the pulse day-mean method, intraday hour buckets, the readable location drop and five relation link tables. Every new column carries its reader or a pending-consumer marker. 0409 refuses to run while any home, location period or stored day still holds a readable location, and names the counts. Locations are read from the sealed copy only; the encryption backfill no longer handles them, and the demo seed writes sealed locations only. The new tables are backed up and wiped, the new sealed columns are in the rotation registry with labels of their own, the AI usage level and the life-circumstance confirmations travel with the backup, and the wellbeing score reads the mental-health screeners only.
…il filled Every new endpoint of the contract exists, wrapped in apiHandler, with its authentication, module gate and request validation, and answers 501 not_implemented until its behaviour lands. The OpenAPI document carries the new operations and schemas and the additive response fields on the changed routes. The four server feature flags are published as false. contract-stub-inventory.test.ts registers the stubbed routes; each one leaves the register with the change that fills it. The route, sharing, session, security, module-gate and outcome inventories name the new routes deliberately, and the error-code catalogue lists the codes the routes emit today.
… window
A picker term that names a period ("2019", "03.2019", "2019-03",
"März 2019", "2019년 3월") is sent as the list route's from/to window
instead of q, newest first, on every family including the visit list,
which has no text search. Month names come from Intl for the UI locale,
folded for case, accents and umlaut spellings. Instant routes get the
period's bounds in the person's timezone; the document route gets the
period's calendar days. The sheet names the period it shows.
Parser cases for every accepted form in de, en, es, fr, it, pl and ko and the near misses that stay text; builder cases for every family; and an integration walk over three years of lab results, conditions, visits and documents, with records either side of each boundary in the person's zone, across every page.
A printed name now resolves to one of the account's markers by its own name, then by an alias of the account, then by a catalog name for the same analyte when the reading's unit fits. The catalog gains seeds for alkaline phosphatase and total bilirubin and a checked list of common lab shorthand in seven languages; names that mean two analytes stay out.
POST /api/biomarkers/{id}/merge folds markers into one in a transaction,
converting readings where the registry knows the units and refusing the
whole merge where it does not; a dry run answers the same result and
writes nothing. Aliases appear on the marker and are edited through the
marker's PUT. Scan and document review rows name the matched marker or
offer up to three, and a chosen marker is remembered as an alias. The
doctor report, FHIR and MCP group readings by marker. Aliases and the
merge ledger travel through backup and restore.
The merge moves every reading and every reader shows one series, a dry run answers the same and writes nothing, conversions keep the printed value, an unconvertible source refuses the whole merge, a chosen spelling resolves on the next scan and on manual entry, and aliases and the merge ledger survive both kinds of backup. The merge route joins the record-scoped manage inventory with its driver.
…nfo and report surfaces
…eport, and ask for them in bug reports
A sync from a watch or an integration now waits the instance's sync gap (AppSettings.aiSyncRegenGapHours, else AI_SYNC_REGEN_GAP_HOURS, else 6 h) before it may regenerate a status card again; a hand entry keeps the hour. Every caller of afterMeasurementMutation and invalidateStatusInsightsForTypes names its source, so a new ingest path cannot skip the choice. Refs #1217
…st it The status cards, the briefing, the derived assessments and the Coach snapshot drop the two-space indentation from the JSON they hand the model. The content is unchanged (the hash gate hashes the object, so stored hashes stay valid). MAX_SNAPSHOT_CHARS is now measured on the compact string: 14 000 for the status cards and the Coach, which every snapshot that fitted the old 24 000 pretty-printed characters still fits, so the model reads the same data for fewer tokens. Refs #1217
The opener hint, the first-name clause, resolved follow-ups, the table rules and the final-round line used to be written into the system prompt, so the cached prefix (tools plus system) was rewritten on every turn and again on the forced final round. They travel on the user side now: the per-turn lines in the user message, the table rules as a note after the round that produced the first table, the final-round reason as the last user line. The system prompt depends on the locale, the Coach preferences and the about-me text only. Refs #1217
…sage Three levels (frugal, standard, full) with an operator ceiling and default and a per-account choice within them, resolved in the capability layer for the record and published on GET /api/auth/me as ai.usage: the level in effect, the stored choice, the bounds, why (user, default, admin_cap), the three options with whether each is allowed and an estimate of tokens per day scaled from the record's last seven full days of coach_usage, and the measured mean. A delegate sees the level, never the owner's spend. PUT /api/auth/me/ai-usage stores the account's own choice or null for the default, refusing a level above the ceiling with 422 ai.usage.aboveCeiling and meta.maxLevel. The new supplementLabel capability needs standard or above; below it the capability is unavailable with the new usage_level reason, refused with 403 ai.usage.levelTooLow and meta.requiredLevel. Refs #1217
PUT /api/admin/settings/assistant-flags takes an optional aiUsage block: the highest level an account may choose, the default for accounts without a choice (422 ai.usage.defaultAboveCeiling when above the ceiling) and the sync regeneration gap at standard (1..48 hours, null follows AI_SYNC_REGEN_GAP_HOURS, else 6). Lowering the ceiling caps every account above it at once and keeps their stored choice. The provider-health readout counts accounts per effective level. Refs #1217
…e whole summary slice
The rebuild after apply now writes its state beside the dry run (queued, running, done with counts, failed); a run left queued or running without a job reads as failed. The card shows it and offers a new rebuild after a failure, which the route accepts once the method is applied, without a new dry run.
zod 4.6 grew the shared Zod chunk from 63 to 89 KB gz (the new schema compiler and its memoizer ride along because every schema goes through the `z` namespace), and the dashboard, measurements, mood and settings routes each carried it for values that need no validation. Move the measurement source list, the notes limit, the screening check and the Coach source list into value-only modules the schemas are built from, import the settings classifier and response check from their leaves, and load the gate's managed settings and anamnesis sections on demand. Re-base the four route baselines to the measured values and the aggregate cap to 4975, with the reason in the budget comment.
…ich schedule zone
- Composition amounts show only the decimals they carry, so 100 µg no longer reads as 100.000 µg; the remove button stays on the amount row. - AUDIT-C remove controls are icon-only, so they no longer spill out of the card or cover the earlier answer. - Life-circumstance labels keep their colon when they wrap, checkbox groups sit in two columns and the weekly-minutes sentence ends. - Link chips get a 44 px hit area for their remove control. - The AI usage level reports a failed save with a sentence and the error id instead of a bare "Error". - The Dawarich home-country and admin refresh-gap labels sit above their fields.
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.
Release v1.43.0. Notes in CHANGELOG.md.