flightdeck-ai 1.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flightdeck_ai-1.0.1/.cursorrules +7 -0
- flightdeck_ai-1.0.1/.gitattributes +2 -0
- flightdeck_ai-1.0.1/.github/CODEOWNERS +2 -0
- flightdeck_ai-1.0.1/.github/ISSUE_TEMPLATE/bug_report.yml +29 -0
- flightdeck_ai-1.0.1/.github/ISSUE_TEMPLATE/feature_request.yml +34 -0
- flightdeck_ai-1.0.1/.github/PULL_REQUEST_TEMPLATE.md +21 -0
- flightdeck_ai-1.0.1/.github/workflows/ci.yml +81 -0
- flightdeck_ai-1.0.1/.github/workflows/release-pypi.yml +89 -0
- flightdeck_ai-1.0.1/.gitignore +31 -0
- flightdeck_ai-1.0.1/.pre-commit-config.yaml +17 -0
- flightdeck_ai-1.0.1/.python-version +1 -0
- flightdeck_ai-1.0.1/AGENTS.md +104 -0
- flightdeck_ai-1.0.1/CHANGELOG.md +215 -0
- flightdeck_ai-1.0.1/CLAUDE.md +38 -0
- flightdeck_ai-1.0.1/CONTRIBUTING.md +77 -0
- flightdeck_ai-1.0.1/DEVELOPMENT.md +134 -0
- flightdeck_ai-1.0.1/LICENSE +202 -0
- flightdeck_ai-1.0.1/NOTICE +14 -0
- flightdeck_ai-1.0.1/PKG-INFO +189 -0
- flightdeck_ai-1.0.1/README.md +142 -0
- flightdeck_ai-1.0.1/RELEASE_NOTES.md +58 -0
- flightdeck_ai-1.0.1/ROADMAP.md +29 -0
- flightdeck_ai-1.0.1/SECURITY.md +35 -0
- flightdeck_ai-1.0.1/VERSIONING.md +38 -0
- flightdeck_ai-1.0.1/examples/quickstart/README.md +16 -0
- flightdeck_ai-1.0.1/examples/quickstart/baseline-events.jsonl +1 -0
- flightdeck_ai-1.0.1/examples/quickstart/baseline-release/prompts/system.md +1 -0
- flightdeck_ai-1.0.1/examples/quickstart/baseline-release/release.yaml +22 -0
- flightdeck_ai-1.0.1/examples/quickstart/candidate-events.jsonl +1 -0
- flightdeck_ai-1.0.1/examples/quickstart/candidate-release/prompts/system.md +1 -0
- flightdeck_ai-1.0.1/examples/quickstart/candidate-release/release.yaml +22 -0
- flightdeck_ai-1.0.1/examples/quickstart/policy.yaml +8 -0
- flightdeck_ai-1.0.1/examples/quickstart/pricing-baseline.yaml +6 -0
- flightdeck_ai-1.0.1/examples/quickstart/pricing-candidate.yaml +6 -0
- flightdeck_ai-1.0.1/pyproject.toml +77 -0
- flightdeck_ai-1.0.1/schemas/v1/policy.schema.json +96 -0
- flightdeck_ai-1.0.1/schemas/v1/pricing_table.schema.json +66 -0
- flightdeck_ai-1.0.1/schemas/v1/release.schema.json +396 -0
- flightdeck_ai-1.0.1/schemas/v1/run_event.schema.json +249 -0
- flightdeck_ai-1.0.1/scripts/generate_schemas.py +23 -0
- flightdeck_ai-1.0.1/scripts/quickstart_smoke.py +89 -0
- flightdeck_ai-1.0.1/scripts/smoke.sh +34 -0
- flightdeck_ai-1.0.1/src/flightdeck/__init__.py +3 -0
- flightdeck_ai-1.0.1/src/flightdeck/bundle.py +68 -0
- flightdeck_ai-1.0.1/src/flightdeck/cli/__init__.py +0 -0
- flightdeck_ai-1.0.1/src/flightdeck/cli/main.py +727 -0
- flightdeck_ai-1.0.1/src/flightdeck/config.py +40 -0
- flightdeck_ai-1.0.1/src/flightdeck/doctor.py +59 -0
- flightdeck_ai-1.0.1/src/flightdeck/ledger.py +310 -0
- flightdeck_ai-1.0.1/src/flightdeck/models.py +235 -0
- flightdeck_ai-1.0.1/src/flightdeck/sdk/__init__.py +1 -0
- flightdeck_ai-1.0.1/src/flightdeck/sdk/client.py +25 -0
- flightdeck_ai-1.0.1/src/flightdeck/server/__init__.py +1 -0
- flightdeck_ai-1.0.1/src/flightdeck/server/app.py +46 -0
- flightdeck_ai-1.0.1/src/flightdeck/server/routes/__init__.py +0 -0
- flightdeck_ai-1.0.1/src/flightdeck/storage.py +628 -0
- flightdeck_ai-1.0.1/tests/conftest.py +27 -0
- flightdeck_ai-1.0.1/tests/fixtures/golden_bundle/prompts/s.md +2 -0
- flightdeck_ai-1.0.1/tests/fixtures/golden_bundle/release.yaml +16 -0
- flightdeck_ai-1.0.1/tests/fixtures/json/policy_minimal_v1.json +4 -0
- flightdeck_ai-1.0.1/tests/fixtures/json/pricing_table_minimal_v1.json +11 -0
- flightdeck_ai-1.0.1/tests/fixtures/json/release_artifact_minimal_v1.json +24 -0
- flightdeck_ai-1.0.1/tests/fixtures/json/run_event_minimal_v1.json +28 -0
- flightdeck_ai-1.0.1/tests/test_bundle_checksum.py +38 -0
- flightdeck_ai-1.0.1/tests/test_bundle_golden_fixture.py +30 -0
- flightdeck_ai-1.0.1/tests/test_cli.py +19 -0
- flightdeck_ai-1.0.1/tests/test_doctor.py +172 -0
- flightdeck_ai-1.0.1/tests/test_examples_parse.py +43 -0
- flightdeck_ai-1.0.1/tests/test_ledger.py +115 -0
- flightdeck_ai-1.0.1/tests/test_quickstart_smoke.py +19 -0
- flightdeck_ai-1.0.1/tests/test_release_verify.py +56 -0
- flightdeck_ai-1.0.1/tests/test_schemas.py +40 -0
- flightdeck_ai-1.0.1/tests/test_sdk_client.py +52 -0
- flightdeck_ai-1.0.1/tests/test_server_ingest.py +252 -0
- flightdeck_ai-1.0.1/tests/test_spine.py +769 -0
- flightdeck_ai-1.0.1/tests/test_version_consistency.py +25 -0
- flightdeck_ai-1.0.1/uv.lock +963 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# FlightDeck — Cursor
|
|
2
|
+
|
|
3
|
+
Read **`AGENTS.md`** for mission, non-goals, public contracts, engineering rules, verification, and docs policy. **`CLAUDE.md`** is a short index for Claude Code / Cursor.
|
|
4
|
+
|
|
5
|
+
Quick verify (uv): `uv sync --frozen --extra dev`, then `uv run python -m ruff check src tests`, `uv run python -m pytest`, `uv run python scripts/quickstart_smoke.py` (pip/venv equivalents in `DEVELOPMENT.md`; on Windows, `py -3` if needed).
|
|
6
|
+
|
|
7
|
+
Normative v1 direction: https://github.com/flightdeckdev/flightdeck/blob/main/docs/spec-v1-forward.md · backlog: https://github.com/flightdeckdev/flightdeck/blob/main/docs/v1-next-steps.md · CLI: https://github.com/flightdeckdev/flightdeck/blob/main/docs/cli.md
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a reproducible problem with FlightDeck.
|
|
3
|
+
title: "bug: "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: summary
|
|
8
|
+
attributes:
|
|
9
|
+
label: Summary
|
|
10
|
+
description: What happened?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: reproduce
|
|
15
|
+
attributes:
|
|
16
|
+
label: Reproduction
|
|
17
|
+
description: Commands, inputs, and output needed to reproduce.
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: input
|
|
21
|
+
id: version
|
|
22
|
+
attributes:
|
|
23
|
+
label: Version
|
|
24
|
+
description: FlightDeck version or commit.
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: environment
|
|
27
|
+
attributes:
|
|
28
|
+
label: Environment
|
|
29
|
+
description: OS, Python version, and relevant setup details.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose a focused FlightDeck capability.
|
|
3
|
+
title: "feat: "
|
|
4
|
+
labels: ["enhancement"]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: Problem
|
|
10
|
+
description: What release safety problem does this solve?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: proposal
|
|
15
|
+
attributes:
|
|
16
|
+
label: Proposal
|
|
17
|
+
description: What should FlightDeck do?
|
|
18
|
+
validations:
|
|
19
|
+
required: true
|
|
20
|
+
- type: dropdown
|
|
21
|
+
id: area
|
|
22
|
+
attributes:
|
|
23
|
+
label: Area
|
|
24
|
+
options:
|
|
25
|
+
- release artifact
|
|
26
|
+
- run event
|
|
27
|
+
- safety ledger
|
|
28
|
+
- pricing
|
|
29
|
+
- policy
|
|
30
|
+
- CLI
|
|
31
|
+
- docs
|
|
32
|
+
- other
|
|
33
|
+
validations:
|
|
34
|
+
required: true
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
## Why
|
|
4
|
+
|
|
5
|
+
## Changes
|
|
6
|
+
|
|
7
|
+
## Validation
|
|
8
|
+
|
|
9
|
+
- [ ] `python -m ruff check src tests`
|
|
10
|
+
- [ ] `python -m pytest`
|
|
11
|
+
- [ ] CLI smoke test, if relevant
|
|
12
|
+
|
|
13
|
+
## Schema / Storage Impact
|
|
14
|
+
|
|
15
|
+
- [ ] None
|
|
16
|
+
- [ ] Schema change
|
|
17
|
+
- [ ] Storage change
|
|
18
|
+
|
|
19
|
+
## Risk
|
|
20
|
+
|
|
21
|
+
## Notes
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches: [main]
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
strategy:
|
|
12
|
+
fail-fast: false
|
|
13
|
+
matrix:
|
|
14
|
+
python-version: ["3.14"]
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout
|
|
18
|
+
uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Set up uv
|
|
21
|
+
uses: astral-sh/setup-uv@v5
|
|
22
|
+
with:
|
|
23
|
+
enable-cache: true
|
|
24
|
+
python-version: ${{ matrix.python-version }}
|
|
25
|
+
|
|
26
|
+
- name: Sync dependencies
|
|
27
|
+
run: uv sync --frozen --extra dev
|
|
28
|
+
|
|
29
|
+
- name: Lint
|
|
30
|
+
run: uv run python -m ruff check src tests
|
|
31
|
+
|
|
32
|
+
- name: Test
|
|
33
|
+
run: uv run python -m pytest
|
|
34
|
+
|
|
35
|
+
- name: JSON Schemas drift check
|
|
36
|
+
run: |
|
|
37
|
+
uv run python scripts/generate_schemas.py
|
|
38
|
+
git diff --exit-code schemas/
|
|
39
|
+
|
|
40
|
+
- name: Quickstart smoke (cross-platform)
|
|
41
|
+
run: uv run python scripts/quickstart_smoke.py
|
|
42
|
+
|
|
43
|
+
- name: CLI smoke
|
|
44
|
+
run: uv run flightdeck --help
|
|
45
|
+
|
|
46
|
+
test-windows:
|
|
47
|
+
runs-on: windows-latest
|
|
48
|
+
strategy:
|
|
49
|
+
fail-fast: false
|
|
50
|
+
matrix:
|
|
51
|
+
python-version: ["3.14"]
|
|
52
|
+
|
|
53
|
+
steps:
|
|
54
|
+
- name: Checkout
|
|
55
|
+
uses: actions/checkout@v4
|
|
56
|
+
|
|
57
|
+
- name: Set up uv
|
|
58
|
+
uses: astral-sh/setup-uv@v5
|
|
59
|
+
with:
|
|
60
|
+
enable-cache: true
|
|
61
|
+
python-version: ${{ matrix.python-version }}
|
|
62
|
+
|
|
63
|
+
- name: Sync dependencies
|
|
64
|
+
run: uv sync --frozen --extra dev
|
|
65
|
+
|
|
66
|
+
- name: Lint
|
|
67
|
+
run: uv run python -m ruff check src tests
|
|
68
|
+
|
|
69
|
+
- name: Test
|
|
70
|
+
run: uv run python -m pytest
|
|
71
|
+
|
|
72
|
+
- name: JSON Schemas drift check
|
|
73
|
+
run: |
|
|
74
|
+
uv run python scripts/generate_schemas.py
|
|
75
|
+
git diff --exit-code schemas/
|
|
76
|
+
|
|
77
|
+
- name: Quickstart smoke (cross-platform)
|
|
78
|
+
run: uv run python scripts/quickstart_smoke.py
|
|
79
|
+
|
|
80
|
+
- name: CLI smoke
|
|
81
|
+
run: uv run flightdeck --help
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Publish sdist + wheel to PyPI when a SemVer tag is pushed (e.g. v1.0.2).
|
|
2
|
+
# Configure "trusted publishing" on PyPI for this workflow + repository + optional GitHub environment.
|
|
3
|
+
# https://docs.pypi.org/trusted-publishers/
|
|
4
|
+
|
|
5
|
+
name: Release (PyPI)
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
tags:
|
|
10
|
+
- "v[0-9]+.[0-9]+.[0-9]+"
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
publish:
|
|
14
|
+
name: Build, verify, publish
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
environment:
|
|
17
|
+
name: pypi
|
|
18
|
+
url: https://pypi.org/project/flightdeck-ai/
|
|
19
|
+
permissions:
|
|
20
|
+
contents: write
|
|
21
|
+
id-token: write
|
|
22
|
+
steps:
|
|
23
|
+
- name: Checkout
|
|
24
|
+
uses: actions/checkout@v4
|
|
25
|
+
|
|
26
|
+
- name: Set up uv
|
|
27
|
+
uses: astral-sh/setup-uv@v5
|
|
28
|
+
with:
|
|
29
|
+
enable-cache: true
|
|
30
|
+
python-version-file: .python-version
|
|
31
|
+
|
|
32
|
+
- name: Sync locked dev environment
|
|
33
|
+
run: uv sync --frozen --extra dev
|
|
34
|
+
|
|
35
|
+
- name: Verify tag matches declared package versions
|
|
36
|
+
shell: bash
|
|
37
|
+
env:
|
|
38
|
+
TAG: ${{ github.ref_name }}
|
|
39
|
+
run: |
|
|
40
|
+
set -euo pipefail
|
|
41
|
+
if [[ ! "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
42
|
+
echo "Unexpected tag format: $TAG (expected vMAJOR.MINOR.PATCH)"
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
uv run python <<'PY'
|
|
46
|
+
import os
|
|
47
|
+
import pathlib
|
|
48
|
+
import re
|
|
49
|
+
import tomllib
|
|
50
|
+
|
|
51
|
+
tag = os.environ["TAG"]
|
|
52
|
+
expected = tag.removeprefix("v")
|
|
53
|
+
data = tomllib.loads(pathlib.Path("pyproject.toml").read_text(encoding="utf-8"))
|
|
54
|
+
pyproject = data["project"]["version"]
|
|
55
|
+
init = pathlib.Path("src/flightdeck/__init__.py").read_text(encoding="utf-8")
|
|
56
|
+
m = re.search(r'__version__\s*=\s*["\']([^"\']+)["\']', init)
|
|
57
|
+
if not m:
|
|
58
|
+
raise SystemExit("Could not parse __version__ from src/flightdeck/__init__.py")
|
|
59
|
+
module = m.group(1)
|
|
60
|
+
if pyproject != expected:
|
|
61
|
+
raise SystemExit(f"Tag {tag} expects {expected} but pyproject.toml has {pyproject}")
|
|
62
|
+
if module != expected:
|
|
63
|
+
raise SystemExit(f"Tag {tag} expects {expected} but __init__.py has {module}")
|
|
64
|
+
PY
|
|
65
|
+
|
|
66
|
+
- name: Lint
|
|
67
|
+
run: uv run python -m ruff check src tests
|
|
68
|
+
|
|
69
|
+
- name: Test
|
|
70
|
+
run: uv run python -m pytest
|
|
71
|
+
|
|
72
|
+
- name: JSON Schemas drift check
|
|
73
|
+
run: |
|
|
74
|
+
uv run python scripts/generate_schemas.py
|
|
75
|
+
git diff --exit-code schemas/
|
|
76
|
+
|
|
77
|
+
- name: Build distributions
|
|
78
|
+
run: uv build
|
|
79
|
+
|
|
80
|
+
- name: Publish to PyPI
|
|
81
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
82
|
+
with:
|
|
83
|
+
attestations: true
|
|
84
|
+
|
|
85
|
+
- name: Create GitHub Release
|
|
86
|
+
uses: softprops/action-gh-release@v2
|
|
87
|
+
with:
|
|
88
|
+
files: dist/*
|
|
89
|
+
generate_release_notes: true
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.py[cod]
|
|
3
|
+
.pytest_cache/
|
|
4
|
+
pytest-cache-files-*/
|
|
5
|
+
.ruff_cache/
|
|
6
|
+
.tmp/
|
|
7
|
+
.venv/
|
|
8
|
+
build/
|
|
9
|
+
dist/
|
|
10
|
+
*.egg-info/
|
|
11
|
+
.coverage
|
|
12
|
+
htmlcov/
|
|
13
|
+
.DS_Store
|
|
14
|
+
Thumbs.db
|
|
15
|
+
|
|
16
|
+
# Local FlightDeck workspace (SQLite ledger + local config); never commit.
|
|
17
|
+
.flightdeck/
|
|
18
|
+
|
|
19
|
+
# Environment and secrets
|
|
20
|
+
.env
|
|
21
|
+
.env.*
|
|
22
|
+
*.pem
|
|
23
|
+
*.p12
|
|
24
|
+
*.pfx
|
|
25
|
+
secrets/
|
|
26
|
+
private/
|
|
27
|
+
|
|
28
|
+
# Common credential filenames (adjust if you add fixtures with similar names).
|
|
29
|
+
*credentials*.json
|
|
30
|
+
*service-account*.json
|
|
31
|
+
google-credentials.json
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v5.0.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: check-ast
|
|
6
|
+
- id: check-merge-conflict
|
|
7
|
+
- id: check-yaml
|
|
8
|
+
args:
|
|
9
|
+
- --allow-multiple-documents
|
|
10
|
+
- id: debug-statements
|
|
11
|
+
- id: end-of-file-fixer
|
|
12
|
+
- id: trailing-whitespace
|
|
13
|
+
|
|
14
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
15
|
+
rev: v0.15.12
|
|
16
|
+
hooks:
|
|
17
|
+
- id: ruff
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.14
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
## Repository model (research vs canonical)
|
|
4
|
+
|
|
5
|
+
This tree is usually a **personal-account research repo** (`origin` → your GitHub user): local experimentation, WIP, and broad refactors are acceptable.
|
|
6
|
+
|
|
7
|
+
**Organization repos** — canonical product: **[github.com/flightdeckdev/flightdeck](https://github.com/flightdeckdev/flightdeck)** under [flightdeckdev](https://github.com/flightdeckdev). Only **relevant**, standards-meeting changes (tests, ruff, no secrets, changelog/version when releasing) should be pushed or PR’d there—typically via a second remote **`org`** (workflow: [git remotes](https://github.com/flightdeckdev/flightdeck/blob/main/docs/git-remotes.md)).
|
|
8
|
+
|
|
9
|
+
When implementing features, prefer **small, PR-shaped slices** that could ship to an org repo without extra cleanup. Do not conflate “saved in research” with “ready for org push.”
|
|
10
|
+
|
|
11
|
+
Extended maintainer docs (research workflow, org checklist, canonical publish) live on **`main`** in that repository (for example [research workflow](https://github.com/flightdeckdev/flightdeck/blob/main/docs/research-workflow.md), [GitHub organization](https://github.com/flightdeckdev/flightdeck/blob/main/docs/github-organization.md)). This clone may omit those paths to stay small. Claude Code / short entrypoint: **`CLAUDE.md`**.
|
|
12
|
+
|
|
13
|
+
## Mission
|
|
14
|
+
|
|
15
|
+
FlightDeck is AI Release Governance for production agents. The core product promise is
|
|
16
|
+
trustworthy release safety: version releases, ingest runtime evidence, compare diffs, and gate
|
|
17
|
+
promotion with policy.
|
|
18
|
+
|
|
19
|
+
## Current Wedge
|
|
20
|
+
|
|
21
|
+
Economic and operational safety for AI releases.
|
|
22
|
+
|
|
23
|
+
## Non-goals
|
|
24
|
+
|
|
25
|
+
Do not add:
|
|
26
|
+
|
|
27
|
+
- prompt IDEs
|
|
28
|
+
- agent frameworks
|
|
29
|
+
- dashboards before CLI workflow is proven
|
|
30
|
+
- gateways/proxies by default
|
|
31
|
+
- compliance scanners
|
|
32
|
+
- fine-tuning ops
|
|
33
|
+
- broad plugin systems
|
|
34
|
+
|
|
35
|
+
## Public contracts
|
|
36
|
+
|
|
37
|
+
Treat these as **stable API** unless a change explicitly marks an experimental path:
|
|
38
|
+
|
|
39
|
+
- **CLI:** synopsis, flags, exit codes — canonical reference: **[docs/cli.md](https://github.com/flightdeckdev/flightdeck/blob/main/docs/cli.md)** (normative for scripting).
|
|
40
|
+
- **On-disk / wire:** `release.yaml`, run events, pricing imports, policy shape — **`schemas/`** (generated; drift caught in CI), **[docs/spec.md](https://github.com/flightdeckdev/flightdeck/blob/main/docs/spec.md)** (0.x snapshot of what the code does today).
|
|
41
|
+
- **v1 / GA direction** (migrations, checksums, trust boundaries, defaults): **[docs/spec-v1-forward.md](https://github.com/flightdeckdev/flightdeck/blob/main/docs/spec-v1-forward.md)**. Prefer updating the forward spec for new v1 contracts; avoid expanding **`docs/spec.md`** as the rolling GA target.
|
|
42
|
+
- **Backlog and review status:** **[docs/v1-next-steps.md](https://github.com/flightdeckdev/flightdeck/blob/main/docs/v1-next-steps.md)**.
|
|
43
|
+
|
|
44
|
+
## Engineering rules
|
|
45
|
+
|
|
46
|
+
- Keep changes small and behavior-focused.
|
|
47
|
+
- Preserve the local-first CLI workflow.
|
|
48
|
+
- Treat schemas and CLI behavior as public contracts.
|
|
49
|
+
- Add tests for every behavior change.
|
|
50
|
+
- Prefer boring, explicit code over clever abstractions.
|
|
51
|
+
- Do not introduce empty enterprise scaffolding.
|
|
52
|
+
- Do not move modules into packages/apps until there is a real release boundary.
|
|
53
|
+
|
|
54
|
+
## Before large or multi-file changes
|
|
55
|
+
|
|
56
|
+
Do a short review pass for:
|
|
57
|
+
|
|
58
|
+
- **Contract drift** (CLI, JSON/YAML, SQLite columns consumers rely on).
|
|
59
|
+
- **Trust boundaries** (diff, pricing, policy, promotion, serve host binding).
|
|
60
|
+
- **Cross-platform ergonomics** (Windows paths, line endings on fixtures, temp dirs).
|
|
61
|
+
|
|
62
|
+
## Verification
|
|
63
|
+
|
|
64
|
+
Recommended (**[uv](https://docs.astral.sh/uv/)** — see **`DEVELOPMENT.md`**):
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
uv sync --frozen --extra dev
|
|
68
|
+
uv run python -m ruff check src tests
|
|
69
|
+
uv run python -m pytest
|
|
70
|
+
uv run python scripts/quickstart_smoke.py
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
After editing Pydantic models, regenerate schemas and ensure a clean diff:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
uv run python scripts/generate_schemas.py
|
|
77
|
+
git diff --exit-code schemas/
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Fallback (activated **venv** or global tools): the same steps with **`python -m …`** / **`python scripts/…`** as in **`DEVELOPMENT.md`**.
|
|
81
|
+
|
|
82
|
+
On **Windows**, use `py -3` in place of `python` if that is how your environment is set up. If pytest temp dirs fail with permissions, see **`DEVELOPMENT.md`** / **`tests/conftest.py`**.
|
|
83
|
+
|
|
84
|
+
**CI bar** (mirrors **`.github/workflows/ci.yml`** on **CPython 3.14**): **`uv sync --frozen --extra dev`**, **`uv run python -m ruff check src tests`**, **`uv run python -m pytest`**, **`uv run python scripts/generate_schemas.py`** + no **`schemas/`** diff, **`uv run python scripts/quickstart_smoke.py`**, **`uv run flightdeck --help`**.
|
|
85
|
+
|
|
86
|
+
Use a repo-local temp directory if the OS temp directory is restricted.
|
|
87
|
+
|
|
88
|
+
## Product doctrine
|
|
89
|
+
|
|
90
|
+
A feature must strengthen at least one:
|
|
91
|
+
|
|
92
|
+
- release artifact integrity
|
|
93
|
+
- runtime evidence
|
|
94
|
+
- safety ledger accuracy
|
|
95
|
+
- policy-gated promotion
|
|
96
|
+
- audit history
|
|
97
|
+
- developer onboarding
|
|
98
|
+
|
|
99
|
+
If it does not, it waits.
|
|
100
|
+
|
|
101
|
+
## Docs rules
|
|
102
|
+
|
|
103
|
+
Public docs explain implemented behavior and near-term roadmap. Internal product strategy, legal
|
|
104
|
+
notes, and fundraising/customer discovery material do not belong in this repo.
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to FlightDeck will be documented in this file.
|
|
4
|
+
|
|
5
|
+
This project follows [Semantic Versioning](https://semver.org/). From **v1.0.0**, documented CLI behavior (**[docs/cli.md](https://github.com/flightdeckdev/flightdeck/blob/main/docs/cli.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.
|
|
6
|
+
|
|
7
|
+
## Unreleased
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **`uv.lock`** and **[uv](https://docs.astral.sh/uv/)**-based workflow: **`uv sync --extra dev`** / **`uv sync --frozen --extra dev`** for reproducible installs; **`uv run …`** for commands (see **`DEVELOPMENT.md`**).
|
|
12
|
+
- **CI:** **`astral-sh/setup-uv`** with **`uv sync --frozen --extra dev`** and **`uv run python -m …`** (avoids **`uv run pytest`** path quirks with **`from tests.…`** imports).
|
|
13
|
+
- **`.github/workflows/release-pypi.yml`:** on push of **`vMAJOR.MINOR.PATCH`**, verify tag matches **`pyproject.toml`** and **`src/flightdeck/__init__.py`**, run **ruff** / **pytest** / schema drift, **`uv build`**, publish to **PyPI** via **OIDC** trusted publishing (**publish attestations**), and create a **GitHub Release** with **`dist/*`** assets (**`softprops/action-gh-release`**).
|
|
14
|
+
- **`tests/test_version_consistency.py`:** assert **`pyproject.toml`** **`version`** matches **`flightdeck.__version__`** (same invariant as the release workflow).
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- **`diff_releases` zero policy sample thresholds:** `Policy.min_candidate_runs`, `Policy.min_baseline_runs`, and `Policy.min_low_runs` set to **`0`** now correctly override workspace config defaults to `0` instead of being silently ignored. Previously, `or`-based fallback treated `0` as falsy and fell back to the config value (typically `500` / `50`). Fixed by using explicit `is not None` checks. A policy can now unconditionally accept any sample size by setting thresholds to `0` — for example, to allow diffs over empty event windows without a confidence downgrade.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **`tests/conftest.py`:** create repo **`.tmp/`** at import time so **`pytest --basetemp=.tmp/pytest`** works on fresh checkouts and **Linux** CI (parent dir is no longer Windows-only).
|
|
23
|
+
- **`pyproject.toml` `[project] name`:** **`flightdeck-ai`** to match the **PyPI** trusted-publisher project; install with **`pip install flightdeck-ai`** / **`uv add flightdeck-ai`** (CLI remains **`flightdeck`**, imports **`flightdeck.*`**).
|
|
24
|
+
- **Contributor docs** (**`README.md`**, **`DEVELOPMENT.md`**, **`CONTRIBUTING.md`**, **`AGENTS.md`**, **`CLAUDE.md`**, **`.cursorrules`**): prefer **uv**; keep **pip** / **`python -m venv`** as fallback.
|
|
25
|
+
- **Python:** **`requires-python >=3.14,<3.15`**, **`.python-version`**, PyPI classifiers, **Ruff** `target-version`, **`uv.lock`**, and **CI** matrices now target **CPython 3.14** only (replacing broader **3.11–3.14** testing).
|
|
26
|
+
|
|
27
|
+
## 1.0.1 - 2026-05-01
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- **`.gitattributes`:** force **LF** for **`tests/fixtures/golden_bundle/`** so checkout line endings do not change the pinned bundle digest (matches the **0.7.0** changelog intent).
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- **Slim distribution:** this repository omits the full in-tree **`docs/`** tree, org mirror scripts, and **`verify-repo-standards`** wrappers. Narrative docs and maintainer runbooks live on **[github.com/flightdeckdev/flightdeck](https://github.com/flightdeckdev/flightdeck)**; in-repo links now point there where applicable.
|
|
36
|
+
- **`pyproject.toml`:** OpenTelemetry packages are **optional** only (**`telemetry`** / **`all`** extras); the default install matches the **1.0.0** dependency story (core does not import OpenTelemetry).
|
|
37
|
+
- **`.pre-commit-config.yaml`:** **ruff** replaces **black** / **isort**; **`ruff-pre-commit`** pinned to **v0.15.12** to match **`dev`** (**`ruff==0.15.12`**).
|
|
38
|
+
- **CI:** Python **3.13** and **3.14** added to the Ubuntu and Windows matrices (superseded by **3.14**-only policy; see **Unreleased**).
|
|
39
|
+
- **`pyproject.toml`:** default **`pytest --basetemp=.tmp/pytest`** so local runs avoid Windows **`PermissionError`** on **`%TEMP%\pytest-of-*`**.
|
|
40
|
+
- **`pre-commit-hooks`:** bumped to **v5.0.0**.
|
|
41
|
+
|
|
42
|
+
### Removed
|
|
43
|
+
|
|
44
|
+
- **`tests/test_sync_export_public.py`** (depended on export tooling not shipped in this tree).
|
|
45
|
+
|
|
46
|
+
## 1.0.0 - 2026-04-30
|
|
47
|
+
|
|
48
|
+
### Added
|
|
49
|
+
|
|
50
|
+
- **v1.0.0 GA freeze** narrative: **`RELEASE_NOTES.md`**, **`docs/spec-v1-forward.md`**, **`docs/v1-next-steps.md`** (archived internal planning under **`docs/reviews/`** remains **development-clone only**).
|
|
51
|
+
|
|
52
|
+
### Changed
|
|
53
|
+
|
|
54
|
+
- **v1.0.0 GA freeze:** stable contracts for the local-first spine summarized in **[RELEASE_NOTES.md](RELEASE_NOTES.md)** (trust boundaries, SQLite migrations, payload versioning).
|
|
55
|
+
- **`pyproject.toml`**: **Development Status :: 5 - Production/Stable** on PyPI classifiers.
|
|
56
|
+
- **Dependencies:** **`opentelemetry-api`**, **`opentelemetry-sdk`**, and **`opentelemetry-exporter-otlp`** removed from default installs; added optional **`telemetry`** extra (included in **`all`**) for forward OTLP work — core code did not import OpenTelemetry.
|
|
57
|
+
|
|
58
|
+
## 0.9.0 - 2026-04-30
|
|
59
|
+
|
|
60
|
+
### Added
|
|
61
|
+
|
|
62
|
+
- **[RELEASE_NOTES.md](RELEASE_NOTES.md)**: maintainer-facing trust boundaries, SQLite upgrades, pre-1.0 vs **v1.0.0** freeze intent, payload **`api_version`** behavior.
|
|
63
|
+
- **`tests/fixtures/json/`**: minimal golden JSON for **`RunEvent`**, **`ReleaseArtifact`**, **`PricingTable`**, **`Policy`**; **`tests/test_schemas.py`** validates each fixture against Pydantic models.
|
|
64
|
+
- **HTTP ingest tests:** **`POST /v1/events`** rejects empty **`api_version`**, wrong casing (**`V1`**), JSON **`null`**; accepts omitted **`api_version`** (defaults to **`v1`**); stable **`detail`** string for **`v2`** rejections.
|
|
65
|
+
- **[CLAUDE.md](CLAUDE.md)**: short agent entry (must-read table, verify commands, Windows note).
|
|
66
|
+
- **0.9 → 1.0** sequencing captured in **`docs/v1-next-steps.md`** (detailed milestone plans archived under **`docs/reviews/`** in maintainer clones only).
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- **[AGENTS.md](AGENTS.md)**: public contracts section, large-change review checklist, expanded verification (including **`quickstart_smoke.py`**), PR-shaped slice guidance, pointers to **`CLAUDE.md`** and forward spec.
|
|
71
|
+
- **[.cursorrules](.cursorrules)**: slimmed to defer to **`AGENTS.md`** / **`CLAUDE.md`** and the same verify bar.
|
|
72
|
+
- **[VERSIONING.md](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`**.
|
|
73
|
+
|
|
74
|
+
## 0.8.0 - 2026-04-30
|
|
75
|
+
|
|
76
|
+
### Added
|
|
77
|
+
|
|
78
|
+
- **[docs/cli.md](docs/cli.md)**: CLI reference (synopsis, flags, exit codes, pointers to quickstart examples).
|
|
79
|
+
- **`scripts/quickstart_smoke.py`**: cross-platform quickstart smoke (**no bash**): temp workspace, Python placeholder substitution, **`release verify`**, **`doctor`**.
|
|
80
|
+
- **CI:** run quickstart smoke on **Ubuntu** and **Windows** matrix jobs (alongside pytest and schema drift).
|
|
81
|
+
- **Tests:** `tests/test_quickstart_smoke.py` exercises the smoke script.
|
|
82
|
+
- **0.8 milestone planning** (CLI + CI): archived under **`docs/reviews/`** in development clones; shipped artifacts are **`docs/cli.md`** and **`scripts/quickstart_smoke.py`** above.
|
|
83
|
+
|
|
84
|
+
### Changed
|
|
85
|
+
|
|
86
|
+
- **[docs/quickstart.md](docs/quickstart.md)**: recommend **`python scripts/quickstart_smoke.py`** on Windows; bash flow kept as optional.
|
|
87
|
+
- **[docs/architecture.md](docs/architecture.md)**: deferred section updated for shipped SDK / rollback / serve / doctor / verify.
|
|
88
|
+
- **`scripts/verify-repo-standards.sh`** / **`.ps1`**: run **`quickstart_smoke.py`** after pytest (same bar as CI).
|
|
89
|
+
|
|
90
|
+
## 0.7.0 - 2026-04-30
|
|
91
|
+
|
|
92
|
+
### Added
|
|
93
|
+
|
|
94
|
+
- **`flightdeck release verify <release_id> --path …`**: compares the checksum stored at registration with **`bundle_checksum`** on a supplied directory or `release.yaml` file; **exit code 2** on mismatch (**1** for normal CLI errors).
|
|
95
|
+
- **Committed golden bundle** `tests/fixtures/golden_bundle/` with a **pinned SHA-256** asserted in CI (Linux + Windows).
|
|
96
|
+
- **`.gitattributes`**: force **LF** for the golden fixture path so line-ending normalization on checkout does not change the digest.
|
|
97
|
+
- **0.7 milestone planning** (golden bundle / verify): archived under **`docs/reviews/`** in development clones; see **`tests/fixtures/golden_bundle/`** and **`flightdeck release verify`** above.
|
|
98
|
+
|
|
99
|
+
### Changed
|
|
100
|
+
|
|
101
|
+
- **`flightdeck.bundle`**: skip **symlink** files when hashing bundles (determinism + safety); POSIX test in **`tests/test_bundle_golden_fixture.py`** (skipped on Windows where symlink creation is often unavailable).
|
|
102
|
+
- **CI:** run **`python scripts/generate_schemas.py`** then **`git diff --exit-code schemas/`** on Ubuntu and Windows to catch hand-edited schema drift.
|
|
103
|
+
|
|
104
|
+
## 0.6.0 - 2026-04-30
|
|
105
|
+
|
|
106
|
+
### Added
|
|
107
|
+
|
|
108
|
+
- **Apache License, Version 2.0:** root **`LICENSE`** (from [apache.org](https://www.apache.org/licenses/LICENSE-2.0.txt)), **`NOTICE`**, and **`pyproject.toml`** `license = "Apache-2.0"` aligned with the canonical org repo [flightdeckdev/flightdeck](https://github.com/flightdeckdev/flightdeck).
|
|
109
|
+
- **SQLite migration 3:** `release_actions.audit_seq` (backfilled in `created_at` order), **`UNIQUE`** index **`idx_release_actions_audit_seq`**, and automatic assignment on insert via **`Storage._next_audit_seq`**.
|
|
110
|
+
- **`PromotionRecord.audit_seq`**: optional on write; populated when listing actions from storage.
|
|
111
|
+
- **`Storage.check_release_actions_audit_seq()`** and **`flightdeck doctor`** extension: verifies **contiguous** non-null **`audit_seq`** values `1..max` (gap / tamper hint per forward spec).
|
|
112
|
+
|
|
113
|
+
### Changed
|
|
114
|
+
|
|
115
|
+
- **README** / **[docs/github-organization.md](docs/github-organization.md)** / **[docs/git-remotes.md](docs/git-remotes.md):** point at **`https://github.com/flightdeckdev/flightdeck`**.
|
|
116
|
+
|
|
117
|
+
## 0.5.1 - 2026-04-30
|
|
118
|
+
|
|
119
|
+
### Added
|
|
120
|
+
|
|
121
|
+
- **`flightdeck doctor`**: read-only checks for **SQLite schema migrations** (through `LATEST_SCHEMA_MIGRATION_VERSION`) and **promoted release pointers** (each `promoted_releases.release_id` exists in `releases`).
|
|
122
|
+
- **`flightdeck.storage`**: `list_applied_migrations()`, `list_promoted_pointers()`, and **`LATEST_SCHEMA_MIGRATION_VERSION`** (keep in sync when adding migrations).
|
|
123
|
+
|
|
124
|
+
## 0.5.0 - 2026-04-30
|
|
125
|
+
|
|
126
|
+
### Added
|
|
127
|
+
|
|
128
|
+
- **[docs/v1-next-steps.md](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.
|
|
129
|
+
- **`flightdeck serve`**: warns when `--host` is not loopback (trust boundary; see forward spec §4).
|
|
130
|
+
- **`POST /v1/events`**: rejects unsupported `api_version` before Pydantic with a clear 400 detail.
|
|
131
|
+
- **Ledger tests** (`tests/test_ledger.py`): `diff_releases` rejects cross-agent and mixed-agent run batches.
|
|
132
|
+
|
|
133
|
+
### Changed
|
|
134
|
+
|
|
135
|
+
- **Implicit default policy** (no `flightdeck policy set`): `require_high_diff_confidence` now defaults to **`true`**, matching the `Policy` model and **v1 GA** direction. Quickstart and tests keep explicit **`require_high_diff_confidence: false`** where low-sample demos need it.
|
|
136
|
+
- **`diff_releases`**: enforces a single shared `agent_id` across baseline and candidate run events when both sides are non-empty (defense in depth vs CLI-only checks).
|
|
137
|
+
- **`Storage.insert_release`**: uses **`transaction()`** for the same atomic discipline as promotion paths.
|
|
138
|
+
- **CLI** `release diff`, `release promote`, and `release rollback`: surface `ValueError` from `diff_releases` as `ClickException`.
|
|
139
|
+
|
|
140
|
+
## 0.4.2 - 2026-04-30
|
|
141
|
+
|
|
142
|
+
### Added
|
|
143
|
+
|
|
144
|
+
- **[docs/git-remotes.md](docs/git-remotes.md)**: configure **`origin`** (personal research) vs **`org`** ([flightdeckdev](https://github.com/flightdeckdev) canonical), with everyday `git push` examples.
|
|
145
|
+
|
|
146
|
+
### Changed
|
|
147
|
+
|
|
148
|
+
- **Research workflow docs** ([docs/research-workflow.md](docs/research-workflow.md), [RESEARCH.md](RESEARCH.md), [AGENTS.md](AGENTS.md), [.cursorrules](.cursorrules), [docs/github-organization.md](docs/github-organization.md)) now state explicitly: **personal account** = research clone; **org** = user-facing canonical.
|
|
149
|
+
|
|
150
|
+
## 0.4.1 - 2026-04-30
|
|
151
|
+
|
|
152
|
+
### Added
|
|
153
|
+
|
|
154
|
+
- **[docs/github-organization.md](docs/github-organization.md)** for the **[flightdeckdev](https://github.com/flightdeckdev)** org: when to add repos, pre-push checklist, private-file policy.
|
|
155
|
+
- **`scripts/verify-repo-standards.sh`** / **`.ps1`**: run ruff + pytest before pushing.
|
|
156
|
+
|
|
157
|
+
### Changed
|
|
158
|
+
|
|
159
|
+
- **`.gitignore`**: ignore **`.flightdeck/`** (local DB/config), **`private/`**, **`secrets/`**, common cert/credential patterns, **`Thumbs.db`**.
|
|
160
|
+
- **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.
|
|
161
|
+
- **SQLite migration 2**: index on `run_events(release_id, timestamp)` for ledger queries.
|
|
162
|
+
|
|
163
|
+
### Security / hygiene
|
|
164
|
+
|
|
165
|
+
- **[SECURITY.md](SECURITY.md)** and **[CONTRIBUTING.md](CONTRIBUTING.md)** expanded with secret/local-path guidance and link to the org push gate doc.
|
|
166
|
+
|
|
167
|
+
## 0.4.0 - 2026-04-30
|
|
168
|
+
|
|
169
|
+
### Added
|
|
170
|
+
|
|
171
|
+
- **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.md` remains the frozen 0.x implementation narrative; new guarantees land here first.
|
|
172
|
+
- **SDK unit test** using `httpx.MockTransport` so the Python client is covered without relying on sync ASGI transport quirks.
|
|
173
|
+
|
|
174
|
+
### Changed
|
|
175
|
+
|
|
176
|
+
- README status and documentation index now point at the forward v1 spec and reflect shipped local HTTP + minimal SDK.
|
|
177
|
+
|
|
178
|
+
## 0.3.0 - 2026-04-30
|
|
179
|
+
|
|
180
|
+
### Added
|
|
181
|
+
|
|
182
|
+
- Local HTTP ingestion service: `flightdeck serve` with `POST /v1/events`.
|
|
183
|
+
- Minimal HTTP client helper: `flightdeck.sdk.client.FlightdeckClient`.
|
|
184
|
+
- `flightdeck release rollback` with the same policy gate + audit trail as `promote`.
|
|
185
|
+
- Append-only pricing import audit log (`pricing_import_audit`) and required `--reason` for `pricing import --replace`.
|
|
186
|
+
- Public JSON Schemas under `schemas/v1/` plus `scripts/generate_schemas.py`.
|
|
187
|
+
- Policy can require HIGH diff confidence (`require_high_diff_confidence`, default `true` on explicit policies).
|
|
188
|
+
|
|
189
|
+
### Fixed
|
|
190
|
+
|
|
191
|
+
- Atomic promotion: audit record + promoted pointer update now share a single DB transaction.
|
|
192
|
+
- SQLite connections enable WAL + busy timeout to reduce Windows locking issues.
|
|
193
|
+
- Safer `--window` parsing errors are surfaced as `ClickException` (no tracebacks).
|
|
194
|
+
|
|
195
|
+
## 0.2.0 - 2026-04-30
|
|
196
|
+
|
|
197
|
+
### Added
|
|
198
|
+
|
|
199
|
+
- Local release registry (`flightdeck release register`, `flightdeck release list`, `flightdeck release show`).
|
|
200
|
+
- Run event ingestion (`flightdeck runs ingest`).
|
|
201
|
+
- Trusted `flightdeck release diff` with confidence labels, explicit `--window`, and ASCII `delta` output.
|
|
202
|
+
- Per-release pricing for diffs (baseline and candidate are costed against their own `pricing_reference`).
|
|
203
|
+
- Cross-agent diff rejection by default.
|
|
204
|
+
- Immutable pricing table import with explicit `--replace` and `flightdeck pricing show`.
|
|
205
|
+
- Active policy object (`flightdeck policy set`, `flightdeck policy show`) used for diff evaluation and promotion.
|
|
206
|
+
- Policy-gated `flightdeck release promote` with required `--reason` and `flightdeck release history`.
|
|
207
|
+
|
|
208
|
+
### Notes
|
|
209
|
+
|
|
210
|
+
- Cost estimates are **model token costs** only; tool spend pricing is not implemented yet.
|
|
211
|
+
|
|
212
|
+
### Fixed
|
|
213
|
+
|
|
214
|
+
- Windows: avoid pytest temp-dir permission issues by redirecting `TEMP`/`TMP` into a repo-local `.tmp/`
|
|
215
|
+
directory during pytest (see `tests/conftest.py`), with an opt-out via `FLIGHTDECK_USE_SYSTEM_TEMP=1`.
|