High-level notes for shipping FlightDeck. Detailed history: CHANGELOG.md. Backlog and milestone status: ROADMAP.md.
Narrative docs (including the CLI reference) are maintained on github.com/flightdeckdev/flightdeck main; this file and schemas/ ship in minimal clones.
- Bundled pricing hygiene:
flightdeck pricing checkreportsflightdeck-bundled-*snapshot age vs--max-age-days(default 90);--failexits non-zero for CI.release diff/POST /v1/diffappendpricing.warningsfor the same staleness rule so cost signals do not go silently wrong. Bundled YAML gains vendor official pricing URL comments; docs and ROADMAP state a minor-release refresh cadence for the bundled snapshot when list prices move materially. - Contributor tooling:
[project.optional-dependencies] devusesruff>=0.15,<0.16(seeCHANGELOG.md). - Telemetry extra: optional
flightdeck.integrations.telemetry.configure_otel_tracing()wires OTLP span export to your backend (seedocs/sdk-integrations.md).
Minor release (see CHANGELOG.md for the full list).
- Python floor:
requires-pythonis>=3.11,<4so installs work on common production interpreters (3.11–3.14).[tool.ruff] target-versionispy311. - HTTP / trust:
POST /v1/eventsis a ledger write and matches the promote/rollback access model: loopback-only whenFLIGHTDECK_LOCAL_API_TOKENis unset; Bearer required when it is set. When a token is set,GET /v1/*read APIs require the same Bearer header (previously only mutations were gated).POST /v1/diffstays read-only and ungated.GET /healthaddsread_auth(openvsbearer). Migration: remote emitters must sendAuthorization: Bearerwhenever the server uses a local API token; loopback scripts without a token are unchanged. flightdeck init: by default seeds bundled OpenAI / Anthropic / Google (google= Gemini-class) pricing atflightdeck-bundled-2026-05, writes.flightdeck/pricing-catalog.yaml, and setspricing_catalog_path(additive for new workspaces).flightdeck init --no-bundled-pricingrestores config-only init.- Ledger backends: optional
database_url(PostgreSQL) withpsycopgextra; SQLite busy retries andflightdeck serveSQLite tuning flags. - Evidence / UI:
GET /v1/runs/export,session_id/span_idfilters andoffseton run listings; bundled Web Runs page and substantial Runs / Diff / Actions / shell UX improvements (see changelog). - Experimental
flightdeck.integrations: optionalintegrations-*extras and CIintegrationsjob;RunEventwire shape unchanged — adapters are adoption glue perAGENTS.md. - Quality:
pytest-covwith--cov-fail-under=80on coreflightdeck; Playwrighte2e-server.mjsusesinit --no-bundled-pricingfor stable defaultGET /v1/workspaceexpectations.
Stable contracts: breaking items are the Python range, ingest + read Bearer rules when a token is set, and the new default init workspace layout; HTTP and v1 payload shapes remain additive aside from those access changes.
Patch release (see CHANGELOG.md): optional trace_id filter on GET /v1/runs, flightdeck runs list --trace-id, and SDK list_runs(trace_id=…) (exact match on RunEvent.request.trace_id); flightdeck runs export writes the same filtered slice as JSONL (stdout or -o, --limit up to 500, stderr warning when truncated). Stable contracts: additive HTTP query param and CLI command only.
Patch release (see CHANGELOG.md): GET /v1/workspace exposes non-secret workspace flags (promotion_requires_approval, pricing_catalog_configured, server_version) for scripting and the Actions page; web Promote follows the two-step request/confirm path when approval is required; expanded operator docs and examples/ci/promote_with_approval.sh + README workflow snippet. Stable contracts: additive HTTP and JSON Schema only.
Minor release (see CHANGELOG.md): optional pricing_catalog_path + PricingCatalog YAML for cross-vendor comparable pricing.catalog lines on diffs; pricing.hints for multi-version and model-name diagnostics; promotion_requires_approval with POST /v1/promote/request / POST /v1/promote/confirm / GET /v1/promotion-requests and matching CLI; GET /v1/runs and flightdeck runs list; SQLite migration v4 (promotion_requests); reference Helm chart and fleet docs under examples/. Stable contracts: additive HTTP and CLI surfaces; existing v1 event and release payloads unchanged.
Patch release (see CHANGELOG.md): flightdeck doctor --backup PATH performs a SQLite online backup of the workspace DB; examples/integration/ gains curl and a Node emit_sample_events.node.mjs path for POST /v1/events; examples/deploy/README.md documents the Compose /health healthcheck and backup scheduling. ROADMAP: Phase 0 is closed; catalog-level multi-provider pricing normalization is an explicit mid-term build item. Stable contracts: additive CLI flag and HTTP field pricing.warnings (from v1.0.5) remain backward-compatible.
Patch release (see CHANGELOG.md): flightdeck release diff --output json matches POST /v1/diff for machine consumers; pricing.warnings surfaces missing pricing-table rows for a release's resolved model (CLI WARNING: lines + web); Overview shows GET /v1/metrics counters. Stable contracts: additive only.
Patch release (see CHANGELOG.md): GET /v1/metrics exposes additive JSON counters for operators; POST /v1/diff and flightdeck release diff add pricing.prices / a Per-1k token prices line when pricing or model differs, so cost deltas are easier to interpret; examples/README.md ties integration, CI, and deploy examples into one loop; web Run diff shows the same unit-price deltas when present. Stable contracts: additive HTTP and CLI output only; no v1 payload or schema removals.
Patch release (see CHANGELOG.md): broader pytest coverage for diff_releases (MEDIUM/LOW confidence, max_latency_ms, max_error_rate, combined failures), CLI integration for MEDIUM confidence blocking promotion when require_high_diff_confidence is on, runs ingest edge cases (empty file, bad JSONL, JSON array file), and multi-provider / cross-model release diff plus POST /v1/diff parity on pricing.pricing_or_model_changed. Web UI: promote/rollback responses use structured panels (raw JSON optional); Run diff surfaces the same pricing/model-change note as the CLI when the diff payload flags it. Stable contracts: no CLI flag removals, no v1 schema or POST /v1/events shape changes; HTTP diff and action response shapes are unchanged (additive UI only on the client).
Minor release (see CHANGELOG.md): flightdeck release diff --fail-on-policy for CI gates; examples/ci/ (ledger-gate.sh, GitHub Actions templates) exercised in root CI; examples/deploy/ (Docker/Compose for flightdeck serve); examples/integration/ (SDK sample emitter for POST /v1/events); GET /health adds non-secret mutation_auth (loopback vs bearer); web shell shows mutation/token ergonomics and optional read-only UI (VITE_FLIGHTDECK_UI_READ_ONLY). Fix: policy min_*_runs explicit 0 overrides workspace defaults ( is not None resolution in diff_releases ). Stable contracts: additive /health field only; CLI flag is backward-compatible.
Patch release (see CHANGELOG.md): canonical main URLs for narrative docs in slim clones, optional OpenTelemetry in extras only, CI on CPython 3.14 (Ubuntu and Windows), repo-local pytest basetemp on Windows, ruff pinned consistently with pre-commit, .gitattributes LF for the golden bundle fixture, and removal of a test that depended on unpublished export scripts. Public CLI / schema / HTTP contracts are unchanged from v1.0.0.
- Not automatic on merge: publishing runs when a SemVer tag matching
vMAJOR.MINOR.PATCHis pushed (see.github/workflows/release-pypi.yml). - PyPI project:
flightdeck-ai(matches[project] nameinpyproject.toml). Trusted publishing (OIDC) — noPYPI_API_TOKENin repo secrets; register workflowrelease-pypi.ymlon the project. If PyPI shows Environment name: (Any), you do not need to match a specific string there; the workflow still uses GitHub Environmentpypifor optional approval gates. - Checks before upload: same bar as CI (ruff, pytest, schema drift) plus a tag ↔
pyproject.tomlversion match. - GitHub: the workflow creates a Release for the tag with generated notes and attaches
dist/*.
Details: DEVELOPMENT.md (PyPI release section).
v1.0.0 freezes the following unless a future major release says otherwise:
- CLI — commands, flags, and exit codes as documented in README.md (including
release verifyexit 2 on checksum mismatch). - JSON Schemas — committed
schemas/v1/forapi_versionv1payloads; regenerate viapython scripts/generate_schemas.py; CI guards drift. - HTTP —
POST /v1/events, envelope{ "events": [ … ] }, per-eventapi_versionomitted or"v1"; rejects other values with HTTP 400 and the stabledetailformat covered by tests. - SQLite — forward-only numbered migrations;
flightdeck doctorchecks migrations andaudit_seqcontinuity as shipped.
The product remains local-first; hosted control plane, OTel mapping, and related items stay on ROADMAP.md.
Optional OTEL libraries (not used by core today): pip install 'flightdeck-ai[telemetry]'.
flightdeck.sdk ships with the same SemVer as the CLI; CI covers flightdeck.sdk.client for local ingest helpers. For the strictest stability expectations, prefer the CLI and HTTP contracts above.
flightdeck serve: binding to a non-loopback address prints a warning; there is no HTTP auth in the default local server — treat network exposure as operator-controlled risk.flightdeck release verify: compares registered bundle checksum vs current directory tree hash; exit 2 on mismatch (1 for normal CLI errors).flightdeck doctor: read-only checks for SQLite migrations throughLATEST_SCHEMA_MIGRATION_VERSIONand basicpromoted_releases↔releasesconsistency;audit_seqonrelease_actionsmust be contiguous (0.6.0+).
Schema evolves via numbered migrations. Existing flightdeck.yaml / .flightdeck/ trees pick up new migrations on next CLI or serve startup when Storage.migrate() runs. If you maintain long-lived local databases, skim CHANGELOG.md before upgrading across minor versions.
Patch — bug fixes and internal refactors that preserve CLI/schema/HTTP contracts.
Minor — backward-compatible additions (new optional flags, additive JSON fields within api_version v1, new commands).
Major — breaking CLI contracts, breaking v1 payload shapes, or removal of documented behavior. Migration notes belong in CHANGELOG and here when relevant.
api_versiononRunEventandReleaseArtifactis"v1"for this freeze;POST /v1/eventsrejects other values with HTTP 400 and a stabledetailstring (missing key defaults tov1server-side before validation).- JSON Schemas under
schemas/v1/are generated — runpython scripts/generate_schemas.pyafter model changes; CI fails on drift.