# Body — what you can do

<!-- GENERATED by ops/tools/skill-sync — do not edit by hand. Run pnpm skills:sync. -->

<!-- GENERATED by ops/tools/skill-sync — do not edit by hand. Run `pnpm skills:sync`. -->

# Body — what you can do

`/admin/d/body` · pillar `apps`

Explore a sourced anatomical graph in 3D — structures, typed relationships, systems, path tracing, lessons and a tutor that answers from the graph.

## Fetch this, never remember it

These change per install and per release. Call for them - a list written here would be a future lie.

| What | Call | Why |
|---|---|---|
| which bodies this install actually has | `GET /api/body/species` | the atlas is species-agnostic and an install may have more than the two Leumas ships. Never assume "human" — and never assume its variants are male and female, because a species defines its own. |
| what a structure is, in full, with its sources | `GET /api/body/:species/:variant/structures/:id` | this is the one call that returns parents, children, blood supply, drainage, innervation and provenance together. Assembling it from four calls gets the de-duplication wrong: the same fact reaches the graph from several directions and this endpoint merges the evidence rather than printing the phrenic nerve three times. |
| whether this install can DRAW a structure | `GET /api/body/:species/:variant/model-manifest` | `schematic: true` means the geometry is primitives at roughly the right position — not organ shape. Any surface or answer that shows it must say so. A structure absent from `structures` here is fully usable and simply not drawable. |
| the closed relationship vocabulary | `GET /api/body/relations` | a traversal filtered on an invented type returns nothing and looks like a data gap. These are the only 64 that exist. |
| what this install may redistribute | `GET /api/body/licenses` | Uberon and OpenStax are both CC BY — attribution is a condition, not a courtesy. The manifest also records what was deliberately NOT taken and why. |

## How to actually do things here

Written by hand, because the order and the traps are the part no file can derive.

### Answer an anatomy question factually

1. `POST /api/body/:species/:variant/ask` with `{ question }`.
2. Read `facts` — that is the graph's answer. Read `sources` — that is where it came from.
3. Apply `visualActions` to the viewer if one is open, so what you say and what is highlighted cannot disagree.

**Trap:** Do NOT answer from memory when this returns `answerable: true` — the whole point is that the claim is traceable. When it returns `answerable: false`, `note` says why: an unresolved name, or a route the dataset does not record. Report that rather than filling the gap.

### Find a structure by name

1. `GET /api/body/:species/:variant/search?q=…` and read `how` on the top result.
2. Use the `id`, never the name, for everything downstream.

**Trap:** `how: "fuzzy"` is a SUGGESTION, not a resolution — "femer" scores the same against "femur" as "ileum" does against "ilium", so no threshold can separate a helpful correction from a dangerous one. The resolver refuses to promote a fuzzy hit and so must you.

### Answer "which bones are in the hand"

1. `GET /api/body/:species/:variant/structures/:id/contains?category=bone` with the hand's id.
2. Or `POST /api/body/:species/:variant/ask` with the question and let it resolve the container.

**Trap:** Never write the list down. It is derived from the graph, it differs between variants, and it changes when the dataset is refreshed. `within` accepts a structure, a REGION or a SYSTEM id — the hand resolves to a region, and a containment walk from a region id would return nothing if the endpoint did not handle all three.

### Trace a flow — blood, air, food, urine

1. `POST /api/body/:species/:variant/path` with `{ from, to }`.
2. Read `steps` for the typed hops and `nodes` for the route.

**Trap:** The default relation set is FLOW only, deliberately: including `part_of` would let a path claim that blood travels from the heart to the thorax. `found: false` means those edges are not recorded — it is never evidence that no route exists in the body.

### Compare two bodies

1. Load both variants and diff their structure sets, or call the app action `compareVariants`.
2. Restrict with `system` to make the answer readable.

**Trap:** Shared anatomy keeps the SAME canonical id across variants, which is what makes a diff meaningful and a selection survive a switch. A structure missing from one side is absent from that body, not hidden in it.

### Add another species

1. Write `data/species/<id>/ingest.profile.json` (from an ontology) or the five dataset files by hand.
2. Add the id to `SHIPPED_SPECIES` in `shared/packages/body/data/species/index.js`.
3. `node ops/tools/anatomy-ingest/index.mjs update uberon --species <id>` then `… validate`.

**Trap:** No engine code changes, and that claim is enforced: `test/cross-species.test.js` loads the synthetic `test-organism` through the same path and asserts every surface works on it. A dataset that does not validate is NOT written — replacing biology with something unvalidated is worse than shipping the previous release.

## Tabs

Every one is a real URL. A tab with its own section below carries a real job.

| Tab | Path | Group | What it is for |
|---|---|---|---|
| `(index)` | - | - | - |
| `tree` | - | - | - |
| `graph` | - | - | - |
| `lessons` | - | - | - |
| `sources` | - | - | - |

## API

Mounted prefixes that serve this domain: `/api/body`

The full route table is `leumas-capabilities/reference/api-routes.md`.



---
Source: .claude/skills/leumas-studio/reference/domains/body.md
Canonical: https://docs.leumas.tech/p/skills/leumas-studio/domains/body
