{
  "changed_files": [
    "docs-site/src/shells/frames.md",
    "docs-site/src/harness-contract/api.md"
  ],
  "changed_sections": [
    "frames: boundary example and reserved seq bullet; io example and single Items1+4 seq bullet linking ../reference/json-shapes.md#window-and-cursor-flags; transport/cap/reporting prose retracting remaining current-pointer promises; COMMUNE capped at 16 KiB, head retained, not digest-backed.",
    "api: io-events example and payload/digest_seq contract; poll owns the single same-spool/first-taker rule; listen links exactly to #api-poll-id---include-deferred---link-token."
  ],
  "tags": "All existing requirement tags preserved. api poll has no directly attached REQ tag in the existing source; none added or borrowed from io-events.",
  "head_evidence": "Resolved: spt-claude-code/tools/claude-spt/src/hook.rs:3354-3368 explicitly documents HEAD-KEPT and its diagnostic says head kept; adapter/strings/briefs/live-ops.md:34-36 says first ~16KB. Core crates/spt-proto/src/ioevent.rs:79 sets 16*1024 and :99 returns &payload[..cut]. Used unambiguous 'with the head retained', not 'head-truncated'.",
  "old_strings_for_retraction_sweep": [
    "seq=\"419\"",
    "seq=\"418\"",
    "the funnel cursor for this record, absent when there is none to point",
    "at. Optional; never default it.",
    "**present only when there is a digest entry to point at**",
    "holding the untruncated content. Follow it with `spt endpoint digest` when you",
    "need the whole thing. An absent `seq` means no pointer exists, so treat the",
    "attribute as optional rather than defaulting it.",
    "same digest pointer",
    "The digest stays the content surface: when a frame is truncated,",
    "follow its `seq` for the whole payload rather than reassembling from frames.",
    "streams through its `[digest]` feed instead, that is still a fine answer: an",
    "`io` frame points at the digest with `seq` rather than restating it.",
    "The payload is **that file's content, verbatim**",
    "the harness wrote, before any parsing or routing.",
    "\"digest_seq\": 88",
    "`payload` is bounded to the same 16KB class the shell IO frame uses; when",
    "`truncated` is set, follow `digest_seq` into the digest for the whole body",
    "digest stays the content surface.",
    "drain spooled backlog, then block relaying messages."
  ],
  "sweep_leads_outside_ownership": [
    "crates/spt-daemon/src/iobus.rs:47-48 currently promises digest content surface; :91 with_seq doc-comment and :336 follow-digest_seq comment also surfaced during evidence reads.",
    "api.md:500 (previous :497) retains heading `api hint --session <sid>` *(needs `--manifest`; message on stdin)*. Left untouched because Item2 belongs to Main; consider in its retraction sweep."
  ],
  "validation": "None run, per assignment. No commits or new files."
}