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.
# Anatomy and visual evidence
Feature brief, 2026-10-25. Existing `ai-doc-3d` napplet; no scaffold or host changes.
The body map gains adult external genital anatomy that can be marked, and every
localized observation gains reviewed illustrations from its own saved pose.
The existing base mesh and its triangle anchors remain unchanged. Supplemental
schematic surfaces have a separate, stable topology identifier and anatomical
labels. Model anatomy follows the selected male/female illustration by default,
with an explicit override independent of sex assigned at birth. This is an
illustration choice, not a clinical statement about the user.
Visual direction: white canvas and panels, off-black text, neutral gray body and
lighting, reddish orange emphasis. Retain the existing responsive composition,
typeface and comfortable controls. Secondary text must remain readable. Colors
are app-owned in light/dark hosts and with no theme domain. Verify the current
minimum notice at 200×160, phone at 320×560, 900×600, large and touch landscape.
Vision support is established by reading a random synthetic image, not inferred
from provider names or a model's self-description. Bind the result to this key,
model and bridge; invalidate on edits and reload. Report explicit lack of image
support separately from an inconclusive test. Testing is user-triggered and may
incur provider charges. Unknown support never silently becomes verified support.
Prepare body-map images locally even for text-only connections. Capture each
observation in its recorded pose with a context view and targeted views chosen
using surface normals, visibility tests and coverage of painted samples. Include
orientation, observation identity and coverage in the review. Unmapped/general
symptoms remain text; missing or occluded coverage is explicit. Rendered anatomy
and paint are annotations, never photographs, rash appearance or examinations.
Use the existing optional NAP-CVM SDK calls to the user's encrypted MCP bridge.
Upgrade the app-level bridge contract to v2. Bounded image chunks are temporary,
actor-scoped memory at that bridge, with expiry and deletion; no public upload,
new NAP name, direct napplet network or browser database. Only explicit Send
transfers reviewed case images and text to the chosen provider. Text-only sending
is an explicit choice when vision is unverified. Missing CVM leaves intake usable.
Storage remains optional SDK storage for drafts and chosen connection keys;
screenshots are regenerated rather than consuming the draft quota.
Primary API references checked: [OpenAI image inputs](https://developers.openai.com/api/docs/guides/images-vision?api-mode=chat),
[OpenAI model-list fields](https://developers.openai.com/api/reference/resources/models/methods/list),
[Kimi vision inputs](https://platform.kimi.ai/docs/guide/use-kimi-vision-model),
[DeepSeek vision inputs](https://api-docs.deepseek.com/guides/vision/).
All three adapters use image_url content parts with embedded JPEG/PNG data.
Verification: stable old/new paint anchors, pose/shape changes, visual challenge
success/mismatch/rejection, image payload validation and owner isolation, expiry,
review/send/cancel behavior, stale evidence and existing persistence regressions.
No live paid provider inference is needed for automated tests; report that limit.
## Delivered and verified
- The external surfaces are original, schematic MIT geometry attached to the
pelvis, with separate stable component/triangle anchors. The CC0 base binary
is unchanged. The brush now reaches 2 mm illustration-space radius. The pelvis
focus and anatomy selector are available in About you.
- Capture uses an offscreen render target and restores the interactive camera,
pose, animation and paint afterward. Each painted observation gets a context
view and up to six close-ups; a second useful angle is included for a single
region. Camera selection tests normal-facing direction, frame coverage and
occlusion against the posed meshes. Dense strokes use at most 48 representative
visibility samples. Coverage gaps, hidden anatomy and unanchored legacy marks
are stated in review. This is a bounded framing heuristic, not a guarantee of
complete visibility or a clinically validated atlas.
- No-WebGL sessions still permit an explicit text-only assessment, with a clear
explanation that screenshots could not be prepared. Missing CVM leaves the
intake usable. No new required domains or relay escape hatches.
- `pnpm verify`: 32 tests passed (6 guidance, 5 case, 15 AI/persistence/vision,
6 skin/anatomy), plus type-check and build. Final type-check also passed after
the no-WebGL fallback adjustment.
- `pnpm test:ai:ui`: passed synthetic visual challenge, image review/staging,
unverified vision with explicit text-only sending, persistence regressions,
errors, cancellation, escaping and no-WebGL text assessment. No browser errors.
- `pnpm test:ai:transport`: real encrypted ContextVM loopback handshake, job
deduplication, two image chunks, actor isolation, image consumption and synthetic
multimodal provider call passed. Relay events exposed no plaintext key/tool data.
- `pnpm test:prototype`: actual soyLI storage/reload, 200×160, 320×560, 900×600,
1200×800, 1600×1000, host themes, absent optional domains, and emulated touch
390×844, 360×640, 844×390 passed. App-owned palette retained.
- `pnpm test:anatomy`: hosted male/female surface painting, female mark reload,
separate seated/standing observation images, restored UI pose and unverified
send gate passed. Pelvis views, painted female anatomy, desktop/phone layouts
and generated image sheets were visually inspected.
- `pnpm test:conformance`: 5 passed, 0 failed, 5 skipped (manifest, emitted wire
and lifecycle evidence not supplied). `soyli check`: passed `space-playback-6`
with Chromium 153.0.8010.12 on the final artifact.
- Final HTML: 4,105,472 bytes; SHA-256
`111984d7dd780236a4df856075481be35863bc51dc1caead4ab719ee15630a0e`.
No external script/style links. New screenshot selected as `preview-contrast.png`;
prior `preview.png` retained. Test images use synthetic information only.
- Owned preview and browser sessions stopped; localhost port 51227 verified closed.
No live paid vendor requests, public deployment, physical-phone testing or
clinical/anatomical validation were performed. Restart the bridge with
`pnpm ai:bridge` and run Test connection to check the user's actual provider/model.
## Observation layout update (2026-10-25)
Desktop allocation is 23% for About you, 30% for Your concerns, and the remaining
47% for the body map. Preserve the current app-owned white/off-black/orange
palette and the existing phone tabs and short-landscape layout. Narrow
observation panels stack paired fields using the panel's own available width.
Each observation has a keyboard-operable disclosure header with its number,
location, type, pose and selected state. Its form opens directly below that
header; one editor is open at a time, and all may be collapsed. Collapsing does
not discard data or change the selected painting target. New observations and
body-pin selections open their editor. The open/collapsed state is saved through
existing SDK session storage, with older sessions opening their selected item.
No new host capabilities or protocol changes.
Verification: `pnpm verify` passed 38 tests, type-check and build. Hosted UI
checks passed keyboard collapse/expand, retained edits, saved collapsed state,
23/47/30 column measurements, the standard desktop/phone sizes, light/dark hosts
and missing optional domains. `pnpm test:conformance`: 5 passed, 0 failed,
5 skipped (manifest/wire/lifecycle evidence unavailable). `soyli check` passed.
The extra owned preview was stopped; the existing user-owned soyLI preview was
reused and left running. The final HTML has one app document and one script.
