Quirl0.1 RC
ArchitectureDecisions

ADR 0010: Freeze the 1.0 release scope around Unix and explicit dialect islands

Canonical Quirl project documentation synced from docs/decisions/0010-unix-first-release-scope.md.

Context

Quirl has a complete interactive process model on Linux and macOS: process groups, terminal handoff, foreground/background transitions, suspension, signals, pipes, and redirects. The Windows backend cross-compiles and satisfies portable lifecycle contracts, but native terminal behavior has not been exercised on a Windows machine. Requiring that evidence would make an unavailable platform a release blocker for the platforms the project actively uses and can support.

The command grammar had a similar ambiguity. The implemented C1 core covers the high-frequency, bounded forms that fit Quirl's native process graph. It does not implement multiline here-documents, process substitution, loops, functions, or other dialect control syntax. Keeping those forms on an open-ended native 1.0 checklist would encourage partial Bash/Zsh emulation and weaken diagnostics. Quirl already has explicit, bounded Bash and Zsh reference runners for exact dialect behavior.

Decision

Quirl 1.0 is Unix-first:

  • Linux and macOS are the supported interactive platforms. Release evidence covers the editor, PTY ownership, native job control, suspension, signals, pipes, redirects, and the frozen C1-core grammar on those platforms.
  • Windows is a best-effort portability target. Its backend remains in the workspace, must continue to cross-compile when the toolchain is available, and must satisfy platform-independent process-contract tests. Native Windows terminal handoff, Ctrl-Z-equivalent suspension, and hands-on Windows smoke testing are not part of the 1.0 promise or release gate.
  • A future Windows support claim requires named native hardware or a maintained native test environment, an interactive terminal/job-control checklist, and a fresh security review of Job Object containment. It is a separate milestone, not deferred work silently attached to 1.0.

The 1.0 compatibility boundary is also frozen:

  • C0 and the versioned C1-core matrix execute natively on Linux and macOS. This includes quoting, byte pipes, standard-descriptor redirects, here-strings, background markers, boolean/sequential lists, export NAME=value, bounded parameter/arithmetic/command expansion, and pathname expansion.
  • Here-documents, process substitution, loops, functions, conditionals, and dialect-specific control forms are C2 reference-shell islands for 1.0. They are not promised as future native syntax. Prompt use selects bash { ... } or zsh { ... }; scripts select an interpreter through their shebang, quirl run --lang bash, or quirl run --lang zsh. Both boundaries are explicitly noninteractive with closed standard input. Ctrl-C cancels them; on Unix, Ctrl-Z also cancels a prompt island instead of creating an untracked stopped process group.
  • Unsupported dialect input receives an actionable diagnostic. Quirl never silently retries it in a reference shell, loads user startup files, or changes interpreter authority behind the user's back.
  • C3 state import remains deliberately partial, and C4 exact emulation always belongs to the explicitly selected reference interpreter.

Consequences

  • Release work can be completed and honestly supported with Linux/macOS hardware and maintainers.
  • The checked-in Windows backend remains useful portability engineering without being presented as a tested daily-driver experience.
  • The native parser stays bounded and explainable. Exact dialect semantics stay exact because Bash or Zsh owns them.
  • Documentation, diagnostics, and examples must label dialect islands clearly; they must not show loops, functions, here-documents, or process substitution as ordinary native Quirl command input.
  • Adding a native form later requires updating the compatibility matrix, differential fixtures, grammar protocol identity when applicable, and this support contract. Native support is an evidence-backed product decision, not an assumption that all shell syntax eventually migrates inward.

On this page