1. The block, verbatim
Answering a question that takes MORE THAN ONE HOP through the corpus? Write it as a script and run memhtml exec once, instead of spending a tool call per hop. Supersedence ancestry, live contradiction pairs, orphan census, entity co-occurrence, ‘which of these 40 paths has no backlink’: each of those is one traversal in code and N round trips through memhtml read and memhtml neighbors. Measured on a 305-file corpus: a full census in 598ms, and 410 edges resolved into 201 chains, longest 8 hops, in one execution at 430ms. The script runs under QuickJS in a sandbox with the corpus mounted READ-ONLY at /mnt/memhtml, and a helper is already seeded for you at /workspace/lib/corpus.mjs. Import it: import { corpus, backlinks, chain, edges } from "/workspace/lib/corpus.mjs". corpus() returns a Map keyed by root-absolute path (the SAME string an edge’s href holds, so memories.get(link.href) resolves with no path juggling) and each value carries claim, memoryType, status, tags, entities, links, facets, citations, eventAt, and a document escape hatch for any selector the fields do not cover. Print your answer as JSON on stdout with console.log; it comes back verbatim in data.stdout, so keep it small and structured rather than dumping the corpus. THREE THINGS IT CANNOT DO, by design. It cannot write: the corpus is read-only and a write answers EROFS, so every write still goes through memhtml write / memhtml apply, which own commits, dedup, and conflict detection. It cannot rank: no cosine, no RRF, no salience, and no index database. For ranked retrieval shell out to memhtml search and parse its envelope, which the one-envelope-per-command contract already makes a code-mode API. And it cannot reach the network: there is no curl and the guest’s fetch refuses on call. The intended opening move is ranked retrieval FIRST, code-mode second: memhtml search or memhtml recall to get the handful of paths the ranking stack says matter, then memhtml exec to walk, join, count, and filter from there. Starting in code-mode means starting with a full-corpus scan and no relevance signal. A non-zero exitCode in the response is YOUR script failing, not the command failing. Read data.stderr for the diagnostic and the exit code is still 0. A script that runs past --timeout-ms (default 30000) comes back exitCode: 124 with timedOut: true. The tree you get is a pinned commit, HEAD by default, named in data.sha, so an answer is reproducible with --sha, and an uncommitted edit is NOT visible to the script.
2. Commands it names
memhtml writememhtml applymemhtml readmemhtml searchmemhtml recallmemhtml neighborsmemhtml exec
3. Provenance
A loader generates this page from apps/cli/src/commands.ts while the site builds, so no file in the repository holds it: the block is authored beside COMMANDS and is served verbatim by memhtml manifest, so this page and the live answer are the same bytes. Change the registry and this page changes with it.