Etan's call: the send-size gate belongs in cmuxlayer, not in a per-seat Claude hook.
Handover from skillcreatorClaude (skill-creator hooks-lab/gates/send-size-gate/, PR
EtanHey/skill-creator#45, currently live in that seat's settings.json).
The correction that reframes this: we already have the gate. It is set too high to fire.
This is not a missing feature. src/server.ts:437 —
DEFAULT_SEND_INPUT_MAX_INLINE_CHARS = 1_800 (env-tunable via CMUXLAYER_MAX_INLINE_CHARS),
with a chunk threshold of 500 (:433) and a separate multi-paragraph refusal for interactive
composers (:1915-1932).
The two measured breakages were 908 chars and ~1,100 chars. Both are under 1,800, so
cmuxlayer waved them through and only a Claude-seat hook at 800 caught them. Our cap is not
wrong in shape — it is wrong in value, and nobody noticed because the failures were attributed to
the receiving pane rather than to the sender's payload size.
What the hook measured, and why 800
- compliant pointer briefs: 60-261 chars
- observed violations: 908, ~1,100
- 800 sits above every compliant send and below every violation.
That is a real measurement on real fleet traffic, and it is a better basis than 1,800 — which as far
as I can tell was chosen, not measured. Before changing the constant we should confirm 1,800 has no
provenance I am missing; if it does, this becomes "add a second, lower gate for agent composers"
rather than "lower the existing one".
Why cmuxlayer and not the hook (skillcreator's argument, which I accept)
A PreToolUse hook only guards Claude seats. Codex and Cursor never run it — so the rule binds
exactly the agents that already knew it and none of the ones that do not. Same shape as tmp-block
being a silent no-op for Cursor until golems #731: a guard whose coverage claim was wider than its
reach. Enforcing in send_to covers every CLI, lets the receipt carry the reason instead of a
generic external block, and makes splitting possible where an outside hook can only refuse.
Scope
- Decide the threshold from the measurements above, and record the provenance in the code — the
current 1,800 has none I can find, which is how it drifted past two real violations.
- Apply it on every send path, not just
send_input: send_to (agent + surface + command modes),
spawn_agent boot prompts, and any broadcast/dispatch path.
- No "Read and follow" prefix exemption. skillcreator built one and cut it: it is a one-prefix
bypass for an arbitrarily long payload, and a genuine pointer is short anyway. Their RED fixture
05 pins this; port that case.
- The receipt must say why and give the remedy (write a file, send
Read and follow <path>), and
boot_prompt_path must remain the sanctioned path for large boot prompts.
- Keep
allow_long_inline as the deliberate override; do not make the gate unbypassable.
- Consider splitting rather than refusing where the payload is a safe shape — the thing only
in-tool enforcement can do. Do not build it speculatively; say whether it is worth it.
Coordination
skillcreator will retire its hook once ours ships — not before. Two enforcers with different
thresholds is worse than one, but a gap with none is worse still, so their 800-char Claude-seat hook
stays as the stopgap until this lands and is verified live.
Ported from skill-creator's hooks-lab/gates/send-size-gate/: 6 tests, 11 fixtures, fails open on
malformed input, control keys and non-cmux tools untouched. Reuse those fixtures rather than
re-deriving them.
— cmuxlayerClaude (lead) · claude-code/claude-opus-5
Etan's call: the send-size gate belongs in cmuxlayer, not in a per-seat Claude hook.
Handover from
skillcreatorClaude(skill-creatorhooks-lab/gates/send-size-gate/, PREtanHey/skill-creator#45, currently live in that seat's
settings.json).The correction that reframes this: we already have the gate. It is set too high to fire.
This is not a missing feature.
src/server.ts:437—DEFAULT_SEND_INPUT_MAX_INLINE_CHARS = 1_800(env-tunable viaCMUXLAYER_MAX_INLINE_CHARS),with a chunk threshold of 500 (
:433) and a separate multi-paragraph refusal for interactivecomposers (
:1915-1932).The two measured breakages were 908 chars and ~1,100 chars. Both are under 1,800, so
cmuxlayer waved them through and only a Claude-seat hook at 800 caught them. Our cap is not
wrong in shape — it is wrong in value, and nobody noticed because the failures were attributed to
the receiving pane rather than to the sender's payload size.
What the hook measured, and why 800
That is a real measurement on real fleet traffic, and it is a better basis than 1,800 — which as far
as I can tell was chosen, not measured. Before changing the constant we should confirm 1,800 has no
provenance I am missing; if it does, this becomes "add a second, lower gate for agent composers"
rather than "lower the existing one".
Why cmuxlayer and not the hook (skillcreator's argument, which I accept)
A PreToolUse hook only guards Claude seats. Codex and Cursor never run it — so the rule binds
exactly the agents that already knew it and none of the ones that do not. Same shape as tmp-block
being a silent no-op for Cursor until golems #731: a guard whose coverage claim was wider than its
reach. Enforcing in
send_tocovers every CLI, lets the receipt carry the reason instead of ageneric external block, and makes splitting possible where an outside hook can only refuse.
Scope
current 1,800 has none I can find, which is how it drifted past two real violations.
send_input:send_to(agent + surface + command modes),spawn_agentboot prompts, and any broadcast/dispatch path.bypass for an arbitrarily long payload, and a genuine pointer is short anyway. Their RED fixture
05 pins this; port that case.
Read and follow <path>), andboot_prompt_pathmust remain the sanctioned path for large boot prompts.allow_long_inlineas the deliberate override; do not make the gate unbypassable.in-tool enforcement can do. Do not build it speculatively; say whether it is worth it.
Coordination
skillcreator will retire its hook once ours ships — not before. Two enforcers with different
thresholds is worse than one, but a gap with none is worse still, so their 800-char Claude-seat hook
stays as the stopgap until this lands and is verified live.
Ported from skill-creator's
hooks-lab/gates/send-size-gate/: 6 tests, 11 fixtures, fails open onmalformed input, control keys and non-cmux tools untouched. Reuse those fixtures rather than
re-deriving them.
— cmuxlayerClaude (lead) · claude-code/claude-opus-5