The linkable home for the question #338 door (a) and #342 both reduce to. Ready to send; not yet sent. The answer — grant or refusal — gets recorded here, so it is citable instead of living in a transcript.
The ask, in two questions
1. Is there any supported programmatic path to a Claude Code session's transcript, for the account that owns the session?
create_session's own tool description says, verbatim:
Combine with send_message for fan-out orchestration: spawn a sibling, send it a task, poll list_events for the result.
Neither list_events nor send_message is exposed on the MCP surface we can see. ToolSearch select:…__list_events and …__send_message both return No matching deferred tools found. get_session returns a record — title, status, timestamps, usage, post_turn_summary — and no turns, though its own reply envelope is labelled "record, transcript events, or run log".
So: doc defect, or unshipped capability? Either answer is useful. If the loop that description names is meant to close, list_events is the missing half.
2. claude.ai/code/artifact/<uuid> is exempt from a bot challenge that covers the rest of the host. What makes a path exempt, and could a read route be?
This is the concrete lever, and it took a control to find.
The evidence, measured with controls
Earlier probing recorded four separate 403s and concluded the session route was forbidden. That was wrong and is corrected on #338. Re-run with controls:
CONTROL pathbase.bounded.tools/ 405 (+ x-door-version) our egress works
CONTROL example.com/ 000 proxy allowlist blocks it
CONTROL claude.ai/ (ROOT) 403 "Just a moment…" <-- Cloudflare challenge
TARGET claude.ai/code/session_<id> 403 "Just a moment…" same page
TARGET claude.ai/api/claude_code/… 403 "Just a moment…" same page
POSITIVE claude.ai/code/artifact/<uuid> 200 exempt, even for an all-zeros UUID
Just a moment… is Cloudflare's managed-challenge interstitial, served for the bare root. So every 403 measured one fact — a non-browser client does not pass the bot gate — not four route policies. Nothing beyond the gate was ever reached, which is why question 1 is genuinely open rather than already answered "no".
The artifact row is the interesting one: same client, same proxy, same host, and it returns 200. Something already distinguishes machine-reachable paths from browser-only ones there.
Why we are asking rather than building
The alternative is a relay tier holding a browser-born credential, which is refused (.github-private#835 Phase 2, restated on #338). The corrected evidence weakens it further: such a tier would still face the same challenge unless it also solved it, and solving a bot gate is precisely the thing we said we would not build. "The ask is taking too long" is true by construction and is never evidence for building it.
What we can already do, for context on scope
- shared chats: read end to end (relay → toolpath Graph → pathbase door), deployed
- a session's own transcript: read locally, no credential
- a session reporting outward: built and deployed (
infra#577), proven from a checkout-less session
- reading another live session: nothing. Push works, pull does not exist.
We are not asking for a new capability surface. We are asking whether one already exists that we have not found, and if not, whether the path-exemption mechanism in question 2 is available.
Sending it
Owner sends; the account matters and this session cannot speak for it. When an answer comes back, record it as a row here with a link, so #338 step 15 and #342 can both discharge against it.
Related: #338 (door (a), and the corrected 403 table), #342 (the classifier names no route — same message, different wall), #337 (the postures this was measured across), .github-private#835 (door (b), refused).
The linkable home for the question #338 door (a) and #342 both reduce to. Ready to send; not yet sent. The answer — grant or refusal — gets recorded here, so it is citable instead of living in a transcript.
The ask, in two questions
1. Is there any supported programmatic path to a Claude Code session's transcript, for the account that owns the session?
create_session's own tool description says, verbatim:Neither
list_eventsnorsend_messageis exposed on the MCP surface we can see.ToolSearch select:…__list_eventsand…__send_messageboth returnNo matching deferred tools found.get_sessionreturns a record — title, status, timestamps, usage,post_turn_summary— and no turns, though its own reply envelope is labelled "record, transcript events, or run log".So: doc defect, or unshipped capability? Either answer is useful. If the loop that description names is meant to close,
list_eventsis the missing half.2.
claude.ai/code/artifact/<uuid>is exempt from a bot challenge that covers the rest of the host. What makes a path exempt, and could a read route be?This is the concrete lever, and it took a control to find.
The evidence, measured with controls
Earlier probing recorded four separate 403s and concluded the session route was forbidden. That was wrong and is corrected on #338. Re-run with controls:
Just a moment…is Cloudflare's managed-challenge interstitial, served for the bare root. So every 403 measured one fact — a non-browser client does not pass the bot gate — not four route policies. Nothing beyond the gate was ever reached, which is why question 1 is genuinely open rather than already answered "no".The artifact row is the interesting one: same client, same proxy, same host, and it returns 200. Something already distinguishes machine-reachable paths from browser-only ones there.
Why we are asking rather than building
The alternative is a relay tier holding a browser-born credential, which is refused (
.github-private#835Phase 2, restated on #338). The corrected evidence weakens it further: such a tier would still face the same challenge unless it also solved it, and solving a bot gate is precisely the thing we said we would not build. "The ask is taking too long" is true by construction and is never evidence for building it.What we can already do, for context on scope
infra#577), proven from a checkout-less sessionWe are not asking for a new capability surface. We are asking whether one already exists that we have not found, and if not, whether the path-exemption mechanism in question 2 is available.
Sending it
Owner sends; the account matters and this session cannot speak for it. When an answer comes back, record it as a row here with a link, so #338 step 15 and #342 can both discharge against it.
Related: #338 (door (a), and the corrected 403 table), #342 (the classifier names no route — same message, different wall), #337 (the postures this was measured across),
.github-private#835(door (b), refused).