Files
Maven/docs/world.md
T
claude 50130cdffb Move the reasoning out of CLAUDE.md and leave the rules (V-670)
490 lines still loads into every session, and most of them explained a
subsystem rather than constraining an agent. The owner's cap is 200. This
lands at exactly 200.

Four new living docs take what left:

  docs/deployment.md  the two boxes, the resident model, the embedder, STT,
                      the daemon table, who is in compose, the voice wire,
                      mavwaked on workpc, the web UI conventions
  docs/world.md       what replaced "never phones home", why Response.Empty()
                      is the whole gate, the timeouts, Kiwix
  docs/language.md    the LLM output contract and the three Russian mechanisms
  docs/workflow.md    the five stores, the doc tiers, Vikunja, the guards

CLAUDE.md keeps the pointer table and the rules. Every "do not do X", every
path and every owner's call stayed. What went is the before-and-after
narrative behind each one, which is what a living doc is for.

Verified rather than trusted. Every backticked literal in the old file was
diffed against the union of the new ones. Twenty-four came up missing and
three groups were facts rather than narrative, so they were restored:

  - the ecosystem client table (nexusClient, praxisClient, the vendored hexis
    client, the three config keys and their default URLs) into
    docs/ecosystem.md, which did not carry it
  - TestOnlyAGrammarMayDropTheBoundary and TestNamingRecallKeepsTheBoundary
    into docs/routing.md, since they pin the boundary rule in both directions
  - the ipc.Dial vs voice.Dial trap and docs/plans/17 into docs/deployment.md

diff-budget.sh blocked on the changed-line count again. It counts markdown,
which the repo's own pre-commit hook exempts, and this commit touches
nothing else.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013ptwopxyo3Z2kwFckHkLvN
2026-08-09 13:10:13 +04:00

3.2 KiB

The world chain

Last verified: 2026-08-09 @ a9b480a

What happens when the answer is not his. CLAUDE.md carries the boundary rule. This file carries the mechanism and the measurements behind it.

What replaced "never phones home"

That promise was deprecated on 2026-07-31 by the owner's call. A 1.7B does not know enough to answer world questions, so she reads external sources. Four rules replaced it:

  • No telemetry, no cloud model, no third-party account. That part never changes. Nothing about Maven is reported to anyone and inference stays on the box.
  • The owner's data first, then the world. Every source reading his facts, notes, calendar, tasks or house runs before anything outside. The personal boundary sits between them. Reading beats recalling for a small model.
  • The owner's notes and facts are never search input. Only the utterance goes out. Never the persona block, the history, or matched notes.
  • External search is allowed and off unless configured, like weather and telegram. The code default is off. deploy/mavend.json ships a search block, so it is on for this box and deleting the block turns it off again.

Live search leads and the ZIMs are the fallback (owner's call, 2026-08-02). A self-hosted SearXNG answers first. The Kiwix ZIMs on homesrv answer when the search is empty, unreachable, or the line is down.

The gate is emptiness and nothing else

Response.Empty() is the whole gate. There is no quality threshold in front of it. Four signals were tried and none separates a real question from an invented one.

Token overlap was the closest and it still fails. "столица Франции" would lose its answer, because the answer is Париж and that word is not in the question (docs/evals/2026-08-05-search-quality-signals.md).

The embedder is not a fifth signal. Query-to-passage cosine measures topic and not whether the passage answers. The two sets overlap (docs/evals/2026-08-09-kiwix-topic-retrieval.md).

Timeouts

The connect phase alone is capped at dialTimeout, 1.5s, because a blackholed host once cost the owner 8 seconds. A slow instance that did connect keeps the full 8 (docs/evals/2026-08-05-kiwix-offline-fallback.md).

Kiwix

A Russian question reads wikipedia_ru_all_maxi_2026-02 verbatim through kiwix.book_ru. The RU→EN rewriter is the workaround for an English book and is skipped there. Kiwix catalog names come from the filename, not the <name> field.

Kiwix ranks by keyword overlap. Never send it a whole sentence. kiwix.Topic drops the narrative request, the interrogative and a verb behind one.

kiwix.TitlePath tries the exact article first, since a ZIM is addressable by title and a wrong title is a 404. TitleCandidates tries the spoken form and then the capitalized one. Both apply on the verbatim path alone. The rewriter already reduces a question, and reducing twice takes the topic off its input (V-668).

Which source answered

The claiming query source is readable on /chat as a badge beside the reply. It is carried on ipc.ChatReply.Source and noted by noteQuerySource in cmd/mavend/querysource.go. It rides the context, so handleText keeps the one string signature the mic, telegram and the web share.