Superseded again (2026-08-06): the manual leaves the block — the lean pointer returns, this time with the
evidence the first attempt lacked. The eager channel was indicted from inside a live claude-code session, on
three counts. Staleness: the instructions block in the running conversation's system prompt was an older build
than the server's current var — pre-__q recipes ((q/catch (__r/res 12) identity)) where the var, verified
identical to disk, teaches (__q/then …) — and it stayed stale through a CLI restart and two /mcp reconnects,
so the 2026-08-05 refresh-on-reconnect measurement does not generalize to long-lived continued conversations.
Eager instructions are a cache with no invalidation, serving a server that hot-reloads daily. Truncation: the
sleeper argument ran backwards — the block was observed cut mid-manual (… [truncated]) after the session
compacted; a long block is first in line for the knife, and a two-sentence one is effectively untruncatable.
(Whether claude-code also caps at delivery is unattributed from inside a compacted session; a fresh-session check
settles it.) This also explains the standing smoke-test observation that tenants pull outline despite
"holding" the manual: they need to. Cost: eager is paid by every conversation in a project carrying the
.mcp.json (~2.7 k tokens: ~1 k prose + ~1.7 k rendered manual, measured live), REPL used or not; and push
cannot dedupe — a server composes instructions blind to the client's other connections, so a local+prod pair
ships the surface twice, where pull dedupes for free because the puller knows what it already holds.
The successor design, settled 2026-08-06. The intro message goes lean (~80 tokens) and carries only what must be
eager — when and whether, never how: the fit ("prefer it for navigating and reading Clojure — namespaces,
signatures, docstrings, source, live data — where it is faster and more precise than file search"), phrased
affirmatively on purpose, because a use-only-when-you-must framing would suppress exactly the read-only calls
where (__r/nses) beats a file scan; the safety fact ("not a sandbox"), which governs effectful evals before any
manual is read and whose seriousness the model infers together with the environment; and the pointer — before
your first eval, run (__r/manual), unless already read in this conversation — the dedup clause living in the
only place dedup can (the puller). (__r/manual) is a small genuine build (the prose currently has no eval-side
path at all): the __r outline with docstrings as the return value — live, evergreen by construction — and the
authored prose as a println riding ;; out; value for the live half, print for the authored half is the honest
rendering of each side's provenance. Transport pre-verified: the outline renders to 8.2 k chars under the dumb
cap untruncated (*print-length* bounds collections, not strings, and the bulk is docstrings), and the out
channel is uncapped — nothing waits on shape. Around it: init! may take a self-description woven into the
intro ("here, the production system behind …") — the server naming its own environment in its own voice, which
redeems the earlier wish to set the client-visible name from init! (settled the same day: that name is
client-owned, the .mcp.json/claude mcp add config key, with server-info's name ignored for display); a
:manual-read session mark set when manual runs, with an optional footer nudge on responses until it is —
keys stay in the model's hands, ignorance just can't stay silent — doubling as the compliance measurement.
README queue: the server-entry naming scheme (mpf-local-repl / mpf-prod-repl — the config name is the
model's only handle on which system it addresses, a safety affordance for prod), the responsibility note
(local is the presumed case; wiring prod is a deliberate act whose consequences belong to the wirer), and
project-scoped .mcp.json as the distribution vehicle. The smoke-test criterion is the usual one — fresh tenant,
manual called before the first real eval, first-eval competence held.
Built and wire-verified the same day. instructions.md renamed manual.md (first paragraph ceded to the intro,
manual-reference sentence reworded for the new delivery); api/manual marks, prints the prose, returns the
publics-only outline — and slurps the markdown per call, so prose edits now reach callers with no reload at all,
an upgrade on the old load-time composition; session/manual-read! guarded like note!, making the sessionless
in-process caller a no-op; the footer nudge computed at response build, so a manual call's own response arrives
already unmarked; mcp/config + configure! behind defonce, filled by init! before the port opens (:describe
in the defaults map, nil silent); render-manual deleted and the io/outline/bare-api requires with it; the
eval description's fallback pointer now names (__r/manual). Verified live: the lean block serves at 512 chars
(down from 10.8 k); the describe variant weaves (here: …) correctly and probe sessions were released after
measuring; the unread note appeared on this session's responses immediately after reload — first response still
rendered by the pre-reload handler captured at dispatch, the next one nudging — and (__r/manual) returned the
full outline (privates absent), printed the prose whole under ;; out, and retired the note from the very
response that carried it.
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |