All notable changes to FlightDeck will be documented in this file.
This project follows Semantic Versioning. From v1.0.0, documented CLI behavior (README.md on the canonical main branch), committed schemas/v1/, and POST /v1/events payloads with api_version v1 are treated as stable public contracts unless a release notes a semver-major bump.
GET /metrics: Prometheus text exposition format scrape endpoint (no new dependencies). Same Bearer / loopback gate asGET /v1/metrics. Configure Prometheus withmetrics_path: /metricsandbearer_token: <FLIGHTDECK_LOCAL_API_TOKEN>(when token is set). Metrics:flightdeck_releases_total,flightdeck_run_events_total,flightdeck_promoted_pointers_total,flightdeck_actions_total,flightdeck_actions_by_type{action=...},flightdeck_pricing_tables_total,flightdeck_schema_version.- Identity passthrough → audit actor: HTTP mutating routes (
POST /v1/promote*,POST /v1/rollback) now readX-FlightDeck-Actor(first) andX-Forwarded-User(second) before falling back to the bodyactorfield. Lets a reverse-proxy / SSO layer stamp the audit ledger authoritatively. Trust model documented inSECURITY.mdanddocs/http-api.md. flightdeck workspace info [--json]— one-screen snapshot of workspace path, database backend, schema version, ledger counters (releases / promoted / actions / run events), configuration (policy, pricing catalog, approval mode), and webhook count. JSON mode for CI / chatops pipelines.flightdeck version [--json]— explicit version subcommand alongside the existing--versionflag;--jsonemits{"name":"flightdeck-ai","version":"1.3.0"}for scripts and dashboards.- Request-context middleware (
flightdeck serve): every response now carriesX-Request-Id(per-request UUID, echoes the caller's header if provided) andX-FlightDeck-Server-Version(package version). Enables end-to-end log correlation alongside webhookdelivery_id. - Webhooks — SSRF defence:
POST /v1/webhooksvalidates the URL on creation; rejects non-http(s) schemes (nofile://,gopher://, etc.), link-local IPv4/IPv6 (covers AWS IMDS169.254.169.254, ECS169.254.170.2, and IPv6fe80::/10), and known cloud-metadata hostnames. Private RFC1918 addresses and loopback are allowed (self-hosted receivers). 21 tests. - Web UI UX fixes: Diff result auto-scrolls into view after Compute diff (verdict was below the fold at 1440 × 900); typed-confirm error message now shows exactly what to type; pricing hints/warnings moved to collapsible
<details>accordions (no longer prominent alert boxes); Runs Release ID input carries a datalist affordance hint. - Community / supply-chain:
CODE_OF_CONDUCT.md(Contributor Covenant 2.1),GOVERNANCE.md(BDFL model + steering-committee transition criteria),CITATION.cff(CFF 1.2.0),FUNDING.yml,.github/ISSUE_TEMPLATE/config.yml. OpenSSF Scorecard, CycloneDX SBOM (attached to GitHub Releases), Trivy filesystem + container scans, multi-arch container image to GHCR (ghcr.io/flightdeckdev/flightdeck) with SLSA provenance + SBOM attestations, stale-issues bot. - CI matrix: Python 3.11 / 3.12 / 3.13 × Linux / Windows (was single Python version). CodeQL SAST for Python and JavaScript/TypeScript. Dependabot for pip, npm (
web/), and GitHub Actions. - Webhooks (v1.3.0): HMAC-signed outbound webhooks for
promote.succeeded,rollback.succeeded, andpromote.blocked. New routesPOST /v1/webhooks,GET /v1/webhooks,DELETE /v1/webhooks/{id}(same Bearer / loopback gate as promote). New CLIflightdeck webhook add | list | remove | test. Signing uses GitHub-conventionX-FlightDeck-Signature: sha256=<hex>over the raw body with a per-webhook secret; delivery is best-effort (5 s timeout, 3 attempts, backoff 1 s / 2 s / 4 s) and never breaks the originating promote / rollback. Schema migration v5 adds thewebhookstable (SQLite + PostgreSQL). No new runtime dependencies. flightdeck demo— runs the packaged examples/quickstart workflow (init → pricing → policy → register → ingest → diff → promote → history) in a temp workspace, with nosedor repo paths; wheels ship fixtures underflightdeck/_bundled_quickstartvia Hatchforce-include.FLIGHTDECK_QUICKSTART_ROOToverrides fixture resolution for CI or forks.- Web UI (
flightdeck serve): Theme (Light / Dark / System icon radios,flightdeck-theme) in the sidebar Settings popover; legacy/#/settingsredirects to#/; collapsible sidebar (flightdeck-sidebar-collapsed); offline system font stack (no remote font CSS); sidebar + favicon use bundled/assets/flightdeck-icon-*.pngwith stableGET /flightdeck-icon.pngfallback;html[data-theme="dark"]tokens and Playwrightweb/e2e/(smokeicon checks,theme.spec.ts,sidebar.spec.ts). - Documentation (GitHub Pages): workflow
.github/workflows/pages.ymlbuildsdocs/with MkDocs Material on pushes tomain; published URL on[project.urls] Documentation, README,DEVELOPMENT.md, andCONTRIBUTING.md. The static site includes a floating Ask AI shortcut (Perplexity with docs + repo context); no FlightDeck servers are involved. flightdeck pricing check— reportsflightdeck-bundled-*snapshot age vs--max-age-days(default 90);--failfor CI.release diff/POST /v1/diffappendpricing.warningswhen bundled snapshots exceed the same age threshold.flightdeck.integrations.telemetry.configure_otel_tracing()— optional OTLP HTTPTracerProviderwiring when thetelemetryextra is installed (seedocs/sdk-integrations.md).- SDK:
flightdeck.sdk.http_commonshared serializers and retry policy; parity tests keep sync/async clients aligned.pytest-covno longer omitssdk/client.py.
pymdown-extensionsbump 10.16 → 10.21.3: patches CVE-2026-46338 (MEDIUM — sibling-prefix path traversal inpymdownx.snippets) and CVE-2025-68142 (LOW — ReDoS in figure caption extension) in the GitHub Pages build dependency (docs/requirements.txt). Not a runtime dependency.
- README:
pip install flightdeck-ai && flightdeck demopromoted to top of landing; install section split into user vs contributor; demo video and screenshot gallery added; stale "~31%" cost-regression example removed;docs/index.mdcompletely rewritten for first-time visitors. [project.optional-dependencies] dev:ruffis>=0.15,<0.16(was an exact patch pin) sopip install/ shared venvs can resolve alongside other tools;uv sync --frozenstill followsuv.lock.docs/troubleshooting.mdnotes checkinguv.lockfor the resolved0.15.xwheel.- Docs / positioning: README local-first and ICP copy; bundled pricing cadence, vendor pricing URLs in YAML comments, and
docs/pricing-catalog.md/ ROADMAP / RELEASE_NOTES staleness commitments. - Web UI (
flightdeck serve): Sidebar Settings popover shows a Settings heading and Theme as sun / moon / monitor icon radios (replacing text-only appearance controls in that surface).
POST /v1/events: uses the sameFLIGHTDECK_LOCAL_API_TOKEN/ loopback policy as promotion and rollback. Remote unauthenticated ingest is no longer accepted; set the env var and sendAuthorization: Bearer(Python SDKapi_token=, or--api-token/ env in examples/integration/emit_sample_events.node.mjs).GET /v1/*: whenFLIGHTDECK_LOCAL_API_TOKENis set, read APIs requireAuthorization: Bearer(same header as writes); previously only mutations were Bearer-gated.- Python:
requires-pythonis>=3.11,<4(replaces>=3.14,<3.15).[tool.ruff] target-versionispy311. CI follows.python-version(currently 3.12).
flightdeck init(default): migrates the ledger, imports bundled OpenAI / Anthropic / Google pricing tables (pricing_versionflightdeck-bundled-2026-05, illustrative snapshot), writes.flightdeck/pricing-catalog.yaml, and setspricing_catalog_pathinflightdeck.yamlso diffs can show cost signals without manualpricing import. Opt out with--no-bundled-pricing. Bundled YAML ships undersrc/flightdeck/bundled_pricing/(wheel package data).GET /health:read_auth(openvsbearer) describes whetherGET /v1/*requiresAuthorization: BearerwhenFLIGHTDECK_LOCAL_API_TOKENis set (aligned with writes).- SQLite: bounded retries on
database is locked/ busy for ledgerexecutepaths;flightdeck serve --sqlite-lock-timeout/--retry-sqlite-lock(and envFLIGHTDECK_SQLITE_*) plusdocs/operations-and-policy.mdconcurrency notes. - CI / dev:
pytest-covwith--cov-fail-under=80onsrc/flightdeck(integrations/*,quickstart_smoke, andsdk/client.pyomitted from the denominator — see[tool.coverage.run]inpyproject.toml). - Experimental
flightdeck.integrations: optional extrasintegrations-langchain,integrations-temporal,integrations-openai-agents, and metaintegrations-ci(CI job); thin mappers from OpenAI chat completions, Anthropic messages, OpenAI Agents–style results, LangChain callbacks, CrewAI-style manual totals, and Temporal-orientedlabels. Docs:docs/sdk-integrations.md; examples:examples/integration/adoption/. Contributor policy updates inAGENTS.md/CLAUDE.md. - PostgreSQL ledger: optional
database_urlinflightdeck.yaml(postgresql://orpostgres://); installpsycopgwithuv sync --extra postgres(orpip install 'flightdeck-ai[postgres]'). Same schema migrations and API behavior as SQLite; run filters use::jsonpredicates onevent_json.flightdeck doctor --backupstays SQLite-only (usepg_dumpfor Postgres). Optional integration tests:FLIGHTDECK_TEST_POSTGRES_URLwith thepostgresextra. GET /v1/runs/export— NDJSON stream of the same filtered slice asGET /v1/runs(optional response headers when truncated).session_id/span_idquery filters onGET /v1/runs, matching CLI/SDK, andoffsetpagination on run listings (withruns list/runs export).- Web Runs page — query
GET /v1/runsfrom the bundled UI.
- Docs / examples:
DEVELOPMENT.md,AGENTS.md,README.md,ROADMAP.md,SUPPORT.md,CONTRIBUTING.md,docs/sdk.md,docs/troubleshooting.md,docs/pricing-catalog.md,examples/integration/README.md,examples/integration/adoption/README.md,examples/deploy/README.md— align with the Python range, ledger-write ingest model, bundled init, ICP/sustainability copy, and outcome-oriented roadmap language. - Web Runs: forensics — empty / offset / truncation messaging, export copy, trace band rows or Group by trace_id, View drawer (structured fields + full JSON, session_id / span_id, focus trap + return focus,
aria-haspopup="dialog"), trace/status columns; run-query failures show a typed error card with Retry. - Web Diff: scannable sections (policy, evidence window, pricing/catalog/hints, rollups), pre-query hint,
evaluated_atwhen present; warn when imported pricing table versions or providers differ baseline vs candidate. - Web Actions: workspace loading skeleton; numbered approval steps; pending Refresh list / Use for confirm; clearer confirms; approval-reason placeholder; Rollback danger-styled; Actions shows whether
VITE_FLIGHTDECK_LOCAL_API_TOKENis set (no value) and an inline hint when the server uses Bearer and the UI token is missing. - Web shell / Overview / CSS: Langfuse-style left sidebar + main column (stacks on narrow viewports); skeleton loading on first load; Overview auto-polls timeline + metrics every 30s when the tab is visible (silent refresh; no manual Refresh button); updates after Actions mutations via context; ledger metrics hints + links to Diff / Runs; Diff query
aria-busy; Security strip/healthloading + Bearer + client-token reassurance line; shared focus-visible / type scale / narrow breakpoints; skip to main (HashRouter-safe); ROADMAP.md adds Visual system backlog item and theme deferral. - Examples / deploy / SECURITY / web README: examples/README.md end-to-end loop + UI polish / operator flow blurb; deploy checklist +
restart: unless-stopped; SECURITY.md deploy pointer; web/README.md Playwright approval vs default runs andinit --no-bundled-pricingfor stableGET /v1/workspaceprobes. - Playwright:
e2e-server.mjsgates approval workspace onPW_FORCE_APPROVAL_WORKSPACE(set from config);reuseExistingServer: false; config sets approval workspace only when the CLI lists exactly onee2e/*.spec.tspath and it isactions-approval.spec.ts(avoids multi-spec argv;PW_WEBSERVER_APPROVALno longer toggles the server so a stale value cannot breaknpm run test:e2e);actions-approval.spec.tsskips whenGET /v1/workspaceshows approval off (e.g. full suite withFD_E2E_FORCE_APPROVAL=1); default e2e workspace usesflightdeck init --no-bundled-pricingsopricing_catalog_configuredstaysfalsefore2e/smoke.spec.ts. - Examples / CI / deploy / Helm pins:
flightdeck-ai>=1.2.0where version pins apply.
trace_idfilter onGET /v1/runs,flightdeck runs list --trace-id, and SDKlist_runs(trace_id=…)— exact match on ingestedRunEvent.request.trace_id.flightdeck runs export— write the same filtered run-event slice asruns listas JSONL (optional-ofile; default stdout);--limitdefaults to 500 (max 500); prints a stderr warning when results are truncated.
- Examples / CI snippets:
flightdeck-ai>=1.1.2where version pins apply.
GET /v1/workspace: read-only JSON for operators and the web UI —promotion_requires_approval,pricing_catalog_configured,server_version(normative schema + Python SDK helper).- Web Actions: Promote flow uses workspace flags — direct
POST /v1/promotewhen approval is off; request → list pending → confirm whenpromotion_requires_approvalis on, with clearer errors. - Docs: README / release-artifact / examples / web-ui / http-api / sdk updates for the v1.1.x remainder; optional
docs/pricing-catalog.md;examples/ci/promote_with_approval.shand CI README GitHub Actions pattern for approval-gated promote.
- Examples / CI snippets:
flightdeck-ai>=1.1.1where version pins apply. - Positioning: README, PyPI short description, CLI
--help, and web header tagline emphasize outcome-oriented messaging (diffs, evidence, policy gates) plus README sections for stack fit and product comparisons.
- Pricing catalog: optional
pricing_catalog_pathinflightdeck.yamlloads aPricingCatalogYAML;POST /v1/diff/release diffinclude additivepricing.catalogandpricing.hints(seeschemas/v1/pricing_catalog.schema.json,examples/pricing/catalog.sample.yaml). - Promotion approval:
promotion_requires_approvalinflightdeck.yaml;POST /v1/promote/request,POST /v1/promote/confirm,GET /v1/promotion-requests, and CLIrelease promote-request/promote-confirm. - Forensics:
GET /v1/runsandflightdeck runs listfor read-only run event slices. - Deploy: optional Helm chart under
examples/deploy/chart/flightdeck/. - Examples:
examples/fleet/README.mdand workspace template. - SQLite migration v4:
promotion_requeststable.
- Examples / CI snippets:
flightdeck-ai>=1.1.0in Docker and PyPI gate samples.
- CLI
flightdeck doctor --backup PATH: SQLite online backup of the workspace database toPATH(parent directories created; file overwritten if present), then the usual doctor checks. - Examples: examples/integration/emit_sample_events.node.mjs —
POST /v1/eventssample using built-infetch(Node 18+); examples/integration/README.md addscurl+jqexample. - Docs: examples/deploy/README.md — Compose
/healthhealthcheck anddoctor --backup/ cron scheduling notes. - Roadmap: Phase 0 declared closed; catalog-level multi-provider pricing normalization called out under mid-term productization build items.
- Tests:
test_doctor_backup_writes_valid_sqliteintests/test_cli.py.
- Examples / CI snippets:
flightdeck-ai>=1.0.6in Docker and PyPI gate samples.
- CLI
release diff --output json: prints the same JSON object asPOST /v1/diff(sorted keys) forjq/ CI parsers; works with--fail-on-policy(JSON to stdout, then exit 1 on policy failure). POST /v1/diff:pricing.warnings— string list when baseline or candidatespec.runtime.modelhas no row in that side's imported pricing table (diagnostic only;policyunchanged). CLI prints matchingWARNING:lines in text mode.- Web UI: Run diff shows pricing warnings above the pricing/model-change banner; Overview adds a Ledger metrics card (
GET /v1/metrics). - Docs: docs/cli.md and docs/http-api.md document
--output jsonandpricing.warnings. - Tests:
test_release_diff_output_json_shape,test_release_diff_pricing_warnings_when_model_not_in_tableintests/test_spine.py;test_release_diff_fail_on_policy_with_json_outputintests/test_cli_contract.py;test_http_v1_diff_pricing_warnings_when_model_missingandpricing.warningsassertion on the happy path intests/test_server_actions.py.
- HTTP
GET /v1/metrics: read-only JSON counters for the local ledger (releases_total,pricing_tables_total,run_events_total,promoted_pointers_total,actions_total,actions_by_action) plusschema_versionandgenerated_at; backed byStorage.get_ledger_counters(). POST /v1/diff:pricing.prices— per-side input/output/cached-input USD per 1k tokens for the resolved model (mirrors table entries; helps separate tariff changes from token volume).- CLI
release diff: when pricing or model differs, prints Per-1k token prices after the existing NOTE line. - Web UI (Run diff): shows per-1k input/output price deltas under the pricing/model-change banner when those numbers are present.
- Docs: examples/README.md operating walkthrough; docs/http-api.md documents
GET /v1/metricsandpricing.prices; docs/cli.md documents the new diff output line. - Tests:
test_v1_metrics_returns_countersintests/test_server_health.py;POST /v1/diffpricing.pricesassertions on cross-model diff intests/test_spine.py.
- Roadmap: Next release and Phase 0 progress updated for v1.0.4 (pricing diagnostic, examples index, metrics endpoint).
- Examples / CI snippets:
flightdeck-ai>=1.0.4in Docker and PyPI gate samples.
- Tests:
tests/test_ledger.py— MEDIUM vsrequire_high_diff_confidence, LOW sample-floor boundary,max_latency_ms(and skip when latency absent),max_error_rate, multiple simultaneous policy failure reasons;tests/test_spine.py— MEDIUM confidence blocks secondrelease promote,runs ingeston empty file / malformed JSONL / JSON array payload,release diffacross different pricing providers and across different models on one provider table (plusPOST /v1/diffpricing.pricing_or_model_changedassertion). - Web UI: structured Promote & rollback outcome (policy badge, pointer status, action/release/baseline IDs, reason list) with raw response in a collapsed
JsonPanel; Run diff shows a pricing/model-change callout whenpricing.pricing_or_model_changedis true.
- Roadmap: Phase 0 progress subsection and Next release pointer for v1.0.3; docs aligned with the patch scope above.
- CLI:
flightdeck release diff --fail-on-policyexits 1 when the active policy does not pass (after printing the diff), for CI gates without callingrelease promote. - HTTP
GET /health: response includesmutation_auth(loopbackorbearer) — safe hint for whetherFLIGHTDECK_LOCAL_API_TOKENis configured (no secret material). - Web UI: security status strip (server mode + whether
VITE_FLIGHTDECK_LOCAL_API_TOKENis set); optional read-only mode viaVITE_FLIGHTDECK_UI_READ_ONLY=true(hides Promote nav and#/actions). - examples/ci:
ledger_gate.py,ledger-gate-policy.yaml,ledger-gate.sh(wrapper),github-actions/policy-gate-*.yml, examples/ci/README.md;.github/workflows/ci.ymlrunsuv run python examples/ci/ledger_gate.pyon Ubuntu and Windows (no bash-only gate). - examples/deploy: reference
Dockerfile,docker-compose.yml,entrypoint.sh, examples/deploy/README.md. - examples/integration:
emit_sample_events.py, examples/integration/README.md. - Tests:
tests/test_server_health.py;test_release_diff_fail_on_policy_exits_1intests/test_cli_contract.py; Playwright smoke asserts/healthincludesmutation_auth.
diff_releaseszero policy sample thresholds:Policy.min_candidate_runs,Policy.min_baseline_runs, andPolicy.min_low_runsset to0now correctly override workspace config defaults to0instead of being silently ignored. Previously,or-based fallback treated0as falsy and fell back to the config value (typically500/50). Fixed by using explicitis not Nonechecks. A policy can now unconditionally accept any sample size by setting thresholds to0— for example, to allow diffs over empty event windows without a confidence downgrade.- examples/ci ledger gate:
ledger_gate.pyinvokes the CLI aspython -m flightdeck.cli.main(avoids nesteduv run/ Windowsflightdeck.exelocks); wipesWORKSPACEwithshutil.rmtreebeforeinit; uniqueWORKSPACEper CI run (run_id+run_attempt).ledger-gate-policy.yamlcaps cost high enough for quickstart candidate rollup (quickstartpolicy.yamlat $4 rejects ~$5/run under--fail-on-policy).
- Docs:
docs/cli.mddocuments--fail-on-policy;docs/http-api.md/docs/sdk.mddocumentGET /healthmutation_auth. .gitattributes: LF forexamples/deploy/*.sh(Docker entrypoint) andexamples/ci/*.sh(CI shell wrappers).
.gitattributes: force LF fortests/fixtures/golden_bundle/so checkout line endings do not change the pinned bundle digest (matches the 0.7.0 changelog intent).
- Slim distribution: this repository ships a focused in-tree
docs/tree (CLI, HTTP API, SDK, operations/policy, release artifact, web UI references); org mirror scripts andverify-repo-standardswrappers are not included. Extended maintainer runbooks and the canonical README live on github.com/flightdeckdev/flightdeck; in-repo links now point there where applicable. pyproject.toml: OpenTelemetry packages are optional only (telemetry/allextras); the default install matches the 1.0.0 dependency story (core does not import OpenTelemetry)..pre-commit-config.yaml: ruff replaces black / isort;ruff-pre-commitpinned to v0.15.12 to matchdev(ruff==0.15.12).- CI: Python 3.13 and 3.14 added to the Ubuntu and Windows matrices (superseded by 3.14-only policy as of 1.0.2, then relaxed to 3.11+ as of 1.2.0).
pyproject.toml: defaultpytest --basetemp=.tmp/pytestso local runs avoid WindowsPermissionErroron%TEMP%\pytest-of-*.pre-commit-hooks: bumped to v5.0.0.
tests/test_sync_export_public.py(depended on export tooling not shipped in this tree).
- v1.0.0 GA freeze narrative:
RELEASE_NOTES.md,docs/spec-v1-forward.md,docs/v1-next-steps.md(archived internal planning underdocs/reviews/remains development-clone only).
- v1.0.0 GA freeze: stable contracts for the local-first spine summarized in RELEASE_NOTES.md (trust boundaries, SQLite migrations, payload versioning).
pyproject.toml: Development Status :: 5 - Production/Stable on PyPI classifiers.- Dependencies:
opentelemetry-api,opentelemetry-sdk, andopentelemetry-exporter-otlpremoved from default installs; added optionaltelemetryextra (included inall) for forward OTLP work — core code did not import OpenTelemetry.
- RELEASE_NOTES.md: maintainer-facing trust boundaries, SQLite upgrades, pre-1.0 vs v1.0.0 freeze intent, payload
api_versionbehavior. tests/fixtures/json/: minimal golden JSON forRunEvent,ReleaseArtifact,PricingTable,Policy;tests/test_schemas.pyvalidates each fixture against Pydantic models.- HTTP ingest tests:
POST /v1/eventsrejects emptyapi_version, wrong casing (V1), JSONnull; accepts omittedapi_version(defaults tov1); stabledetailstring forv2rejections. - CLAUDE.md: short agent entry (must-read table, verify commands, Windows note).
- 0.9 → 1.0 sequencing captured in
docs/v1-next-steps.md(detailed milestone plans archived underdocs/reviews/in maintainer clones only).
- AGENTS.md: public contracts section, large-change review checklist, expanded verification (including
quickstart_smoke.py), PR-shaped slice guidance, pointers toCLAUDE.mdand forward spec. - .cursorrules: slimmed to defer to
AGENTS.md/CLAUDE.mdand the same verify bar. - VERSIONING.md: database migrations describe shipped numbered SQLite migrations (replacing stale “future work” wording); Approaching 1.0.0 pointer to
RELEASE_NOTES.md/docs/v1-next-steps.md.
- docs/cli.md: CLI reference (synopsis, flags, exit codes, pointers to quickstart examples).
scripts/quickstart_smoke.py: cross-platform quickstart smoke (no bash): temp workspace, Python placeholder substitution,release verify,doctor.- CI: run quickstart smoke on Ubuntu and Windows matrix jobs (alongside pytest and schema drift).
- Tests:
tests/test_quickstart_smoke.pyexercises the smoke script. - 0.8 milestone planning (CLI + CI): archived under
docs/reviews/in development clones; shipped CLI narrative is docs/cli.md on the canonical repo; this tree shipsscripts/quickstart_smoke.py/flightdeck-quickstart-verify(see Unreleased).
- docs/quickstart.md: recommend
python scripts/quickstart_smoke.pyon Windows; bash flow kept as optional. - docs/architecture.md: deferred section updated for shipped SDK / rollback / serve / doctor / verify.
scripts/verify-repo-standards.sh/.ps1: runquickstart_smoke.pyafter pytest (same bar as CI).
flightdeck release verify <release_id> --path …: compares the checksum stored at registration withbundle_checksumon a supplied directory orrelease.yamlfile; exit code 2 on mismatch (1 for normal CLI errors).- Committed golden bundle
tests/fixtures/golden_bundle/with a pinned SHA-256 asserted in CI (Linux + Windows). .gitattributes: force LF for the golden fixture path so line-ending normalization on checkout does not change the digest.- 0.7 milestone planning (golden bundle / verify): archived under
docs/reviews/in development clones; seetests/fixtures/golden_bundle/andflightdeck release verifyabove.
flightdeck.bundle: skip symlink files when hashing bundles (determinism + safety); POSIX test intests/test_bundle_golden_fixture.py(skipped on Windows where symlink creation is often unavailable).- CI: run
python scripts/generate_schemas.pythengit diff --exit-code schemas/on Ubuntu and Windows to catch hand-edited schema drift.
- Apache License, Version 2.0: root
LICENSE(from apache.org),NOTICE, andpyproject.tomllicense = "Apache-2.0"aligned with the canonical org repo flightdeckdev/flightdeck. - SQLite migration 3:
release_actions.audit_seq(backfilled increated_atorder),UNIQUEindexidx_release_actions_audit_seq, and automatic assignment on insert viaStorage._next_audit_seq. PromotionRecord.audit_seq: optional on write; populated when listing actions from storage.Storage.check_release_actions_audit_seq()andflightdeck doctorextension: verifies contiguous non-nullaudit_seqvalues1..max(gap / tamper hint per forward spec).
- README / docs/github-organization.md / docs/git-remotes.md: point at
https://github.com/flightdeckdev/flightdeck.
flightdeck doctor: read-only checks for SQLite schema migrations (throughLATEST_SCHEMA_MIGRATION_VERSION) and promoted release pointers (eachpromoted_releases.release_idexists inreleases).flightdeck.storage:list_applied_migrations(),list_promoted_pointers(), andLATEST_SCHEMA_MIGRATION_VERSION(keep in sync when adding migrations).
- docs/v1-next-steps.md: Maintainer v1 gap analysis (P0/P1/P2), milestone sequencing (0.5–1.0), and risk callouts; tracks implementation status as work lands.
flightdeck serve: warns when--hostis not loopback (trust boundary; see forward spec §4).POST /v1/events: rejects unsupportedapi_versionbefore Pydantic with a clear 400 detail.- Ledger tests (
tests/test_ledger.py):diff_releasesrejects cross-agent and mixed-agent run batches.
- Implicit default policy (no
flightdeck policy set):require_high_diff_confidencenow defaults totrue, matching thePolicymodel and v1 GA direction. Quickstart and tests keep explicitrequire_high_diff_confidence: falsewhere low-sample demos need it. diff_releases: enforces a single sharedagent_idacross baseline and candidate run events when both sides are non-empty (defense in depth vs CLI-only checks).Storage.insert_release: usestransaction()for the same atomic discipline as promotion paths.- CLI
release diff,release promote, andrelease rollback: surfaceValueErrorfromdiff_releasesasClickException.
- docs/git-remotes.md: configure
origin(personal research) vsorg(flightdeckdev canonical), with everydaygit pushexamples.
- Research workflow docs (docs/research-workflow.md, RESEARCH.md, AGENTS.md, .cursorrules, docs/github-organization.md) now state explicitly: personal account = research clone; org = user-facing canonical.
- docs/github-organization.md for the flightdeckdev org: when to add repos, pre-push checklist, private-file policy.
scripts/verify-repo-standards.sh/.ps1: run ruff + pytest before pushing.
.gitignore: ignore.flightdeck/(local DB/config),private/,secrets/, common cert/credential patterns,Thumbs.db.- Release bundle checksum moved to
flightdeck.bundle: LF normalization for text-like extensions so CRLF vs LF does not change the digest;.git/__pycache__under a bundle are excluded from hashing. - SQLite migration 2: index on
run_events(release_id, timestamp)for ledger queries.
- SECURITY.md and CONTRIBUTING.md expanded with secret/local-path guidance and link to the org push gate doc.
- Forward v1 specification (docs/spec-v1-forward.md): normative direction for v1 GA (versioning, migrations, bundle checksum canonicalization, trust boundaries, diff/policy defaults, SDK testing discipline).
docs/spec.mdremains the frozen 0.x implementation narrative; new guarantees land here first. - SDK unit test using
httpx.MockTransportso the Python client is covered without relying on sync ASGI transport quirks.
- README status and documentation index now point at the forward v1 spec and reflect shipped local HTTP + minimal SDK.
- Local HTTP ingestion service:
flightdeck servewithPOST /v1/events. - Minimal HTTP client helper:
flightdeck.sdk.client.FlightdeckClient. flightdeck release rollbackwith the same policy gate + audit trail aspromote.- Append-only pricing import audit log (
pricing_import_audit) and required--reasonforpricing import --replace. - Public JSON Schemas under
schemas/v1/plusscripts/generate_schemas.py. - Policy can require HIGH diff confidence (
require_high_diff_confidence, defaulttrueon explicit policies).
- Atomic promotion: audit record + promoted pointer update now share a single DB transaction.
- SQLite connections enable WAL + busy timeout to reduce Windows locking issues.
- Safer
--windowparsing errors are surfaced asClickException(no tracebacks).
- Local release registry (
flightdeck release register,flightdeck release list,flightdeck release show). - Run event ingestion (
flightdeck runs ingest). - Trusted
flightdeck release diffwith confidence labels, explicit--window, and ASCIIdeltaoutput. - Per-release pricing for diffs (baseline and candidate are costed against their own
pricing_reference). - Cross-agent diff rejection by default.
- Immutable pricing table import with explicit
--replaceandflightdeck pricing show. - Active policy object (
flightdeck policy set,flightdeck policy show) used for diff evaluation and promotion. - Policy-gated
flightdeck release promotewith required--reasonandflightdeck release history.
- Cost estimates are model token costs only; tool spend pricing is not implemented yet.
- Windows: avoid pytest temp-dir permission issues by redirecting
TEMP/TMPinto a repo-local.tmp/directory during pytest (seetests/conftest.py), with an opt-out viaFLIGHTDECK_USE_SYSTEM_TEMP=1.