{
  "id": "what-compression-is",
  "title": "What compression is",
  "summary": "What travels to the model each time you say something to a chat assistant, what a cache changes, why a full conversation gets compressed, what is lost when it is, and how this team works so that the loss does not matter.",
  "by": "incident.studio@web-summit.dinis",
  "updated": "2026-11-11T00:52:00Z",
  "about": "An explanation in general terms that hold for chat assistants: the context is sent with each request; a cache reuses an unchanged beginning; a full window is summarised or cut. It describes no one product's internals. Block sizes are an illustration, not a measurement. At Dinis Cruz's word (BRIEF.md, 11 November 2026).",
  "chapters": [
    {
      "id": "no-cache",
      "title": "A normal request",
      "blocks": {
        "sys": {
          "label": "Instructions",
          "note": "the system prompt",
          "u": 1,
          "kind": "system"
        },
        "tools": {
          "label": "Tools",
          "note": "what each tool does",
          "u": 1,
          "kind": "tools"
        },
        "q1": {
          "label": "You, 1",
          "note": "What changed in the warning?"
        },
        "a1": {
          "label": "Answer 1"
        },
        "q2": {
          "label": "You, 2",
          "note": "Read the timeline file."
        },
        "a2": {
          "label": "Answer 2"
        },
        "file": {
          "label": "File read",
          "note": "the timeline's text",
          "u": 3,
          "kind": "file"
        },
        "q3": {
          "label": "You, 3",
          "note": "Who decided what?"
        },
        "a3": {
          "label": "Answer 3"
        }
      },
      "scenes": [
        {
          "caption": "Three characters. You, on the left. In the centre the app: the chat program, which keeps the conversation. On the right the model, which reads what it is sent and writes an answer. Before you type anything the app already holds two things: its instructions and the descriptions of its tools.",
          "stack": [
            "sys",
            "tools"
          ]
        },
        {
          "caption": "You say one thing. The app adds it to the bottom of the conversation.",
          "say": {
            "left": "What changed in the warning?"
          },
          "stack": [
            "sys",
            "tools",
            "q1:new"
          ]
        },
        {
          "caption": "The app sends the model everything it holds: the instructions, the tools and your message. The model reads all of it, top to bottom.",
          "say": {
            "centre": "Here is all of it."
          },
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "q1:new"
          ],
          "send": {
            "n": 1
          }
        },
        {
          "caption": "The answer comes back and joins the conversation. The model keeps nothing: once it has answered, the only copy of the conversation is the one the app holds.",
          "say": {
            "right": "Here is what changed."
          },
          "stack": [
            "sys",
            "tools",
            "q1",
            "a1:new"
          ]
        },
        {
          "caption": "Your second message is short. What travels is not: the whole conversation goes again, and the model reads all of it again, including everything it read a moment ago.",
          "say": {
            "left": "Read the timeline file."
          },
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "q1",
            "a1",
            "q2:new"
          ],
          "send": {
            "n": 2
          }
        },
        {
          "caption": "To answer, the app read a file. The file's text is now part of the conversation as well, and it is much longer than anything you typed.",
          "say": {
            "right": "I have read it."
          },
          "stack": [
            "sys",
            "tools",
            "q1",
            "a1",
            "q2",
            "file:new",
            "a2:new"
          ],
          "note": "Simplified: reading a file is itself one or more requests. Here it is folded into one turn."
        },
        {
          "caption": "Third message. The pile has grown, and all of it is sent and read again. Each turn costs more than the last and usually takes longer, because each one carries everything before it.",
          "say": {
            "left": "Who decided what?"
          },
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "q1",
            "a1",
            "q2",
            "file",
            "a2",
            "q3:new"
          ],
          "send": {
            "n": 3
          }
        },
        {
          "caption": "That is a request with no cache. You typed three short lines; the model read 18 blocks to answer them, most of them more than once. The bars show the shape: each request is longer than the one before, so the total grows faster than the conversation does. This is the picture to keep: the context is sent with every request.",
          "stack": [
            "sys",
            "tools",
            "q1",
            "a1",
            "q2",
            "file",
            "a2",
            "q3",
            "a3:new"
          ],
          "say": {
            "right": "Here is who decided what."
          }
        }
      ],
      "question": "What travels to the model when you say one thing?"
    },
    {
      "id": "with-cache",
      "title": "The same, with a cache",
      "blocks": {
        "sys": {
          "label": "Instructions",
          "note": "the system prompt",
          "u": 1,
          "kind": "system"
        },
        "tools": {
          "label": "Tools",
          "note": "what each tool does",
          "u": 1,
          "kind": "tools"
        },
        "q1": {
          "label": "You, 1",
          "note": "What changed in the warning?"
        },
        "a1": {
          "label": "Answer 1"
        },
        "q2": {
          "label": "You, 2",
          "note": "Read the timeline file."
        },
        "a2": {
          "label": "Answer 2"
        },
        "file": {
          "label": "File read",
          "note": "the timeline's text",
          "u": 3,
          "kind": "file"
        },
        "q3": {
          "label": "You, 3",
          "note": "Who decided what?"
        },
        "a3": {
          "label": "Answer 3"
        },
        "q4": {
          "label": "You, 4",
          "note": "And tomorrow?"
        }
      },
      "scenes": [
        {
          "caption": "The same conversation, the same three messages. This time the service that runs the model keeps a cache: for a while, it remembers the work it did on a beginning it has already read.",
          "say": {
            "left": "What changed in the warning?"
          },
          "stack": [
            "sys",
            "tools",
            "q1:new"
          ]
        },
        {
          "caption": "First request: the cache is empty, so nothing can be reused. Everything is read at full cost, exactly as before, and the work is kept.",
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "q1:new"
          ],
          "send": {
            "n": 1
          }
        },
        {
          "caption": "Second request. The beginning is exactly what was sent a moment ago, so it is recognised and the work on it is reused: cheaper and quicker. Only what has been added since is read at full cost.",
          "say": {
            "left": "Read the timeline file."
          },
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "q1",
            "a1",
            "q2:new"
          ],
          "send": {
            "n": 2,
            "cached": 3
          }
        },
        {
          "caption": "Third request: the same again. The unchanged beginning is longer now, so more is reused. The new end (the file, an answer, your message) is read at full cost.",
          "say": {
            "left": "Who decided what?"
          },
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "q1",
            "a1",
            "q2",
            "file",
            "a2",
            "q3:new"
          ],
          "send": {
            "n": 3,
            "cached": 5
          }
        },
        {
          "caption": "What the cache changed: cost and time. Over the same three requests the model read 10 blocks at full cost instead of 18: each request now pays in full only for what is new. The reused part is usually charged at a lower rate, not at nothing; how much lower differs from one service to another.",
          "stack": [
            "sys",
            "tools",
            "q1",
            "a1",
            "q2",
            "file",
            "a2",
            "q3:new"
          ],
          "send": {
            "n": 3,
            "cached": 5
          }
        },
        {
          "caption": "What it did not change: the conversation is exactly as long. All of it still travels with every request, the model still works from all of it, and all of it still counts against a fixed limit, the context window. A cache makes a long context cheaper. It does not make it shorter.",
          "mood": {
            "right": "idle"
          },
          "stack": [
            "sys",
            "tools",
            "q1",
            "a1",
            "q2",
            "file",
            "a2",
            "q3:new"
          ],
          "send": {
            "n": 3,
            "cached": 5
          }
        },
        {
          "caption": "And a cache only matches an unchanged beginning. Change something early (here, one line of the instructions) and everything after it is read at full cost again. Leave the conversation alone for long enough and the cache expires: the next request starts cold.",
          "say": {
            "left": "And tomorrow?"
          },
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys:changed",
            "tools",
            "q1",
            "a1",
            "q2",
            "file",
            "a2",
            "q3",
            "a3",
            "q4:new"
          ],
          "send": {
            "n": 4,
            "cached": 0
          }
        }
      ],
      "question": "What does a cache change, and what does it not?"
    },
    {
      "id": "the-door",
      "title": "The door",
      "window": 11,
      "meters": false,
      "blocks": {
        "sys": {
          "label": "Instructions",
          "note": "the system prompt",
          "u": 1,
          "kind": "system"
        },
        "tools": {
          "label": "Tools",
          "note": "what each tool does",
          "u": 1,
          "kind": "tools"
        },
        "t13": {
          "label": "Turns 1 to 3",
          "u": 2
        },
        "file": {
          "label": "File read",
          "note": "the timeline's text",
          "u": 2,
          "kind": "file"
        },
        "t49": {
          "label": "Turns 4 to 9",
          "u": 2
        },
        "file2": {
          "label": "Another file read",
          "u": 2,
          "kind": "file"
        },
        "t1012": {
          "label": "Turns 10 to 12",
          "u": 2
        },
        "q13": {
          "label": "You, 13",
          "note": "And the new forecast?"
        },
        "sum": {
          "label": "Summary of turns 1 to 9",
          "note": "and of both files",
          "u": 2
        }
      },
      "scenes": [
        {
          "caption": "Every model has a context window: the most it can be sent in one request. Picture it as a doorway of fixed size between the app and the model. So far the conversation goes through with room to spare.",
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "t13",
            "file",
            "t49"
          ],
          "send": {
            "n": 1
          }
        },
        {
          "caption": "The conversation keeps growing: more turns, another file. The doorway does not grow. The pile is now taller than the door: the hatched part is what no longer fits.",
          "stack": [
            "sys",
            "tools",
            "t13",
            "file",
            "t49",
            "file2:new",
            "t1012:new"
          ]
        },
        {
          "caption": "You say one more thing, and the request cannot be sent: it is longer than the window. A cache does not help here. It changes what a long context costs, not how long it is.",
          "say": {
            "left": "And the new forecast?"
          },
          "mood": {
            "centre": "puzzled"
          },
          "stack": [
            "sys",
            "tools",
            "t13",
            "file",
            "t49",
            "file2",
            "t1012",
            "q13:new"
          ],
          "send": {
            "n": 2,
            "blocked": true
          }
        },
        {
          "caption": "Something has to give. The crude way is to cut: drop the oldest turns, and everything in them is gone. The usual way is to compress: a model is asked to write a short summary of the older part of the conversation.",
          "say": {
            "centre": "Summarise the older turns."
          },
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "t13",
            "file",
            "t49",
            "file2",
            "t1012",
            "q13"
          ],
          "note": "Simplified: this is normally done a little before the limit, while the conversation still fits through the door to be summarised."
        },
        {
          "caption": "The summary takes the place of the middle. The instructions and tools stay; the most recent turns stay; nine turns and two files are now a few lines about them.",
          "say": {
            "right": "Here is the summary."
          },
          "stack": [
            "sys",
            "tools",
            "sum:summary",
            "t1012",
            "q13"
          ]
        },
        {
          "caption": "Now it fits through the door, and the conversation goes on. From your side the chat simply continues; it is easy to miss that anything happened.",
          "mood": {
            "right": "read"
          },
          "say": {
            "left": "And the new forecast?"
          },
          "stack": [
            "sys",
            "tools",
            "sum:summary",
            "t1012",
            "q13:new"
          ],
          "send": {
            "n": 2
          }
        },
        {
          "caption": "That is compression: the older part of a long conversation replaced by a shorter text about it, so that the work can go on. What that text kept and what it left out was decided in one moment, by a model.",
          "stack": [
            "sys",
            "tools",
            "sum:summary",
            "t1012",
            "q13"
          ]
        }
      ],
      "question": "Why does a long conversation have to be compressed?"
    },
    {
      "id": "what-gets-lost",
      "title": "What gets lost, and why",
      "window": 11,
      "meters": false,
      "blocks": {
        "sys": {
          "label": "Instructions",
          "note": "the system prompt",
          "u": 1,
          "kind": "system"
        },
        "tools": {
          "label": "Tools",
          "note": "what each tool does",
          "u": 1,
          "kind": "tools"
        },
        "t111": {
          "label": "Turns 1 to 11",
          "u": 3
        },
        "file": {
          "label": "File read",
          "u": 2,
          "kind": "file"
        },
        "rule": {
          "label": "You, 12",
          "note": "Never push to main; work on dev."
        },
        "t1320": {
          "label": "Turns 13 to 20",
          "u": 2
        },
        "t2124": {
          "label": "Turns 21 to 24",
          "u": 2
        },
        "sum": {
          "label": "Summary of turns 1 to 20",
          "note": "built the page; fixed the gate",
          "u": 2
        },
        "q25": {
          "label": "You, 25",
          "note": "Looks good. Ship it."
        },
        "a25": {
          "label": "Answer 25",
          "note": "Pushing to main."
        }
      },
      "scenes": [
        {
          "caption": "A long working session. Back in turn 12 you said one thing that mattered: never push to main; work on dev. One line among hundreds.",
          "say": {
            "left": "Never push to main; work on dev."
          },
          "stack": [
            "sys",
            "tools",
            "t111",
            "file",
            "rule:key",
            "t1320"
          ]
        },
        {
          "caption": "The work goes on, and the window fills.",
          "stack": [
            "sys",
            "tools",
            "t111",
            "file",
            "rule:key",
            "t1320",
            "t2124:new"
          ]
        },
        {
          "caption": "A model writes the summary. It has to guess which parts will matter to you later. It cannot ask you, and nothing marks turn 12 as different from the hundreds of lines around it.",
          "say": {
            "centre": "Summarise the older turns.",
            "right": "Built the page; fixed the gate; tests pass."
          },
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "t111",
            "file",
            "rule:key",
            "t1320",
            "t2124"
          ]
        },
        {
          "caption": "The summary is a good one: short, accurate. Your line from turn 12 is not in it. Nobody deleted it on purpose. It was not chosen.",
          "stack": [
            "sys",
            "tools",
            "sum:summary",
            "rule:lost",
            "t2124"
          ],
          "note": "The struck-through block is drawn to show what is missing. It is no longer in the conversation and is not sent."
        },
        {
          "caption": "Later you ask for the obvious next step. The request goes through the door: instructions, tools, the summary, the recent turns. The rule is not in what the model receives.",
          "say": {
            "left": "Looks good. Ship it."
          },
          "mood": {
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "sum:summary",
            "rule:lost",
            "t2124",
            "q25:new"
          ],
          "send": {
            "n": 1
          }
        },
        {
          "caption": "The assistant does what the conversation it was sent says, and that conversation no longer says not to. From your side it has forgotten. From its side the instruction was never there.",
          "say": {
            "right": "Pushing to main."
          },
          "mood": {
            "left": "puzzled",
            "right": "talk"
          },
          "stack": [
            "sys",
            "tools",
            "sum:summary",
            "rule:lost",
            "t2124",
            "q25",
            "a25:new"
          ]
        },
        {
          "caption": "Why things get lost: compression is a guess about what matters to you, made without you, at a moment you did not choose. The longer and more mixed the conversation, the worse the odds for any one detail.",
          "mood": {
            "left": "puzzled"
          },
          "stack": [
            "sys",
            "tools",
            "sum:summary",
            "rule:lost",
            "t2124",
            "q25",
            "a25"
          ]
        }
      ],
      "question": "Why does the assistant seem to forget?"
    },
    {
      "id": "side-by-side",
      "title": "Side by side: how this team works",
      "meters": false,
      "blocks": {
        "sys": {
          "label": "Instructions",
          "note": "the system prompt",
          "u": 1,
          "kind": "system"
        },
        "tools": {
          "label": "Tools",
          "note": "what each tool does",
          "u": 1,
          "kind": "tools"
        },
        "w1": {
          "label": "Turns 1 to 8",
          "note": "the direction, discussed",
          "u": 2
        },
        "w2": {
          "label": "Turns 9 to 30",
          "note": "sources read, dead ends",
          "u": 2,
          "kind": "file"
        },
        "w3": {
          "label": "Turns 31 to 50",
          "note": "decisions, a rule, filing",
          "u": 2
        },
        "sum": {
          "label": "Summary of turns 1 to 50",
          "u": 2
        },
        "rule": {
          "label": "Turn 37",
          "note": "Never push to main."
        },
        "q": {
          "label": "You, 51",
          "note": "Ship it."
        },
        "d1": {
          "label": "CLAUDE.md",
          "note": "the rules",
          "kind": "file"
        },
        "d2": {
          "label": "BRIEF.md",
          "note": "the direction",
          "kind": "file"
        },
        "d3": {
          "label": "status.json",
          "note": "done, next, asks",
          "kind": "file"
        },
        "q0": {
          "label": "The first message",
          "note": "Carry on from the status file."
        }
      },
      "names": {
        "agent": "An agent of this team",
        "app": "The app"
      },
      "scenes": [
        {
          "caption": "The same long conversation, twice. On one side nothing is written down outside the chat. On the other an agent of this team works the way this repository is built: when something is settled it goes into a file. First the direction, close to Dinis's words: BRIEF.md.",
          "lanes": [
            {
              "title": "A chat, left to its summary",
              "cast": {
                "left": null
              },
              "stack": [
                "sys",
                "tools",
                "w1:new"
              ]
            },
            {
              "title": "This team: written down as it goes",
              "cast": {
                "left": null,
                "centre": "agent"
              },
              "shelf": "The file system (this repository)",
              "stack": [
                "sys",
                "tools",
                "w1:new"
              ],
              "files": [
                {
                  "name": "BRIEF.md",
                  "href": "../BRIEF.html",
                  "size": "5.4 KB",
                  "note": "what Dinis asked for, close to his words",
                  "state": "new"
                }
              ],
              "say": {
                "centre": "Settled. I am writing it down."
              }
            }
          ]
        },
        {
          "caption": "Hours of reading sources become a timeline: one row per signal, each with its source and the time it was read, and the same rows as a dataset. The intermediate steps (pages fetched, dead ends, drafts) are not stored anywhere.",
          "lanes": [
            {
              "title": "A chat, left to its summary",
              "cast": {
                "left": null
              },
              "stack": [
                "sys",
                "tools",
                "w1",
                "w2:new"
              ]
            },
            {
              "title": "This team: written down as it goes",
              "cast": {
                "left": null,
                "centre": "agent"
              },
              "shelf": "The file system (this repository)",
              "stack": [
                "sys",
                "tools",
                "w1",
                "w2:new"
              ],
              "files": [
                {
                  "name": "BRIEF.md",
                  "href": "../BRIEF.html",
                  "size": "5.4 KB",
                  "note": "what Dinis asked for, close to his words"
                },
                {
                  "name": "timeline.md",
                  "href": "../incidents/2026-11-10-storm-charles/timeline.html",
                  "size": "18.0 KB",
                  "note": "one row per signal, with its source and the time read",
                  "state": "new"
                },
                {
                  "name": "data/signals.json",
                  "href": "../incidents/2026-11-10-storm-charles/data/signals.json",
                  "size": "29.2 KB",
                  "note": "the same 48 rows as a dataset",
                  "state": "new"
                }
              ]
            }
          ]
        },
        {
          "caption": "Decisions go into a decision log. The rules go into CLAUDE.md. The librarian's catalogue says what every file is and what links to it. Each agent keeps a status file: done, next, asks. Each is small, specific and linked to the others.",
          "lanes": [
            {
              "title": "A chat, left to its summary",
              "cast": {
                "left": null
              },
              "stack": [
                "sys",
                "tools",
                "w1",
                "w2",
                "w3:new"
              ]
            },
            {
              "title": "This team: written down as it goes",
              "cast": {
                "left": null,
                "centre": "agent"
              },
              "shelf": "The file system (this repository)",
              "stack": [
                "sys",
                "tools",
                "w1",
                "w2",
                "w3:new"
              ],
              "files": [
                {
                  "name": "BRIEF.md",
                  "href": "../BRIEF.html",
                  "size": "5.4 KB",
                  "note": "what Dinis asked for, close to his words"
                },
                {
                  "name": "timeline.md",
                  "href": "../incidents/2026-11-10-storm-charles/timeline.html",
                  "size": "18.0 KB",
                  "note": "one row per signal, with its source and the time read"
                },
                {
                  "name": "data/signals.json",
                  "href": "../incidents/2026-11-10-storm-charles/data/signals.json",
                  "size": "29.2 KB",
                  "note": "the same 48 rows as a dataset"
                },
                {
                  "name": "decisions.md",
                  "href": "../incidents/2026-11-10-storm-charles/decisions.html",
                  "size": "3.5 KB",
                  "note": "the decision log",
                  "state": "new"
                },
                {
                  "name": "CLAUDE.md",
                  "href": "../CLAUDE.html",
                  "size": "4.6 KB",
                  "note": "the rules, one of them: no agent ever pushes to main",
                  "state": "new"
                },
                {
                  "name": "library/",
                  "href": "../library/index.html",
                  "size": "229 entries",
                  "note": "the catalogue: what each file is, what links to it",
                  "state": "new"
                },
                {
                  "name": "library/index.json",
                  "href": "../library/index.json",
                  "size": "296 KB",
                  "note": "the catalogue as data: 229 entries",
                  "state": "new"
                },
                {
                  "name": "agents/*/status.json",
                  "href": "../agents/index.html",
                  "size": "12 files, 1.9 to 15.2 KB",
                  "note": "each agent: done, next, asks",
                  "state": "new"
                }
              ]
            }
          ]
        },
        {
          "caption": "The window fills on both sides, and both conversations are compressed in exactly the same way. The same guesses are made about what mattered.",
          "lanes": [
            {
              "title": "A chat, left to its summary",
              "cast": {
                "left": null
              },
              "stack": [
                "sys",
                "tools",
                "sum:summary"
              ],
              "say": {
                "right": "Here is the summary."
              }
            },
            {
              "title": "This team: written down as it goes",
              "cast": {
                "left": null,
                "centre": "agent"
              },
              "shelf": "The file system (this repository)",
              "stack": [
                "sys",
                "tools",
                "sum:summary"
              ],
              "files": [
                {
                  "name": "BRIEF.md",
                  "href": "../BRIEF.html",
                  "size": "5.4 KB",
                  "note": "what Dinis asked for, close to his words"
                },
                {
                  "name": "timeline.md",
                  "href": "../incidents/2026-11-10-storm-charles/timeline.html",
                  "size": "18.0 KB",
                  "note": "one row per signal, with its source and the time read"
                },
                {
                  "name": "data/signals.json",
                  "href": "../incidents/2026-11-10-storm-charles/data/signals.json",
                  "size": "29.2 KB",
                  "note": "the same 48 rows as a dataset"
                },
                {
                  "name": "decisions.md",
                  "href": "../incidents/2026-11-10-storm-charles/decisions.html",
                  "size": "3.5 KB",
                  "note": "the decision log"
                },
                {
                  "name": "CLAUDE.md",
                  "href": "../CLAUDE.html",
                  "size": "4.6 KB",
                  "note": "the rules, one of them: no agent ever pushes to main"
                },
                {
                  "name": "library/",
                  "href": "../library/index.html",
                  "size": "229 entries",
                  "note": "the catalogue: what each file is, what links to it"
                },
                {
                  "name": "library/index.json",
                  "href": "../library/index.json",
                  "size": "296 KB",
                  "note": "the catalogue as data: 229 entries"
                },
                {
                  "name": "agents/*/status.json",
                  "href": "../agents/index.html",
                  "size": "12 files, 1.9 to 15.2 KB",
                  "note": "each agent: done, next, asks"
                }
              ],
              "say": {
                "right": "Here is the summary."
              }
            }
          ]
        },
        {
          "caption": "On one side a detail is gone, and with it the rule. On the other the same detail is gone from the conversation too, and it does not matter: \"No agent ever pushes to main\" is a line in CLAUDE.md, and the agent reads the file, not its memory of the chat.",
          "lanes": [
            {
              "title": "A chat, left to its summary",
              "cast": {
                "left": null
              },
              "stack": [
                "sys",
                "tools",
                "sum:summary",
                "rule:lost",
                "q:new"
              ],
              "say": {
                "right": "Pushing to main."
              },
              "mood": {
                "centre": "puzzled"
              }
            },
            {
              "title": "This team: written down as it goes",
              "cast": {
                "left": null,
                "centre": "agent"
              },
              "shelf": "The file system (this repository)",
              "stack": [
                "sys",
                "tools",
                "sum:summary",
                "rule:lost",
                "q:new"
              ],
              "files": [
                {
                  "name": "BRIEF.md",
                  "href": "../BRIEF.html",
                  "size": "5.4 KB",
                  "note": "what Dinis asked for, close to his words"
                },
                {
                  "name": "timeline.md",
                  "href": "../incidents/2026-11-10-storm-charles/timeline.html",
                  "size": "18.0 KB",
                  "note": "one row per signal, with its source and the time read"
                },
                {
                  "name": "data/signals.json",
                  "href": "../incidents/2026-11-10-storm-charles/data/signals.json",
                  "size": "29.2 KB",
                  "note": "the same 48 rows as a dataset"
                },
                {
                  "name": "decisions.md",
                  "href": "../incidents/2026-11-10-storm-charles/decisions.html",
                  "size": "3.5 KB",
                  "note": "the decision log"
                },
                {
                  "name": "CLAUDE.md",
                  "href": "../CLAUDE.html",
                  "size": "4.6 KB",
                  "note": "the rules, one of them: no agent ever pushes to main",
                  "state": "read"
                },
                {
                  "name": "library/",
                  "href": "../library/index.html",
                  "size": "229 entries",
                  "note": "the catalogue: what each file is, what links to it"
                },
                {
                  "name": "library/index.json",
                  "href": "../library/index.json",
                  "size": "296 KB",
                  "note": "the catalogue as data: 229 entries"
                },
                {
                  "name": "agents/*/status.json",
                  "href": "../agents/index.html",
                  "size": "12 files, 1.9 to 15.2 KB",
                  "note": "each agent: done, next, asks"
                }
              ],
              "say": {
                "centre": "CLAUDE.md says dev only. Pushing to dev."
              },
              "mood": {
                "centre": "glad"
              }
            }
          ]
        },
        {
          "caption": "A fresh agent, a new session with nothing in its head, does not read the old conversation at all. It reads the documents. The agent that made this animation started that way: four files, CLAUDE.md, BRIEF.md, agents/JOBS.md and design/README.md, 19.7 KB in all, and none of the conversations that produced them.",
          "lanes": [
            {
              "title": "A chat, left to its summary",
              "cast": {
                "left": null
              },
              "stack": [
                "sys",
                "tools",
                "sum:summary",
                "q"
              ]
            },
            {
              "title": "This team: written down as it goes",
              "cast": {
                "left": null,
                "centre": "fresh"
              },
              "shelf": "The file system (this repository)",
              "stack": [
                "sys",
                "tools",
                "d1:doc",
                "d2:doc",
                "d3:doc",
                "q0:new"
              ],
              "files": [
                {
                  "name": "BRIEF.md",
                  "href": "../BRIEF.html",
                  "size": "5.4 KB",
                  "note": "what Dinis asked for, close to his words",
                  "state": "read"
                },
                {
                  "name": "timeline.md",
                  "href": "../incidents/2026-11-10-storm-charles/timeline.html",
                  "size": "18.0 KB",
                  "note": "one row per signal, with its source and the time read"
                },
                {
                  "name": "data/signals.json",
                  "href": "../incidents/2026-11-10-storm-charles/data/signals.json",
                  "size": "29.2 KB",
                  "note": "the same 48 rows as a dataset"
                },
                {
                  "name": "decisions.md",
                  "href": "../incidents/2026-11-10-storm-charles/decisions.html",
                  "size": "3.5 KB",
                  "note": "the decision log"
                },
                {
                  "name": "CLAUDE.md",
                  "href": "../CLAUDE.html",
                  "size": "4.6 KB",
                  "note": "the rules, one of them: no agent ever pushes to main",
                  "state": "read"
                },
                {
                  "name": "library/",
                  "href": "../library/index.html",
                  "size": "229 entries",
                  "note": "the catalogue: what each file is, what links to it"
                },
                {
                  "name": "library/index.json",
                  "href": "../library/index.json",
                  "size": "296 KB",
                  "note": "the catalogue as data: 229 entries"
                },
                {
                  "name": "agents/*/status.json",
                  "href": "../agents/index.html",
                  "size": "12 files, 1.9 to 15.2 KB",
                  "note": "each agent: done, next, asks",
                  "state": "read"
                }
              ],
              "say": {
                "centre": "I read the files. I know where we are."
              },
              "mood": {
                "centre": "glad",
                "right": "read"
              },
              "send": {
                "n": 1
              }
            }
          ]
        },
        {
          "caption": "Dinis's words for it (BRIEF.md): a massive conversation, then a document \"always going to be smaller than the conversation ... but more of a cohesive document\". Writing the document is compression too. The difference is who does it and when: whoever is doing the work, on purpose, while they still know what matters.",
          "lanes": [
            {
              "title": "A chat, left to its summary",
              "cast": {
                "left": null
              },
              "stack": [
                "sys",
                "tools",
                "sum:summary",
                "q"
              ]
            },
            {
              "title": "This team: written down as it goes",
              "cast": {
                "left": null,
                "centre": "fresh"
              },
              "shelf": "The file system (this repository)",
              "stack": [
                "sys",
                "tools",
                "d1:doc",
                "d2:doc",
                "d3:doc",
                "q0"
              ],
              "files": [
                {
                  "name": "BRIEF.md",
                  "href": "../BRIEF.html",
                  "size": "5.4 KB",
                  "note": "what Dinis asked for, close to his words"
                },
                {
                  "name": "timeline.md",
                  "href": "../incidents/2026-11-10-storm-charles/timeline.html",
                  "size": "18.0 KB",
                  "note": "one row per signal, with its source and the time read"
                },
                {
                  "name": "data/signals.json",
                  "href": "../incidents/2026-11-10-storm-charles/data/signals.json",
                  "size": "29.2 KB",
                  "note": "the same 48 rows as a dataset"
                },
                {
                  "name": "decisions.md",
                  "href": "../incidents/2026-11-10-storm-charles/decisions.html",
                  "size": "3.5 KB",
                  "note": "the decision log"
                },
                {
                  "name": "CLAUDE.md",
                  "href": "../CLAUDE.html",
                  "size": "4.6 KB",
                  "note": "the rules, one of them: no agent ever pushes to main"
                },
                {
                  "name": "library/",
                  "href": "../library/index.html",
                  "size": "229 entries",
                  "note": "the catalogue: what each file is, what links to it"
                },
                {
                  "name": "library/index.json",
                  "href": "../library/index.json",
                  "size": "296 KB",
                  "note": "the catalogue as data: 229 entries"
                },
                {
                  "name": "agents/*/status.json",
                  "href": "../agents/index.html",
                  "size": "12 files, 1.9 to 15.2 KB",
                  "note": "each agent: done, next, asks"
                }
              ]
            }
          ],
          "note": "The file sizes are measured: bytes in this repository, read 11 November 2026, 00:39 UTC; they grow as the storm goes on. The conversations were not measured."
        }
      ],
      "question": "How does this team work, so that the loss does not matter?"
    },
    {
      "id": "the-point",
      "title": "The point",
      "window": 9,
      "meters": false,
      "cast": {
        "centre": "agent"
      },
      "names": {
        "agent": "An agent of this team"
      },
      "blocks": {
        "sys": {
          "label": "Instructions",
          "note": "the system prompt",
          "u": 1,
          "kind": "system"
        },
        "tools": {
          "label": "Tools",
          "note": "what each tool does",
          "u": 1,
          "kind": "tools"
        },
        "sum": {
          "label": "Summary of earlier turns",
          "u": 2
        },
        "recent": {
          "label": "The last few turns",
          "u": 2
        },
        "q": {
          "label": "You",
          "note": "What next?"
        }
      },
      "scenes": [
        {
          "caption": "Compression still happens. It stops mattering when the file system is the memory: documents that are specific, linked to each other, and hold what actually matters. The conversation is where the work is done. The files are what is kept.",
          "say": {
            "left": "What next?",
            "centre": "It is in the status file."
          },
          "mood": {
            "centre": "glad",
            "right": "read"
          },
          "stack": [
            "sys",
            "tools",
            "sum:summary",
            "recent",
            "q:new"
          ],
          "send": {
            "n": 1
          },
          "files": [
            {
              "name": "BRIEF.md",
              "href": "../BRIEF.html",
              "size": "5.4 KB",
              "note": "what Dinis asked for, close to his words"
            },
            {
              "name": "CLAUDE.md",
              "href": "../CLAUDE.html",
              "size": "4.6 KB",
              "note": "the rules, one of them: no agent ever pushes to main"
            },
            {
              "name": "timeline.md",
              "href": "../incidents/2026-11-10-storm-charles/timeline.html",
              "size": "18.0 KB",
              "note": "one row per signal, with its source and the time read"
            },
            {
              "name": "data/signals.json",
              "href": "../incidents/2026-11-10-storm-charles/data/signals.json",
              "size": "29.2 KB",
              "note": "the same 48 rows as a dataset"
            },
            {
              "name": "decisions.md",
              "href": "../incidents/2026-11-10-storm-charles/decisions.html",
              "size": "3.5 KB",
              "note": "the decision log"
            },
            {
              "name": "library/",
              "href": "../library/index.html",
              "size": "229 entries",
              "note": "the catalogue: what each file is, what links to it"
            },
            {
              "name": "agents/*/status.json",
              "href": "../agents/index.html",
              "size": "12 files, 1.9 to 15.2 KB",
              "note": "each agent: done, next, asks",
              "state": "read"
            }
          ],
          "shelf": "The file system (this repository)"
        }
      ],
      "question": "So what is the point?"
    }
  ],
  "simplifies": [
    "Blocks are an illustration. Real context is counted in tokens (pieces of words), and one file can outweigh a hundred messages. No conversation was measured for this; only the files in chapter 5 are real measurements.",
    "One turn is drawn as one request. A turn in which the assistant uses tools is several requests, each carrying the whole context so far, so the re-reading is greater than drawn.",
    "The bars under chapters 1 and 2 show a shape, not a price. If every turn added the same amount, the total read without a cache would grow roughly with the square of the number of turns, and the part read at full cost with a cache roughly in a straight line. Real turns are uneven, and reused parts still cost something.",
    "The cache is drawn as all or nothing per block. Real caches differ from one service to another: what can be cached, the smallest size, how long it is kept, whether you must ask for it, and what a reused part costs. None of those details is stated here.",
    "\"Read at full cost\" and \"reused\" describe cost and time. With or without a cache, the model's answer depends on the whole context it was sent.",
    "Compression is drawn as one summary replacing the middle. Assistants differ: some cut the oldest turns, some summarise more than once, some keep certain things (instructions, recent files) outside the summary, and when it happens differs too. What is common is that something shorter stands in for something longer.",
    "The loss in chapter 4 is one invented example, chosen to be small and clear. A summary may well keep such a line; the point is that nothing guarantees it, and you are not asked.",
    "Files are not free either. A document is read into the context like anything else, a stale document misleads, and a rule in a file works only if the agent reads the file. This team's answer is small, dated, linked files and a catalogue (the library); that is a practice, and it can fail.",
    "\"Smaller than the conversation that produced it\" is Dinis Cruz's description of how the work goes (BRIEF.md), not a measurement: the conversations behind these files are not kept, which is the point."
  ],
  "sources": [
    {
      "name": "BRIEF.md",
      "href": "../BRIEF.html",
      "size": "5,421 bytes",
      "read": "11 November 2026, 00:39 UTC",
      "note": "Dinis's direction, including the Studio and the words quoted in chapter 5"
    },
    {
      "name": "CLAUDE.md",
      "href": "../CLAUDE.html",
      "size": "4,557 bytes",
      "read": "11 November 2026, 00:39 UTC",
      "note": "the rule used as the example: no agent ever pushes to main"
    },
    {
      "name": "incidents/2026-11-10-storm-charles/timeline.md",
      "href": "../incidents/2026-11-10-storm-charles/timeline.html",
      "size": "18,038 bytes",
      "read": "11 November 2026, 00:39 UTC"
    },
    {
      "name": "incidents/2026-11-10-storm-charles/data/signals.json",
      "href": "../incidents/2026-11-10-storm-charles/data/signals.json",
      "size": "29,191 bytes, 48 rows",
      "read": "11 November 2026, 00:39 UTC"
    },
    {
      "name": "incidents/2026-11-10-storm-charles/decisions.md",
      "href": "../incidents/2026-11-10-storm-charles/decisions.html",
      "size": "3,508 bytes",
      "read": "11 November 2026, 00:39 UTC"
    },
    {
      "name": "library/ (the librarian's catalogue)",
      "href": "../library/index.html",
      "size": "229 entries",
      "read": "11 November 2026, 00:39 UTC"
    },
    {
      "name": "library/index.json (built by tools/library-index.mjs, not tracked)",
      "href": "../library/index.json",
      "size": "296,196 bytes, 229 entries",
      "read": "11 November 2026, 00:39 UTC"
    },
    {
      "name": "agents/*/status.json",
      "href": "../agents/index.html",
      "size": "12 files, 1,951 to 15,223 bytes",
      "read": "11 November 2026, 00:39 UTC"
    },
    {
      "name": "agents/JOBS.md and design/README.md",
      "href": "../agents/JOBS.html",
      "size": "5,978 and 3,698 bytes",
      "read": "11 November 2026, 00:39 UTC",
      "note": "with CLAUDE.md and BRIEF.md, the four files this animation's agent read to start: 19,654 bytes"
    }
  ]
}
