Token Efficiency: Where the Tokens Go

Most of a system prompt is tool definitions

Two files get passed around as leaked GPT-5.6 prompts. I cannot verify either one, and nothing below should be read as a claim about what OpenAI ships. What I can do is measure the documents themselves, because the claim people make about them is a claim about length.

The thing people say is that the prompt is enormous, around 20,000 words, and that this is evidence frontier products need giant behavioural specifications. Here we will look at where those words sit.

The two artifacts

Both come from the asgeirtj/system_prompts_leaks repository.

The first is labelled ChatGPT: 17,124 words across 2,661 lines, opening with a current-date line of 2026-07-10. The second is labelled Codex, the coding agent: 2,826 words across 167 lines, opening “You are Codex, an agent based on GPT-5.”

The 20,000 word figure refers to the chat file. The Codex file is a sixth of that length.

Counting the sections

I split the larger file on its top-level # headings and counted words per section. Sections in file order:

SectionWords
(preamble)13
Environment93
Artifacts920
Writing Blocks849
Desired oververbosity for the final answer70
Tools12,142
Developer Instructions1,392
File Search Tool471
File Search Tool1,127

# Tools starts at line 165. Everything before it, the whole behavioural specification, is 1,945 words. Everything from line 165 down is namespace definitions: python, genui, web, automations, file_search, gmail, gcal, gcontacts, python_user_visible, user_info, summary_reader, container, bio, api_tool. Fourteen namespaces, each a block of function signatures and argument types.

That single section is 71% of the file. Fold in the two trailing File Search blocks and the tool surface is about 80%.

What the agent prompt does instead

The Codex file has no # Tools section. Its headings are Personality (329 words), Working with the user (776), Rules for getting work done (733), Destructive Actions (194), Using skills (746).

That is 2,778 words of pure behaviour, against 1,945 in the chat file. The agent prompt has more behavioural instruction and a fraction of the total length, because its tools are supplied by the runtime rather than spelled out in the prompt body.

What this changes

The number people quote is a measure of API surface. A product with fourteen callable namespaces carries fourteen namespaces worth of schema, and that cost lands in the context window on every single turn whether or not the model touches Gmail that day.

The length difference between the two files tracks how many tools each one exposes. The behavioural spec in both cases sits under 3,000 words.

That is the version of the argument I care about, because it is the same accounting as tool-schema bloat in MCP: the definitions are always resident, the calls are occasional. If the 17,124 number is being used to argue that models now need long instructions, the file does not support it. If it is being used to argue that tool surface is the dominant context cost in a mature assistant, the file supports it well.

Reproducing the count

I wrote the section counter in ilo:

main path:t>t
  txt=rd!! path
  lines=flt {l> != (trm l) ""} (spl txt "\n")
  out=[]
  cur="(preamble)"
  tot=0
  @ln lines{
    toks=spl (trm ln) " "
    n=len toks
    fst=hd toks
    =fst "#"{
      out=+ out [(fmt "{}\t{}" cur tot)]
      cur=cat (slc toks 1 n) " "
      tot=0
    }
    !=fst "#"{
      tot=+ tot n
    }
  }
  out=+ out [(fmt "{}\t{}" cur tot)]
  cat out "\n"

Point it at either file and it prints the table above. Counts are whitespace-split words on non-empty lines, and heading text is dropped rather than charged to a section, so the totals run a little under wc -w on the raw file.