NOOP AI 9.3.1 DX Beta
NOOP AI 9.3.1 DX Beta
A coach-memory release with two Today repairs, on top of nine upstream commits landed after RyanBR's
9.3.0 tag.
Added
- A memory receipt in the chat. A reply that wrote to memory now names what it saved, right under
itself, with That's right / Edit / Forget — and "Saved, pending your confirmation" for the facts
that need one. Rows are looked up by id, so an edited fact re-reads its text and a forgotten one
disappears; the transcript never keeps a stale copy. Existing transcripts load unchanged. - Memory settings that show their work. The list is grouped (awaiting confirmation → always-on →
by category → expired) instead of forty flat rows. Each fact gains pin/unpin and a disclosure with
the provenance that was recorded from the first version and displayed nowhere: source, first saved,
observation count, previous wording, expiry — with controls to set or clear that expiry. Facts can
also be typed in by hand, which stores them confirmed on the spot. - An attention badge on the Memory row, the same one the Coaching row has always had, so a fact
waiting on you is visible from the coach's landing page instead of two taps down.
Changed
- Effort reads the same figure everywhere on Today (upstream ryanbr#1001, ryanbr#1006). The hero and the Key
Metrics tile could disagree; both now use the resolved value. - Fresh installs default the HRV window to Overnight only (upstream ryanbr#1008, ryanbr#1019). Existing
installs keep the setting you already have. - Less work between tapping send and the request leaving.
retrieveembedded up to 64 backlog
documents before looking at your question, inside the same 2.5-second budget the question had to
win — on a cold model that race was lost by construction and you waited the full budget for a
keyword fallback. The question goes first now. Alongside it: the index writes only documents whose
text changed (instead of re-upserting up to 50 conversations per message), a second redundant
reconcile per message is gone, document tokens are cached rather than recomputed per question, and
document building moved off the main actor. - Importers, secure prefs and What's New got cheaper (upstream ryanbr#1012, ryanbr#1014, ryanbr#1016, ryanbr#1017) — one
capped stream reader instead of five, one prefs helper opened once per process, a lazily built
changelog, and a range-scan for Health Connect calories. - Version identity is 9.3.1 DX Beta (build 216; Android
versionCode308). The AltStore and
SideStore source moves to this release as it is published.
Fixed
- A health fact the coach saved could never be used.
addstored an injury, goal or physiology
fact as pending confirmation, the always-on block admits only confirmed facts, and nothing outside
a tap in settings ever set that state — the near-duplicate path did not touch it either, so saying
"yes, that's right" out loud could not fix it.remember_factnow carriesconfirmed_by_user,
honoured on the restatement path where that agreement actually arrives. It never downgrades: a
re-inference cannot un-confirm or unpin a fact. valid_untilfinally expires something. The field was decoded and filtered on, but nothing ever
wrote it, so a March calf strain still framed every answer in August. It can now be set by the coach
or by you, and expired facts are evicted before healthy ones when the 40-fact budget is full.- Two quiet bugs for anyone not reading English or German. The semantic index wrote a hardcoded
"Ja"/"Nein" into every journal document in all nine shipped languages — text that is both embedded
and handed to the model, so it embedded a token your own questions could never match. And category
inference matched English and German only, so in six of the nine locales every distilled fact fell
through to "preference", losing both its health sensitivity and its confirmation requirement. - The same fact no longer goes out twice. The keyword ranking and the semantic index hold the same
facts and both run per turn; the keyword block now skips what the context already carries. - "Forget everything" asks first. It fired on the tap, dropping up to 40 facts irreversibly, while
the only other irreversible control on that screen has always asked. Facts have no archive the way
conversations do. - Classic Today's heart rate is the live card, not a static chart. It kept an older chart with its
own pinch-zoom and a live bpm badge you could not tap; it now hosts the same compact live-HR card
Liquid draws, with a "Full day" link into the Deep Timeline. The removed reading all lives there. - Liquid Today showed one workout under a header counting hundreds. The section rendered a single
card while the heading beside it read "1998 total". It renders up to six, like classic Today. - The Weight tile drew no trend. Its sparkline was windowed by date only, so a series measured
weeks apart had too few points inside the 2/7/14-day window and fell through to an empty graph while
the number stayed correct. A sparse series now falls back to your recent readings, which is what the
feature reference has promised all along. Dense metrics are unaffected. The same tile also stopped
drawing a permanently empty progress bar for a value that has no 0–100 scale. - Sleep stages recognise both spellings of wake in segment comparisons (upstream ryanbr#979, ryanbr#1011).
Verification
xcodebuildof both app targets — macOSStrandbuilt universal (ARCHS="x86_64 arm64" ONLY_ACTIVE_ARCH=NO, the way CI builds it, so an arm64-only thinning cannot hide an Intel break)
and iOSNOOPiOS— both succeeded.swift testfor WhoopProtocol (472), WhoopStore (334), StrandAnalytics (1223) and StrandImport
(221) — all green.StrandTestsunderxcodebuild … test— 1763 tests, 0 failures (1 skipped), up from 1731 with
the new coach-memory and spark-window tests.- Not verified on hardware. Nothing in this release touches the CoreBluetooth path, but the live-HR
card on classic Today reads a connected strap — pair one and watch the number tick.
Thanks
- @bartmuskala — reported that Effort on top and the Key Metrics tile disagreed (ryanbr#1001), the fix
this release carries. - @vishk23 — the decoding work behind the sleep-stage and capture cleanups landed here (ryanbr#979).
And everyone who filed the reports behind these fixes.