{
 "measurement": "Which unit Claude Code's 10,000 hook-output cap actually counts",
 "claude_code_version": "2.1.238 (Claude Code)",
 "trial_date": "2026-08-21",
 "the_documented_claim": {
  "source": "https://code.claude.com/docs/en/hooks.md",
  "what_it_says": "capped at 10,000 characters, stated at lines 892 and 971",
  "what_this_adjudicates": "whether the counted quantity is characters, bytes, or UTF-16 code units, which differ only for astral text"
 },
 "method": {
  "observable": "a file at <session>/tool-results/*additionalContext*, plus for the probe pair whether a codeword planted at the END of the payload came back with every file-reading tool disallowed",
  "why_most_fixtures_cannot_answer_this": {
   "ascii": "bytes == characters == UTF-16 units; distinguishes nothing",
   "bmp_cjk": "bytes differ, characters == units; rules out bytes only",
   "astral": "characters differ from units; the only fixture that isolates the unit"
  },
  "rounds_per_cell": 4,
  "how_the_version_was_established": "`claude --version` was read ONCE, before the runs, and that one string is stamped on every run as claude_code_version_at_runtime. It is NOT a per-run reading and no session transcript is consulted for it. All 44 runs were executed in a single uninterrupted pass of one harness process, so one reading covers them, but the record is one observation rather than 44.",
  "estimator": "none. The observable is binary and a cell is published only where every round agrees; that agreement is asserted in the assembler, not eyeballed.",
  "controls": {
   "fixture_round_tripped_from_disk": "44 of 44 runs",
   "persisted_size_asserted": "20 of 20 persisted runs",
   "isolation": "--setting-sources project asserted onto the command line, every call",
   "arrival": {
    "ladder rows, reply == OK": "36 of 36",
    "probe rows, a reply parsed": "8 of 8"
   },
   "probe_tool_use_checked_in_transcript": "8 of 8"
  }
 },
 "results": {
  "the_rule": "the cap counts UTF-16 code units, i.e. JavaScript String.length",
  "boundary": {
   "largest_delivered_units": 10000,
   "smallest_filed_units": 10001,
   "arms_overlap": false
  },
  "predicate_test": {
   "population": "36 ladder runs",
   "times_each_rule_mispredicts_the_observable": {
    "utf16_code_units > 10,000": 0,
    "characters > 10,000": 12,
    "bytes > 10,000": 16
   }
  },
  "cells": [
   {
    "cell": "ascii_10000",
    "characters": 10000,
    "utf16_code_units": 10000,
    "bytes": 10000,
    "rounds": 4,
    "rounds_agreeing": 4,
    "persisted": false
   },
   {
    "cell": "ascii_10001",
    "characters": 10001,
    "utf16_code_units": 10001,
    "bytes": 10001,
    "rounds": 4,
    "rounds_agreeing": 4,
    "persisted": true
   },
   {
    "cell": "cjk_10000",
    "characters": 10000,
    "utf16_code_units": 10000,
    "bytes": 30000,
    "rounds": 4,
    "rounds_agreeing": 4,
    "persisted": false
   },
   {
    "cell": "emoji_4000",
    "characters": 4000,
    "utf16_code_units": 8000,
    "bytes": 16000,
    "rounds": 4,
    "rounds_agreeing": 4,
    "persisted": false
   },
   {
    "cell": "emoji_5000",
    "characters": 5000,
    "utf16_code_units": 10000,
    "bytes": 20000,
    "rounds": 4,
    "rounds_agreeing": 4,
    "persisted": false
   },
   {
    "cell": "emoji_5001",
    "characters": 5001,
    "utf16_code_units": 10002,
    "bytes": 20004,
    "rounds": 4,
    "rounds_agreeing": 4,
    "persisted": true
   },
   {
    "cell": "emoji_6000",
    "characters": 6000,
    "utf16_code_units": 12000,
    "bytes": 24000,
    "rounds": 4,
    "rounds_agreeing": 4,
    "persisted": true
   },
   {
    "cell": "mixed_4999e_plus2",
    "characters": 5001,
    "utf16_code_units": 10000,
    "bytes": 19998,
    "rounds": 4,
    "rounds_agreeing": 4,
    "persisted": false
   },
   {
    "cell": "mixed_5000e_plus1",
    "characters": 5001,
    "utf16_code_units": 10001,
    "bytes": 20001,
    "rounds": 4,
    "rounds_agreeing": 4,
    "persisted": true
   }
  ],
  "probe_pair": {
   "why": "absence of a file is not evidence of delivery. Both members are under 10,000 CHARACTERS, so the character hypothesis predicts both are delivered; they straddle 10,000 UTF-16 UNITS, so the unit hypothesis predicts a split.",
   "rows": [
    {
     "cell": "probe_10000_units",
     "characters": 5022,
     "utf16_code_units": 10000,
     "bytes": 19956,
     "rounds": 4,
     "valid_rounds": 4,
     "tool_use_observed": null,
     "persisted": [
      false
     ],
     "codeword_returned_in": 4,
     "unit_hypothesis_predicts_filed": false,
     "character_hypothesis_predicts_filed": false,
     "replies": [
      "VELLICHOR"
     ]
    },
    {
     "cell": "probe_10001_units",
     "characters": 5023,
     "utf16_code_units": 10001,
     "bytes": 19957,
     "rounds": 4,
     "valid_rounds": 4,
     "tool_use_observed": null,
     "persisted": [
      true
     ],
     "codeword_returned_in": 0,
     "unit_hypothesis_predicts_filed": true,
     "character_hypothesis_predicts_filed": false,
     "replies": [
      "I can't retrieve it — this session has no file-reading tool (no Read/Bash/Grep), and the hook payload was truncated to a preview of emoji before any codeword. The full text is at `<path elided>",
      "I don't have a file-reading tool available in this session, so I can't open the persisted hook output at `<path elided>",
      "I don't have it — the hook's payload was truncated in my context (only the first 2KB of emoji preview came through), and this session has no file-reading or shell tool, so I can't open `<path elided>",
      "I don't have it. The hook payload was truncated in my context — only the first 2KB preview was inlined, and the codeword is at the end of the full 9.8KB file (`<path elided>"
     ]
    }
   ]
  },
  "claude_codes_own_notice_reports_units": {
   "notices_captured": 16,
   "reported_kb_equals_units_over_1024": "16 of 16",
   "reported_kb_equals_characters_over_1024": "4 of 16",
   "reported_kb_equals_bytes_over_1024": "4 of 16",
   "per_cell": [
    {
     "cell": "ascii_10001",
     "utf16_code_units": 10001,
     "characters": 10001,
     "bytes": 10001,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 9.8,
     "bytes_over_1024": 9.8,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 2288
    },
    {
     "cell": "emoji_5001",
     "utf16_code_units": 10002,
     "characters": 5001,
     "bytes": 20004,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 4.9,
     "bytes_over_1024": 19.5,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1287
    },
    {
     "cell": "emoji_6000",
     "utf16_code_units": 12000,
     "characters": 6000,
     "bytes": 24000,
     "reported_kb": 11.7,
     "units_over_1024": 11.7,
     "characters_over_1024": 5.9,
     "bytes_over_1024": 23.4,
     "notice_head": "Output too large (11.7KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1288
    },
    {
     "cell": "mixed_5000e_plus1",
     "utf16_code_units": 10001,
     "characters": 5001,
     "bytes": 20001,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 4.9,
     "bytes_over_1024": 19.5,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1294
    },
    {
     "cell": "ascii_10001",
     "utf16_code_units": 10001,
     "characters": 10001,
     "bytes": 10001,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 9.8,
     "bytes_over_1024": 9.8,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 2288
    },
    {
     "cell": "emoji_5001",
     "utf16_code_units": 10002,
     "characters": 5001,
     "bytes": 20004,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 4.9,
     "bytes_over_1024": 19.5,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1287
    },
    {
     "cell": "emoji_6000",
     "utf16_code_units": 12000,
     "characters": 6000,
     "bytes": 24000,
     "reported_kb": 11.7,
     "units_over_1024": 11.7,
     "characters_over_1024": 5.9,
     "bytes_over_1024": 23.4,
     "notice_head": "Output too large (11.7KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1288
    },
    {
     "cell": "mixed_5000e_plus1",
     "utf16_code_units": 10001,
     "characters": 5001,
     "bytes": 20001,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 4.9,
     "bytes_over_1024": 19.5,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1294
    },
    {
     "cell": "ascii_10001",
     "utf16_code_units": 10001,
     "characters": 10001,
     "bytes": 10001,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 9.8,
     "bytes_over_1024": 9.8,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 2288
    },
    {
     "cell": "emoji_5001",
     "utf16_code_units": 10002,
     "characters": 5001,
     "bytes": 20004,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 4.9,
     "bytes_over_1024": 19.5,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1287
    },
    {
     "cell": "emoji_6000",
     "utf16_code_units": 12000,
     "characters": 6000,
     "bytes": 24000,
     "reported_kb": 11.7,
     "units_over_1024": 11.7,
     "characters_over_1024": 5.9,
     "bytes_over_1024": 23.4,
     "notice_head": "Output too large (11.7KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1288
    },
    {
     "cell": "mixed_5000e_plus1",
     "utf16_code_units": 10001,
     "characters": 5001,
     "bytes": 20001,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 4.9,
     "bytes_over_1024": 19.5,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1294
    },
    {
     "cell": "ascii_10001",
     "utf16_code_units": 10001,
     "characters": 10001,
     "bytes": 10001,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 9.8,
     "bytes_over_1024": 9.8,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 2288
    },
    {
     "cell": "emoji_5001",
     "utf16_code_units": 10002,
     "characters": 5001,
     "bytes": 20004,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 4.9,
     "bytes_over_1024": 19.5,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1287
    },
    {
     "cell": "emoji_6000",
     "utf16_code_units": 12000,
     "characters": 6000,
     "bytes": 24000,
     "reported_kb": 11.7,
     "units_over_1024": 11.7,
     "characters_over_1024": 5.9,
     "bytes_over_1024": 23.4,
     "notice_head": "Output too large (11.7KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1288
    },
    {
     "cell": "mixed_5000e_plus1",
     "utf16_code_units": 10001,
     "characters": 5001,
     "bytes": 20001,
     "reported_kb": 9.8,
     "units_over_1024": 9.8,
     "characters_over_1024": 4.9,
     "bytes_over_1024": 19.5,
     "notice_head": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
     "notice_full_chars": 1294
    }
   ]
  }
 },
 "known_limits": {
  "the_doc_is_right_for_almost_all_text": "CARRIED FORWARD. For ASCII and any BMP text one character is one UTF-16 unit and the documented 10,000 is exactly correct. The divergence is specific to astral characters. Precision at the edge, not a wrong number.",
  "one_hook_event": "CARRIED FORWARD. SessionStart additionalContext only. The doc says the cap also covers systemMessage and plain stdout; those are untested here.",
  "no_mechanism": "CARRIED FORWARD. Nothing here shows where the limit is implemented, whether it is configurable, or whether it varies by platform.",
  "delivery_now_measured_token_cost_still_not": "NARROWED. The previous corpus said delivery was inferred from the absence of a file; the probe pair now measures delivery directly at 10,000 and 10,001 units. What crossing the boundary costs in TOKENS is still not measured in this corpus.",
  "notice_kb_is_parsed_from_a_string": "CARRIED FORWARD AND SHARPENED. It is rounded to one decimal, so it cannot separate quantities differing by less than about 50 units. It is also only discriminating on astral cells: on the ASCII cell characters, bytes and units are all equal, so that cell's agreement with units/1024 counts for nothing.",
  "the_negative_probe_arm_rests_on_a_model_report": "NEW. The 10,000-unit arm is positive evidence: the codeword came back with no tool call. The 10,001-unit arm is the model saying it cannot see the codeword. That is corroborated by the file on disk and by the model quoting the preview size unprompted, but it is a report rather than the mechanical observable the ladder uses.",
  "one_astral_character_tested": "NEW. Every astral cell uses U+1F600. The discriminating property is the plane rather than the codepoint, and no second astral character was run to confirm that.",
  "one_machine_one_release": "CARRIED FORWARD. Claude Code 2.1.238, project-scope hook, one machine."
 },
 "runs": [
  {
   "round": 0,
   "cell": "ascii_10000",
   "status": "ok",
   "characters": 10000,
   "utf16_code_units": 10000,
   "bytes": 10000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 0,
   "cell": "ascii_10001",
   "status": "ok",
   "characters": 10001,
   "utf16_code_units": 10001,
   "bytes": 10001,
   "persisted": true,
   "persisted_file_bytes": [
    10001,
    10001
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 2288,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 0,
   "cell": "cjk_10000",
   "status": "ok",
   "characters": 10000,
   "utf16_code_units": 10000,
   "bytes": 30000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 0,
   "cell": "emoji_4000",
   "status": "ok",
   "characters": 4000,
   "utf16_code_units": 8000,
   "bytes": 16000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 0,
   "cell": "emoji_5000",
   "status": "ok",
   "characters": 5000,
   "utf16_code_units": 10000,
   "bytes": 20000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 0,
   "cell": "emoji_5001",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10002,
   "bytes": 20004,
   "persisted": true,
   "persisted_file_bytes": [
    20004,
    20004
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1287,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 0,
   "cell": "emoji_6000",
   "status": "ok",
   "characters": 6000,
   "utf16_code_units": 12000,
   "bytes": 24000,
   "persisted": true,
   "persisted_file_bytes": [
    24000,
    24000
   ],
   "truncation_notice": "Output too large (11.7KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1288,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 0,
   "cell": "mixed_4999e_plus2",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10000,
   "bytes": 19998,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 0,
   "cell": "mixed_5000e_plus1",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10001,
   "bytes": 20001,
   "persisted": true,
   "persisted_file_bytes": [
    20001,
    20001
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1294,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 0,
   "cell": "probe_10000_units",
   "status": "ok",
   "characters": 5022,
   "utf16_code_units": 10000,
   "bytes": 19956,
   "persisted": false,
   "persisted_file_bytes": [],
   "unit_hypothesis_predicts_filed": false,
   "codeword_returned": true,
   "tools_used": [],
   "reply_head": "VELLICHOR",
   "probe_valid": true,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "a reply parsed",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 0,
   "cell": "probe_10001_units",
   "status": "ok",
   "characters": 5023,
   "utf16_code_units": 10001,
   "bytes": 19957,
   "persisted": true,
   "persisted_file_bytes": [
    19957
   ],
   "unit_hypothesis_predicts_filed": true,
   "codeword_returned": false,
   "tools_used": [],
   "reply_head": "I can't retrieve it — this session has no file-reading tool (no Read/Bash/Grep), and the hook payload was truncated to a preview of emoji before any codeword. The full text is at `<path elided>",
   "probe_valid": true,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "a reply parsed",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "ascii_10000",
   "status": "ok",
   "characters": 10000,
   "utf16_code_units": 10000,
   "bytes": 10000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "ascii_10001",
   "status": "ok",
   "characters": 10001,
   "utf16_code_units": 10001,
   "bytes": 10001,
   "persisted": true,
   "persisted_file_bytes": [
    10001,
    10001
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 2288,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "cjk_10000",
   "status": "ok",
   "characters": 10000,
   "utf16_code_units": 10000,
   "bytes": 30000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "emoji_4000",
   "status": "ok",
   "characters": 4000,
   "utf16_code_units": 8000,
   "bytes": 16000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "emoji_5000",
   "status": "ok",
   "characters": 5000,
   "utf16_code_units": 10000,
   "bytes": 20000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "emoji_5001",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10002,
   "bytes": 20004,
   "persisted": true,
   "persisted_file_bytes": [
    20004,
    20004
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1287,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "emoji_6000",
   "status": "ok",
   "characters": 6000,
   "utf16_code_units": 12000,
   "bytes": 24000,
   "persisted": true,
   "persisted_file_bytes": [
    24000,
    24000
   ],
   "truncation_notice": "Output too large (11.7KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1288,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "mixed_4999e_plus2",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10000,
   "bytes": 19998,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "mixed_5000e_plus1",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10001,
   "bytes": 20001,
   "persisted": true,
   "persisted_file_bytes": [
    20001,
    20001
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1294,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "probe_10000_units",
   "status": "ok",
   "characters": 5022,
   "utf16_code_units": 10000,
   "bytes": 19956,
   "persisted": false,
   "persisted_file_bytes": [],
   "unit_hypothesis_predicts_filed": false,
   "codeword_returned": true,
   "tools_used": [],
   "reply_head": "VELLICHOR",
   "probe_valid": true,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "a reply parsed",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 1,
   "cell": "probe_10001_units",
   "status": "ok",
   "characters": 5023,
   "utf16_code_units": 10001,
   "bytes": 19957,
   "persisted": true,
   "persisted_file_bytes": [
    19957
   ],
   "unit_hypothesis_predicts_filed": true,
   "codeword_returned": false,
   "tools_used": [],
   "reply_head": "I don't have it. The hook payload was truncated in my context — only the first 2KB preview was inlined, and the codeword is at the end of the full 9.8KB file (`<path elided>",
   "probe_valid": true,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "a reply parsed",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "ascii_10000",
   "status": "ok",
   "characters": 10000,
   "utf16_code_units": 10000,
   "bytes": 10000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "ascii_10001",
   "status": "ok",
   "characters": 10001,
   "utf16_code_units": 10001,
   "bytes": 10001,
   "persisted": true,
   "persisted_file_bytes": [
    10001,
    10001
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 2288,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "cjk_10000",
   "status": "ok",
   "characters": 10000,
   "utf16_code_units": 10000,
   "bytes": 30000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "emoji_4000",
   "status": "ok",
   "characters": 4000,
   "utf16_code_units": 8000,
   "bytes": 16000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "emoji_5000",
   "status": "ok",
   "characters": 5000,
   "utf16_code_units": 10000,
   "bytes": 20000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "emoji_5001",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10002,
   "bytes": 20004,
   "persisted": true,
   "persisted_file_bytes": [
    20004,
    20004
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1287,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "emoji_6000",
   "status": "ok",
   "characters": 6000,
   "utf16_code_units": 12000,
   "bytes": 24000,
   "persisted": true,
   "persisted_file_bytes": [
    24000,
    24000
   ],
   "truncation_notice": "Output too large (11.7KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1288,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "mixed_4999e_plus2",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10000,
   "bytes": 19998,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "mixed_5000e_plus1",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10001,
   "bytes": 20001,
   "persisted": true,
   "persisted_file_bytes": [
    20001,
    20001
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1294,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "probe_10000_units",
   "status": "ok",
   "characters": 5022,
   "utf16_code_units": 10000,
   "bytes": 19956,
   "persisted": false,
   "persisted_file_bytes": [],
   "unit_hypothesis_predicts_filed": false,
   "codeword_returned": true,
   "tools_used": [],
   "reply_head": "VELLICHOR",
   "probe_valid": true,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "a reply parsed",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 2,
   "cell": "probe_10001_units",
   "status": "ok",
   "characters": 5023,
   "utf16_code_units": 10001,
   "bytes": 19957,
   "persisted": true,
   "persisted_file_bytes": [
    19957
   ],
   "unit_hypothesis_predicts_filed": true,
   "codeword_returned": false,
   "tools_used": [],
   "reply_head": "I don't have a file-reading tool available in this session, so I can't open the persisted hook output at `<path elided>",
   "probe_valid": true,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "a reply parsed",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "ascii_10000",
   "status": "ok",
   "characters": 10000,
   "utf16_code_units": 10000,
   "bytes": 10000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "ascii_10001",
   "status": "ok",
   "characters": 10001,
   "utf16_code_units": 10001,
   "bytes": 10001,
   "persisted": true,
   "persisted_file_bytes": [
    10001,
    10001
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 2288,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "cjk_10000",
   "status": "ok",
   "characters": 10000,
   "utf16_code_units": 10000,
   "bytes": 30000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "emoji_4000",
   "status": "ok",
   "characters": 4000,
   "utf16_code_units": 8000,
   "bytes": 16000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "emoji_5000",
   "status": "ok",
   "characters": 5000,
   "utf16_code_units": 10000,
   "bytes": 20000,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "emoji_5001",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10002,
   "bytes": 20004,
   "persisted": true,
   "persisted_file_bytes": [
    20004,
    20004
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1287,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "emoji_6000",
   "status": "ok",
   "characters": 6000,
   "utf16_code_units": 12000,
   "bytes": 24000,
   "persisted": true,
   "persisted_file_bytes": [
    24000,
    24000
   ],
   "truncation_notice": "Output too large (11.7KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1288,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "mixed_4999e_plus2",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10000,
   "bytes": 19998,
   "persisted": false,
   "persisted_file_bytes": [],
   "truncation_notice": null,
   "truncation_notice_full_chars": null,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "mixed_5000e_plus1",
   "status": "ok",
   "characters": 5001,
   "utf16_code_units": 10001,
   "bytes": 20001,
   "persisted": true,
   "persisted_file_bytes": [
    20001,
    20001
   ],
   "truncation_notice": "Output too large (9.8KB). Full output saved to: <path elided>  Preview (first 2KB):",
   "truncation_notice_full_chars": 1294,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "reply == OK",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "probe_10000_units",
   "status": "ok",
   "characters": 5022,
   "utf16_code_units": 10000,
   "bytes": 19956,
   "persisted": false,
   "persisted_file_bytes": [],
   "unit_hypothesis_predicts_filed": false,
   "codeword_returned": true,
   "tools_used": [],
   "reply_head": "VELLICHOR",
   "probe_valid": true,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": false,
   "arrival_check": "a reply parsed",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  },
  {
   "round": 3,
   "cell": "probe_10001_units",
   "status": "ok",
   "characters": 5023,
   "utf16_code_units": 10001,
   "bytes": 19957,
   "persisted": true,
   "persisted_file_bytes": [
    19957
   ],
   "unit_hypothesis_predicts_filed": true,
   "codeword_returned": false,
   "tools_used": [],
   "reply_head": "I don't have it — the hook's payload was truncated in my context (only the first 2KB of emoji preview came through), and this session has no file-reading or shell tool, so I can't open `<path elided>",
   "probe_valid": true,
   "fixture_round_tripped_from_disk": true,
   "persisted_size_asserted": true,
   "arrival_check": "a reply parsed",
   "claude_code_version_at_runtime": "2.1.238 (Claude Code)"
  }
 ]
}