Permitted specifications
The public specification IDs and URLs that derivation markers may cite.
Public specifications cited by clean-room derivation markers (CLEANROOM.md rule 3).
Rule 3 admits two kinds of permitted source: a public specification, or an observation
registered in CAPTURES.md. This file is the first kind; that file is the second.
A Derivation: marker cites an ID from one of these two tables, and cleanroom-gate
rejects a citation that resolves in neither — so rule 3 is enforced by the gate rather
than by a reviewer ticking a box.
Cite as <ID> §<section> where the spec has sections: ECMA-48 §8.3.14. The section is
for the reader; the gate resolves the ID.
A row is scoped to the document it names, and a citation may only claim what that
document says. POSIX is why this is spelled out: POSIX-TERM is XBD Chapter 11, which
describes the terminal interface but defines no function, so a fact about what
tcsetwinsize() does or when it signals belongs to POSIX-WINSIZE — a different volume,
a different row. Citing the chapter for the function page resolves happily through the
gate and is exactly the wrong-section failure rule 4 exists to catch; it got through three
review rounds on this crate before a reader searched the chapter text instead of trusting
that a plausible section number was the right one.
Every row is a public, freely-obtainable document. That is the point of the registry — a source that cannot be read by anyone auditing this repo cannot substantiate a claim of independent derivation. Adding a row is a normal PR; adding one that is paywalled, leaked, or copyleft-licensed is a rule 1 violation.
| ID | Specification | Where |
|---|---|---|
ECMA-48 | Control Functions for Coded Character Sets, 5th edition (1991) | ecma-international.org/publications-and-standards/standards/ecma-48/ |
XTERM-CTLSEQS | XTerm Control Sequences | invisible-island.net/xterm/ctlseqs/ctlseqs.html |
KITTY-KBD | Kitty keyboard protocol | sw.kovidgoyal.net/kitty/keyboard-protocol/ |
KITTY-GRAPHICS | Kitty graphics protocol | sw.kovidgoyal.net/kitty/graphics-protocol/ |
ACP-1 | Agent Client Protocol, wire version 1 | agentclientprotocol.com |
CLAUDE-STREAM-JSON | Claude Code CLI reference: print-mode --input-format/--output-format flags, stream-json on both, stdin/stdout | code.claude.com/docs/en/cli-reference |
CLAUDE-HEADLESS | Claude Code headless mode: the stream-json message stream's shapes and semantics | code.claude.com/docs/en/headless |
CLAUDE-AGENT-SDK | Claude Code Agent SDK (TypeScript) reference: result-message field shapes (usage token keys, total_cost_usd as an estimate, duration_ms, num_turns), the tool_use content-block shape, canUseTool as SDK-hosted-only (absent in interactive/TUI mode) | code.claude.com/docs/en/agent-sdk/typescript |
CLAUDE-HOOKS | Claude Code hooks reference: lifecycle events, PreToolUse permissionDecision contract | code.claude.com/docs/en/hooks |
CLAUDE-SDK-PERMISSIONS | Claude Code SDK permissions reference: the six-step evaluation order with hooks run first, a hook deny applying even in bypassPermissions mode | code.claude.com/docs/en/agent-sdk/permissions |
CODEX-APP-SERVER | Codex app-server JSON-RPC protocol: README plus the schemas emitted by codex app-server generate-json-schema | github.com/openai/codex/blob/main/codex-rs/app-server/README.md |
OPENCODE-ACP | opencode as an ACP agent: the acp subcommand, JSON-RPC over stdio | opencode.ai/docs/acp |
OPENCODE-PLUGINS | opencode plugin events reference: the typed event-bus names (session.*, permission.asked/permission.replied, message.*, server.connected) | opencode.ai/docs/plugins |
OPENCODE-SERVER | opencode server HTTP + SSE surface: the endpoint table plus the OpenAPI 3.1 schema the server publishes at GET /doc ("use the spec to generate clients or inspect request and response types") — request/response/event shapes derive from that schema | opencode.ai/docs/server |
POSIX-TERM | POSIX.1-2024 (Issue 8) XBD §11, General Terminal Interface | pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap11.html |
POSIX-WINSIZE | POSIX.1-2024 (Issue 8) XSH, tcsetwinsize() | pubs.opengroup.org/onlinepubs/9799919799/functions/tcsetwinsize.html |
POSIX-VI | POSIX.1-2024 (Issue 8) XCU, vi — screen-oriented (visual) display editor: the command-mode / text-input-mode distinction and the visual-mode command vocabulary specified in EXTENDED DESCRIPTION | pubs.opengroup.org/onlinepubs/9799919799/utilities/vi.html |
UAX-11 | Unicode Standard Annex #11, East Asian Width | unicode.org/reports/tr11/ |
UAX-29 | Unicode Standard Annex #29, Text Segmentation (grapheme clusters) | unicode.org/reports/tr29/ |
TERM-UNICODE-CORE | Terminal Unicode Core (grapheme-cluster processing, DEC private mode 2027). Draft (rev 1, 2021-09-06), in a repository declaring no license — cite it for what it requires when the mode is SET, and for its own statement that the reset state is undefined; it defines no reset-state behavior to cite | github.com/contour-terminal/terminal-unicode-core |
TMUX-MANUAL | tmux(1) manual page: the DEFAULT KEY BINDINGS section (prefix-key convention, C-b default, prefix-then-command-key grammar), the KEY BINDINGS section (key-name syntax, key tables, bind-key/unbind-key), the named command vocabulary (new-window, split-window, resize-pane, copy-mode, detach-client, list-keys, …), and the configuration-file vocabulary (set-option, ~/.tmux.conf, source-file) | man.openbsd.org/tmux.1 |
ZELLIJ-KEYBINDS | Zellij User Guide, "Configuring Keybindings": the keybinds configuration block — bindings divided into named modes, bind instructions mapping one or more keys to one or more named actions (SwitchToMode, NewPane, MoveFocus, …) | zellij.dev/documentation/keybindings.html |
ZELLIJ-PRESETS | Zellij User Guide, "Keybinding Presets": the two shipped default presets and their mode-entry convention — default preset (mode entered from normal mode, e.g. Ctrl p → Pane mode, then n new pane / x close focused pane) and the Unlock-First non-colliding preset (Ctrl g unlock, then single-character mode entry) | zellij.dev/documentation/keybinding-presets.html |
Rows exist before the code that cites them
This registry is seeded ahead of gwk-pty deliberately. A registry written to match code
already merged records what was cited, not what was permitted — and the whole value of
rule 3 is that the permitted set is decided before the implementation reaches for it.
Nothing here is load-bearing until a marker cites it. A row nothing cites costs nothing; a missing row blocks a PR until someone justifies the source, which is the correct direction for that friction to run.
Once a marker does cite a row, the row is load-bearing and cleanroom-gate treats it
that way: cited row text is folded into the review subject, and editing a cited row
re-opens review of the files citing it (CAPTURES.md describes the mechanism; it covers
both registries).