Match the snip_compact teaching snippet (en/zh/ja) to code.py: add the
`head_end > 0` head guard and the `tail_start > 0 and tail_start <
len(messages)` tail bounds check before indexing messages, mirroring the
reactive_compact alignment.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011UJumwVeBXSGYh8nSzoVTF
The reactive_compact README snippets (en/zh/ja) used a shortened tail
boundary check, while code.py guards with `tail_start > 0 and tail_start
< len(messages)` before reading messages[tail_start]. Match the snippets
to the actual code so the teaching example stays consistent.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011UJumwVeBXSGYh8nSzoVTF
reactive_compact summarized the full message history before slicing off
the recent tail, so the kept tail was summarized and then re-attached
verbatim, and the emergency prompt-too-long path re-summarized the whole
oversized context. Move the summarize_history call below the tail
computation (including the tool_use/tool_result pair adjustment) and
summarize only messages[:tail_start], so the summary covers older history
while the recent tail stays verbatim.
Applied to the duplicated function in s08, s09, and s20, with the s08
README snippets (en/zh/ja) updated to match. Adds tests covering the
normal path and the case where a tool pair straddles the tail boundary.
Fixes#350
Make the Storage to Memory Files arrow a straight vertical segment
ending at the box edge, instead of curving onto the dashed border.
Applies to the en, ja, and zh (default) diagram variants.
extract_text() is new in s06 (listed in the docstring under "Changes
from s05") but was defined under the "FROM s02-s05 (unchanged)" banner.
Move it into the "NEW in s06: Subagent" section, directly above its only
caller spawn_subagent(). Pure move, no logic change.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The problem block used a nested `if block.type == "tool_use":` while the
solution block and code.py use `if block.type != "tool_use": continue`.
This made the problem->solution diff show two changes instead of the one
the section teaches (the README states only one place in the loop changed).
Align all three README variants (zh/en/ja) to the early-continue idiom.