docsconcepts
how one question becomes the few sections that answer it, inside a hard budget.
6 pages

retrieval

A memory is only as useful as what reaches the conversation. innernet never hands an AI the whole map and hopes. Every ask goes through one door, innernet_context, and comes back as a small, ranked package with a receipt.

the one call#

json
{ "name": "innernet_context", "arguments": { "slug": "my-product", "intent": "what did we decide about pricing?" } }

intent is the question in the person's own words. Not a keyword list, not "pricing": the whole ask. The selector reads it the way a person would, and a precise question gets a precise slice. Over REST it is the same handler:

bash
curl "https://innernet.live/api/v1/context?slug=my-product&intent=what+did+we+decide+about+pricing" \
  -H "Authorization: Bearer innernet_..."

what comes back#

fieldwhat it is
read_firstOne line: answer from focus, or the memory holds nothing on this. Read it before anything else.
focusThe sections that answer the ask, best first: { dimension, section, text }. A section too long to fit is excerpted and marked partial.
peripheryA handful of near-misses, { ref, summary }: close enough to mention, not close enough to send whole.
retrieval_adviceWhat to open next if the conversation turns (usually an innernet_get_dimension call).
spineWhat this project is: name, tagline, type, its core, open tasks, what moved lately, and as_of.
mapEvery dimension by name, so nothing in the memory is out of reach.
personal_contextOnly when facts about the person bear on this ask, and only shareable ones.
sentThe receipt: which selector chose the slice, how many tokens went, how many personal facts were shared, how many private ones were withheld.
metaholds_answer, asks_about_past, and the counts behind the receipt.

the budget#

Focus has a hard ceiling of about 1,600 tokens. The package is bounded by the ask, never by the size of the memory: a map with nine hundred sections answers in the same one to two thousand tokens as a small one. That is what keeps innernet cheap to call on every turn, and it is why a good intent matters more than a big context window.

when the memory holds nothing#

meta.holds_answer: false and a read_first that says so. That is an answer, not a failure: the AI should say the memory has nothing on it rather than guess from the project name. The periphery still lists what was close, so the conversation can go there instead.

history stays out of the way#

Every dimension keeps its superseded decisions under a ## history heading. Retrieval leaves those lines out of focus, because an AI that reads "was X, now Y" next to "Y" tends to repeat the X. When the ask is about the past ("what did we use before?", "why did we change…"), meta.asks_about_past flips and the history of every admitted dimension rides along. See branches & history.

captures that haven't folded yet#

A capture lands in the commit log in milliseconds; netti folds it into dimensions afterwards. Until it does, retrieval splices recent captures in as a pending_captures section on projects you own, so something you said a minute ago is already answerable.

lean loads, full opens#

innernet_load_project is lean by default: one line per dimension, the capture protocol and a slice of personal context. It orients a session. innernet_get_dimension opens one page whole when the conversation turns that way, and full: true on a load returns every body (the REST GET /projects/{slug} always does). For answering questions, innernet_context is almost always the right call.