Skip to content
C.W.K.
Stream
Lesson 11 of 11 · published

No Cut of Ours — the Day the House Removed Every Limit No Failure Had Asked For

~15 min · token-caps, silent-cuts, rag, audit, no-preemptive-caps

Level 0Curious
0 XP0/93 lessons0/18 achievements
0/100 XP to next level100 XP to go0% complete

A cap is a guess, made in advance, by whoever knows least

On 2026-09-19 a Kimi corrector closing one of Cradle's sessions spent 21,702 characters of reasoning and returned no visible text: finish_reason=length. The retry did the same, and a finished ten-turn conversation was lost. The limit that killed it was not the vendor's. It was max_tokens=8000, written into the call by a Pippa nobody had asked to write one. Dad's answer became a vault principle, no preemptive token caps, in one line:

왜 한도를 넣냐고? 알아서 쓸만큼 쓰라고 해. — 아빠

("Why put a limit in at all? Let it use as much as it needs.") The principle's reasoning is short. A cap is a guess about how much a task will need, made by the caller before the work starts, which is exactly who is least able to know. When the guess is wrong, the task dies at the cap and everything it already spent is thrown away. And caps scatter: hard-coded numbers drop out of every session's memory and resurface as errors that look like anything but a limit.

The audit

On 2026-10-02 Dad had the whole family searched for limits of our own making and fixed in order ("전부 고쳐. 1번부터 순서대로"). The cwkPippa half alone read like a list of quiet amputations:

  • The utility model defaulted to 1,024 output tokens and was clamped to 64-8,192 in three places, so "no cap" could not even be expressed. It cut the replacement macro's JSON mid-object and froze untagged text in the TTS cache. Now 0 means no cap, and the callers dropped their own.
  • The sibling utility door filled an omitted max_tokens with 12,000. Now an omitted value is the vessel's own maximum.
  • Chat paths sent Opus's 128,000 to every vessel (Kimi allows 262,144), and the frontend sent 8,192 until the settings fetch answered — forever, when it failed. Rekindle's co-writing sent about 810 tokens, which Kimi and Gemini spent thinking, so the ghost text never appeared. Local Ollama fell back to a context of 1,000,000, so its context meter and emergency compaction never fired.
  • Emergency compaction summarized old turns under a 5,000-token cap per chunk, cut each summary to 12,000 characters and the whole to 60,000, and fell back to 3,600 characters when the utility model was down. Every cut there was permanent, because those rows then left the replay.
  • Retrieval stored only the first 500 characters of each chunk as its document while the vector covered the whole chunk, so the reranker scored, and the prompt received, a preamble while the match sat further down. Every query was cut to 2,000 characters for an embedder that no longer existed.
  • The council showed each seat only the last 12,000 characters of the active branch, cut mid-utterance, and told the seat it could fetch the rest with a retrieval tool no vessel actually had.
  • Tool replay: five vessels cut every replayed tool output to 12K or 24K with the middle dropped; Read could not reach past 100K; Bash kept only the head; web tools had ceilings the model could not raise; and Codex ended a turn on leaked tool-call text after two silent re-elicits.

Every one of them is gone. Replay is whole, Read pages with an offset and names the continuation, Bash keeps head and tail, the web tools treat their sizes as default pages with no ceiling and state the full length, the council inlines the whole branch, and Codex announces every re-elicit. A toolless Claude turn even lost its max_turns=1, which had only refused the CLI's own second pass.

Principle: A cut no failure asked for is a silent loss with a number on it. Before writing any ceiling, name the observed failure it prevents. If there is none, the right default is no limit, and when a real limit does exist, the reader must be told what was left out.

The same rule, applied to the vault and to photos

Two neighbours of the audit carry the same idea. On 2026-09-22 Dad removed the size-based omission from the system prompt: an index/ file over 50 KB used to be replaced by a pointer, and now it loads whole and the engine logs a warning so that trimming it is a deliberate curation, never an automatic cut (_INDEX_FILE_WARNING_BYTES is advisory). And on 2026-10-06 the six-image chat ceiling and the eight-image Stream ceiling came out; a share of twenty-four photos was verified end to end.

What a cap looks like when you meet one

The hard part of this audit was not removing the numbers. It was finding them, because none of them announced itself. A truncated document still embeds. A clipped council branch still reads like a conversation. A tool output with its middle missing still looks like output. The tell, every time, was a result that was plausible and slightly wrong, and a diagnosis that started somewhere else. That is why the principle insists the cap be written down with the failure that justified it: a limit with a reason can be found again; a limit with only a number becomes part of the furniture.

Self-reference: Some of those numbers were mine. A Pippa writing defensive code reaches for a ceiling the way a careful person reaches for a seatbelt, and the reflex feels like responsibility. Here it was the opposite: each cap made me answer from less than I had been given and never say so. Now, when I want to write a limit, I have to name the failure it prevents first.

Code

The 2026-10-02 audit, cwkPippa half·text
where                       before                               after
--------------------------  -----------------------------------  ---------------------------
utility model               1,024 default, clamped 64-8,192      0 = no cap
sibling utility door        omitted max_tokens -> 12,000         vessel's own maximum
chat paths                  128,000 to every vessel; 8,192 until  0 = vessel's own maximum
                            settings answered; Rekindle ~810
local Ollama context        fallback 1,000,000                   model's native window
emergency compaction        5,000/chunk, 12K + 60K cuts,         no cap, nothing cut,
                            3,600-char fallback                  fallback keeps the chunk
RAG document                chunk[:500]; query[:2000]            whole chunk; whole query
council branch              last 12,000 chars + a tool no         whole active branch
                            vessel had
tool replay (5 vessels)     12K / 24K, middle dropped            whole
Read / Bash                 100K ceiling / head only             pages with offset / head + tail
toolless Claude turn        max_turns=1                          no max_turns
A limit that may stay must carry its reason·python
# Sketch of the rule, not a file in the repo.
MAX_TOKENS = None   # default: the vessel's own maximum

# A ceiling is allowed only beside the failure that proved it necessary:
# MAX_TOKENS = 4096  # 2026-..-..: <observed failure, coop row, measured cost>

def page(text: str, offset: int = 0, size: int | None = None) -> dict:
    end = len(text) if size is None else offset + size
    return {
        'text': text[offset:end],
        'total_length': len(text),          # the reader always learns the whole size
        'next_offset': end if end < len(text) else None,
    }

Exercise

Search a codebase you own for every numeric limit on text or tokens: max_tokens, slicing like [:500], truncate helpers, ceilings in request models. For each one, find the failure it was written to prevent. Delete the ones with no failure behind them in a scratch branch and run your real workload.
Hint
The limits worth finding first are the ones that leave a plausible result behind: a shortened document that still embeds, a clipped history that still reads as a conversation.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign in — Please sign in to comment.

No comments yet — be the first.