Clarify decisions before AI-assisted coding
Project description
Preflights
Code fast with AI — without giving up architectural clarity.
Preflights is a lightweight CLI tool that helps developers clarify decisions before letting an AI agent write code. It turns a vague intention into explicit decisions and a clear execution brief — without slowing you down.
What is Preflights?
Preflights sits before AI coding agents (Claude Code, Cursor, Windsurf).
It does not generate code. It forces clarification, captures architectural decisions, and produces a clear execution brief so AI agents can implement without guessing or redefining scope.
Think of it as a pre-flight checklist for AI-assisted development.
How Preflights uses AI (and how it doesn't)
Preflights may optionally use an LLM only to generate clarification questions and progress signals.
It never:
- generates code
- makes architectural decisions
- writes files directly
- replaces deterministic logic
All decisions, validations, and artifacts are produced by a deterministic core. The LLM is treated as an interchangeable clarification engine — not an authority.
The deterministic MockLLMAdapter defines the reference behavior. LLM-backed modes must align with it.
Why Preflights exists
AI coding tools are incredibly fast. The real problem is not speed — it's everything that gets decided implicitly:
- architectural choices made by accident
- inconsistencies across files
- rework disguised as "fast iteration"
- technical debt with no paper trail
With vibe coding, you often have to choose:
- move fast
- or keep quality and clarity
Preflights removes that trade-off.
You can keep the vibe — while making decisions explicit, traceable, and reversible.
Quickstart
From the root of a git repository:
pf start "Add user authentication"
Or with uvx (no install needed):
uvx preflights start "Add user authentication"
Preflights will:
- ask a few targeted clarification questions
- distinguish decisions from implementation details
- generate clear artifacts for your AI agent
That's it.
Preflights is fully open-source and does not provide or manage any AI service. If an LLM is used, it is always configured locally by the user (Bring Your Own Key).
Installation
pip install preflights
pf start "Add authentication"
Or with uvx (no install needed):
uvx preflights start "Add authentication"
From source:
git clone https://github.com/ptngaye/preflights.git
cd preflights
pip install -e .
Usage — the Golden Path (recommended)
By default, Preflights runs in a fully deterministic mode and does not call any external LLM. This mode is always available and acts as a safety net.
An optional LLM-backed clarification mode can be enabled for richer question generation, while keeping Preflights fully functional without it.
-
Run Preflights from a git repository
pf start "Add OAuth authentication"
-
Answer the clarification questions (interactive by default, single uninterrupted flow)
-
Preflights generates documentation in
docs/:docs/CURRENT_TASK.md— always createddocs/adr/{UID}_{slug}.md— only if a structural decision was madedocs/ARCHITECTURE_STATE.md— regenerated when ADRs change
Previous tasks are archived in
docs/archive/task/. -
Open your AI coding tool Tell it to implement strictly based on
CURRENT_TASK.md.
Preflights stops here. The AI agent implements. No decisions happen during coding.
Session state is stored in .preflights/ (auto-gitignored).
Using Preflights with AI agents (MCP)
The CLI is the recommended entry point.
Preflights also exposes a minimal MCP server that allows AI agents to invoke it when they detect ambiguity during coding.
Typical use cases:
- An agent realizes a request implies an architectural decision
- A task is underspecified
- The agent needs explicit clarification before proceeding
In those cases, the agent can call Preflights via MCP to:
- trigger clarification
- generate ADR / TASK artifacts
- then resume implementation
Important: MCP is a fallback, not a replacement for the CLI-first workflow.
Claude Code
Preflights works particularly well with Claude Code:
- Run Preflights first to generate
CURRENT_TASK.md - Claude Code reads the task and architecture snapshot
- Claude implements without guessing or redefining scope
This keeps the agent focused on execution — not decision-making.
Cursor integration
Cursor can integrate with Preflights via MCP using a dedicated adapter.
The Cursor adapter lives in a separate repository:
👉 https://github.com/ptngaye/preflights-cursor
This allows Cursor to:
- invoke Preflights when clarification is needed
- align generated code with explicit architectural decisions
Preflights does not replace Cursor Rules or CLAUDE.md.
It complements them by handling decisions, not coding conventions.
What files are generated?
Preflights uses three explicit artifacts.
ADR — Architecture Decision Records
Long-term, structural decisions:
- frameworks
- authentication strategy
- database choices
They are immutable, ordered, and versioned.
You don't rewrite history — you supersede it.
CURRENT_TASK.md
The only thing your AI agent should implement right now.
It contains:
- goal
- context
- allowed files
- forbidden files
- acceptance criteria
If it's not in CURRENT_TASK.md, it shouldn't be implemented.
ARCHITECTURE_STATE.md
A generated snapshot of the current architecture:
- compact
- machine-readable
- fast to scan
- never edited manually
It exists to give agents context — not to replace ADRs.
Only regenerated when an ADR is created or updated.
Core concepts (human version)
- Decisions are durable → ADR
- Intentions are local → TASK
- Code is disposable → implementation
If changing something would require migration or refactoring many files: it's probably a decision.
Otherwise: it's just a task.
Architecture (very short)
Preflights follows a strict Ports & Adapters design:
- Core — pure, deterministic, no I/O
- Application — orchestration
- Adapters — filesystem, LLM, clock, IDs
- CLI — human interface (golden path)
- MCP — agent fallback integration
The Core never touches the filesystem or an LLM.
Design & Specifications
Preflights is driven by explicit design specifications.
This README provides a high-level overview.
Detailed behavior, contracts, and invariants live in docs/specs/.
These documents are the source of truth for:
- core behavior and invariants
- clarification flow
- LLM interaction rules
- generated artifacts (ADR, TASK, architecture state)
If you plan to contribute or extend Preflights, start with:
docs/specs/core-spec.mddocs/specs/mock-llm-spec.mddocs/specs/cli-spec.md
When not to use Preflights
You probably don't need Preflights if:
- your prompt is already a fully detailed technical spec
- the task is purely mechanical
- no architectural or structural decision is involved
Preflights is most useful when things are still fuzzy.
Development & Contributing
Requirements:
- Python 3.11+
- git
Run tests:
pytest
Type checking:
mypy preflights/
Full validation:
pytest && mypy preflights/
Core rules:
- no I/O
- no randomness
- same input → same output
- dataclasses are frozen
- no Any types
See CONTRIBUTING.md and AGENTS.md for contributor and agent-specific instructions.
License
Apache License 2.0
You can use, modify, and distribute Preflights freely — including for commercial projects — without lock-in.
Preflights is not here to slow you down. It's here to make sure speed doesn't silently destroy quality.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file preflights-1.1.1.tar.gz.
File metadata
- Download URL: preflights-1.1.1.tar.gz
- Upload date:
- Size: 240.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
74f973ba2edccc1d2759513f7dac0c153185fad29895b39ab11e4fb0c1bb1f7f
|
|
| MD5 |
e3d397d04d3a31dc1c170b67bbc56449
|
|
| BLAKE2b-256 |
b93c53674f7f575b399045dbeb8fa65a05e00dcae004668cb55dbdc56f7b1696
|
File details
Details for the file preflights-1.1.1-py3-none-any.whl.
File metadata
- Download URL: preflights-1.1.1-py3-none-any.whl
- Upload date:
- Size: 102.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb14a1bdc77169f9fdc8b8637839969fde2d7ad8f1c62ab4646533e7c2117cf2
|
|
| MD5 |
4171ab8f231d27f28a0ea970d688d903
|
|
| BLAKE2b-256 |
1ca047d20baca054c40c65a06c21baf5596f2ec8c33d8e3b6d967d4b6e6835ec
|