Files
tai/research/async-pty-process-testing/ptyprocess-docs.md
T

51 lines
3.0 KiB
Markdown
Raw Normal View History

# Ptyprocess — Ptyprocess 0.7 documentation
## Metadata
| Field | Value |
|---|---|
| Institute | Molodetz Institute — Research & Retrieval Division |
| Subject | async-pty-process-testing |
| Document type | Source Dossier |
| Tier | 1 |
| Source title | Ptyprocess — Ptyprocess 0.7 documentation |
| Source URL | https://ptyprocess.readthedocs.io/en/latest/ |
| Source publisher / author | ptyprocess maintainers (readthedocs project) |
| Source type | vendor docs |
| Source date (published) | Unknown — not stated |
| Date researched | 2026-10-09 |
| Researched by | tai (agent), model: Claude Sonnet 5, on behalf of retoor |
| Research method | web search synthesis |
| Confidence | Medium |
| Status | Active |
## Summary
Ptyprocess is a Python library for spawning a child process attached to a real pseudo-terminal (pty) rather than plain pipes. Its documentation describes the behavioral guarantees a real pty gives you that a pipe cannot: unified stdio, window-size tracking with SIGWINCH delivery, and line-discipline signal generation (Ctrl-C becomes SIGINT).
## Key findings
- When a program runs under ptyprocess, all three of its standard streams (stdin/stdout/stderr) are connected to a single pty, not three separate pipes.
- Ptyprocess tracks the terminal's window size and notifies the child process with a SIGWINCH signal when it changes.
- In cooked (line-buffered) terminal mode, the kernel's tty line discipline turns a Ctrl-C keystroke (byte 0x03) into a SIGINT delivered to the foreground process group — this only happens because the device is a real pty, not a pipe.
## Pros / strengths
- Documents, in one place, exactly which "feels like a real terminal" behaviors a pty provides that a pipe does not — this is the core justification for why `tai_test.py` needed pty support at all, since `tai.py`'s own code branches on `sys.stdin.isatty()`.
- The SIGWINCH and line-discipline-SIGINT points are concrete, testable claims, not vague marketing.
## Cons / limitations / caveats
- The dossier is based on a web-search synthesis of the documentation, not a full read of the library's source or a hands-on trial of ptyprocess itself — `tai_test.py` does not depend on ptyprocess as a library, only on the general pty behavior it documents (which was reimplemented directly against the stdlib `pty` module).
- Says nothing about asyncio integration; ptyprocess itself is a synchronous/blocking library.
## Relevance to tai
Directly informed the decision to give `tai_test.py`'s pty mode a real pseudo-terminal rather than a pipe, since `tai.py` branches on `isatty()` for approval prompts and readline behavior. The SIGWINCH/Ctrl-C-SIGINT behaviors this source describes are explicitly **not** relied on by `tai_test.py` — see the companion dossier on the `start_new_session`/controlling-terminal pitfall (`github-agents-issue1-controlling-terminal.md`) and the framework's own documented limitation in its module docstring.
## Changelog
| Date | Change |
|---|---|
| 2026-10-09 | Initial dossier created. |