Body
<!-- 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
POST /api/body/:species/:variant/askwith{ question }.- Read
facts— that is the graph's answer. Readsources— that is where it came from. - Apply
visualActionsto 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
GET /api/body/:species/:variant/search?q=…and readhowon the top result.- 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"
GET /api/body/:species/:variant/structures/:id/contains?category=bonewith the hand's id.- Or
POST /api/body/:species/:variant/askwith 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
POST /api/body/:species/:variant/pathwith{ from, to }.- Read
stepsfor the typed hops andnodesfor 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
- Load both variants and diff their structure sets, or call the app action
compareVariants. - Restrict with
systemto 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
- Write
data/species/<id>/ingest.profile.json(from an ontology) or the five dataset files by hand. - Add the id to
SHIPPED_SPECIESinshared/packages/body/data/species/index.js. 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.