Back to Body Journal
SOURCE / PINNED RELEASE

Made of little things.

Body Journal

Release
e8049f8da4e2…
Author-recorded commit
61c04bf0e8aa…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-6c4554844c7

Archive hash verified: 4369d778da046a8b…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

docs/observation-groups.md
# Observation groups

Add patient-defined relationships to the existing adult intake. A named group
links any number of body observations and general symptoms, with optional patient
wording explaining the connection. Membership is many-to-many. Removing a group
keeps observations; deleting an observation removes its links. Stable group and
concern IDs survive reloads. Empty groups remain editable.

Keep the white, off-black and reddish-orange app-owned palette. Place compact,
collapsible groups above the existing concern cards in the right sidebar. Each
expanded group contains its name, explanation and membership checkboxes, with
links that open the original concern editor. Keep one editor per observation.
Phone layouts use the existing Concerns tab, scrollable panel and 44px controls;
the existing minimum notice still applies at 200×160. No extra viewport chrome.

No new host requirements, configuration, interop or relay use. Existing optional
SDK storage saves groups in a version-3 draft; older drafts migrate with no groups.
Without storage the entire workflow remains usable in memory. Bound counts/text
and validate identities/membership when loading. Persist expanded groups as view
state, separate from the clinical case payload.

The patient-reviewed summary and exact AI request include group names, linked
concern IDs and the patient's explanation under “Patient-suspected relationships”.
Instructions distinguish these from established causes, AI hypotheses and clinician
conclusions. Existing case comparison marks reports stale after relationship edits.
No analysis runs automatically and the existing CVM transport is unchanged.

Verify many-to-many membership, unlink/delete behavior, escaping, old-draft
migration, round-trip persistence, stale reports and exact request inclusion.
Inspect populated groups with long names at 1600×1000, 900×600, 320×560 and
200×160 in both host themes, plus touch portrait/landscape and absent domains.

## Verification — 25 October 2026

- `pnpm verify`: 77 tests passed, plus TypeScript and the single-file build.
  New tests cover migration, shared membership, empty groups, independent view
  state, invalid references/duplicates, text limits, summary escaping and case
  revisions after group edits. Final `pnpm type-check` also passed.
- `pnpm test:groups:ui http://127.0.0.1:4173/`: passed in the real soyLI iframe.
  Created groups with local and general concerns, shared a concern between groups,
  unlinked and deleted without losing other data, opened original editors,
  preserved keyboard focus, and restored IDs/membership/disclosures through SDK
  reloads. Checked 1600×1000, 900×600, 320×560 and the 200×160 minimum notice in
  both host themes; touch at 390×844, 360×640 and 844×390; in-memory operation
  without optional domains. Long group names wrap. Screenshots were inspected.
- `pnpm test:conformance`: 5 passed, 0 failed, 5 skipped. The three manifest checks
  lack a supplied event; no wire envelopes emitted; teardown not measured.
- `pnpm test:ai:ui`: passed with zero browser errors and zero vendor requests.
  Confirmed grouped case data in the reviewed/sent synthetic request, stale
  reports after explanation edits, and session clearing including groups.
  Existing key persistence, rejection/cancellation, image/text-only, retry and
  no-WebGL paths also passed. Updated the shared synthetic-case setup to use the
  body-area picker without WebGL, explicit tool-button selectors and a real Tab
  blur for edited location text instead of a re-entrant artificial change event.
- `soyli check`: passed in space-playback-6 / Chromium 153.0.8010.12.
  Final HTML is 19,009,289 bytes, with no external script references; SHA-256
  `b95913624e6d935b8696f1a7c4c8501b8cadb44c75571ed3fa5727684c843f18`.

New modules `concern-groups.ts` and `group-controls.ts` separate validated group
records from sidebar/review rendering. Existing case/session, main UI and AI
instruction modules carry the integration. No new NAP domains, direct networking,
browser-storage fallback or relay operations. Existing optional SDK storage and
CVM boundaries remain intact. Physical phone behavior and clinical interpretation
of group information were not evaluated. Restart an already-running AI bridge to
load the updated model instructions.

Reused the existing user-owned soyLI preview; no new preview process was started.
Test browser contexts are isolated and closed. Captures are ignored under
`.napplet-space/group-checks`. No publication or deployment was performed.