orkestra-runtime 0.1.2__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.
- orkestra_runtime-0.1.2/.github/workflows/ci.yml +98 -0
- orkestra_runtime-0.1.2/.github/workflows/publish-to-pypi.yml +54 -0
- orkestra_runtime-0.1.2/.gitignore +41 -0
- orkestra_runtime-0.1.2/.gitleaks.toml +17 -0
- orkestra_runtime-0.1.2/BUILD_STATUS.md +46 -0
- orkestra_runtime-0.1.2/CHANGELOG.md +71 -0
- orkestra_runtime-0.1.2/CODE_OF_CONDUCT.md +44 -0
- orkestra_runtime-0.1.2/CONTRIBUTING.md +65 -0
- orkestra_runtime-0.1.2/FINAL_BUILD_REPORT.md +248 -0
- orkestra_runtime-0.1.2/LICENSE +202 -0
- orkestra_runtime-0.1.2/MASTERPROMPT.md +1268 -0
- orkestra_runtime-0.1.2/NOTICE +10 -0
- orkestra_runtime-0.1.2/PKG-INFO +290 -0
- orkestra_runtime-0.1.2/README.md +259 -0
- orkestra_runtime-0.1.2/ROADMAP.md +33 -0
- orkestra_runtime-0.1.2/SECURITY.md +28 -0
- orkestra_runtime-0.1.2/docs/CLI.md +101 -0
- orkestra_runtime-0.1.2/docs/CONCEPTS.md +73 -0
- orkestra_runtime-0.1.2/docs/CONFIGURATION.md +124 -0
- orkestra_runtime-0.1.2/docs/FAQ.md +62 -0
- orkestra_runtime-0.1.2/docs/INSTALL.md +66 -0
- orkestra_runtime-0.1.2/docs/PROVIDERS.md +71 -0
- orkestra_runtime-0.1.2/docs/QUICKSTART.md +93 -0
- orkestra_runtime-0.1.2/docs/SECURITY_MODEL.md +66 -0
- orkestra_runtime-0.1.2/docs/TROUBLESHOOTING.md +77 -0
- orkestra_runtime-0.1.2/docs/adapters/AUTHORING.md +57 -0
- orkestra_runtime-0.1.2/docs/adapters/PROTOCOL.md +109 -0
- orkestra_runtime-0.1.2/docs/architecture/ARCHITECTURE.md +230 -0
- orkestra_runtime-0.1.2/docs/architecture/adr/ADR-0001-language-python.md +40 -0
- orkestra_runtime-0.1.2/docs/architecture/adr/ADR-0002-custom-kernel-no-framework.md +37 -0
- orkestra_runtime-0.1.2/docs/architecture/adr/ADR-0003-persistence-sqlite-plain-sql.md +37 -0
- orkestra_runtime-0.1.2/docs/architecture/adr/ADR-0004-agent-integration-cli-subprocess.md +49 -0
- orkestra_runtime-0.1.2/docs/architecture/adr/ADR-0005-git-worktree-isolation.md +35 -0
- orkestra_runtime-0.1.2/docs/architecture/adr/ADR-0006-no-dynamic-plugins-v01.md +29 -0
- orkestra_runtime-0.1.2/docs/architecture/adr/ADR-0007-license-apache-2.md +35 -0
- orkestra_runtime-0.1.2/docs/architecture/adr/ADR-0008-director-pluggable-claude-default.md +33 -0
- orkestra_runtime-0.1.2/docs/development/ENVIRONMENT_CHANGES.md +11 -0
- orkestra_runtime-0.1.2/docs/development/SELF_REVIEW.md +104 -0
- orkestra_runtime-0.1.2/docs/development/evidence/DOGFOOD_RUN_REPORT.md +53 -0
- orkestra_runtime-0.1.2/docs/development/evidence/LIVE_SMOKE_REPORT.md +53 -0
- orkestra_runtime-0.1.2/docs/research/AGENT_INTEGRATION_RESEARCH.md +145 -0
- orkestra_runtime-0.1.2/docs/research/ANTIGRAVITY_CLI_RESEARCH.md +112 -0
- orkestra_runtime-0.1.2/docs/research/COMPETITIVE_ANALYSIS.md +82 -0
- orkestra_runtime-0.1.2/docs/research/ENVIRONMENT_INVENTORY.md +72 -0
- orkestra_runtime-0.1.2/docs/research/LICENSING_AND_NAMING_REVIEW.md +84 -0
- orkestra_runtime-0.1.2/docs/research/RESEARCH_METHOD.md +48 -0
- orkestra_runtime-0.1.2/docs/research/TECH_STACK_DECISION.md +151 -0
- orkestra_runtime-0.1.2/docs/research/TERMS_AND_AUTHENTICATION_REVIEW.md +115 -0
- orkestra_runtime-0.1.2/docs/research/samples/antigravity-print-json.json +14 -0
- orkestra_runtime-0.1.2/docs/research/samples/antigravity-stream-jsonl.jsonl +6 -0
- orkestra_runtime-0.1.2/docs/research/samples/claude-code-print-json.json +22 -0
- orkestra_runtime-0.1.2/docs/research/samples/codex-exec-jsonl.jsonl +5 -0
- orkestra_runtime-0.1.2/docs/research/samples/gemini-auth-error.json +9 -0
- orkestra_runtime-0.1.2/docs/security/THREAT_MODEL.md +177 -0
- orkestra_runtime-0.1.2/examples/many-agents/config.toml +35 -0
- orkestra_runtime-0.1.2/examples/three-agents/config.toml +28 -0
- orkestra_runtime-0.1.2/examples/two-agents/config.toml +14 -0
- orkestra_runtime-0.1.2/pyproject.toml +124 -0
- orkestra_runtime-0.1.2/src/orkestra/__init__.py +1 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/__init__.py +12 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/antigravity_cli.py +231 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/base.py +85 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/claude_code.py +211 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/codex_cli.py +219 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/external.py +160 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/fake.py +30 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/fake_worker.py +195 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/gemini_cli.py +232 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/jsonl.py +68 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/registry.py +42 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/runner.py +216 -0
- orkestra_runtime-0.1.2/src/orkestra/adapters/testkit.py +148 -0
- orkestra_runtime-0.1.2/src/orkestra/app.py +87 -0
- orkestra_runtime-0.1.2/src/orkestra/capabilities/__init__.py +6 -0
- orkestra_runtime-0.1.2/src/orkestra/capabilities/ledger.py +48 -0
- orkestra_runtime-0.1.2/src/orkestra/capabilities/matrix.py +87 -0
- orkestra_runtime-0.1.2/src/orkestra/capabilities/probes.py +164 -0
- orkestra_runtime-0.1.2/src/orkestra/cli/__init__.py +1 -0
- orkestra_runtime-0.1.2/src/orkestra/cli/main.py +685 -0
- orkestra_runtime-0.1.2/src/orkestra/cli/template.py +109 -0
- orkestra_runtime-0.1.2/src/orkestra/director/__init__.py +5 -0
- orkestra_runtime-0.1.2/src/orkestra/director/heuristic.py +112 -0
- orkestra_runtime-0.1.2/src/orkestra/director/prompts.py +147 -0
- orkestra_runtime-0.1.2/src/orkestra/director/service.py +253 -0
- orkestra_runtime-0.1.2/src/orkestra/errors.py +43 -0
- orkestra_runtime-0.1.2/src/orkestra/ids.py +57 -0
- orkestra_runtime-0.1.2/src/orkestra/kernel/__init__.py +1 -0
- orkestra_runtime-0.1.2/src/orkestra/kernel/dag.py +126 -0
- orkestra_runtime-0.1.2/src/orkestra/kernel/prepare.py +158 -0
- orkestra_runtime-0.1.2/src/orkestra/kernel/retry.py +46 -0
- orkestra_runtime-0.1.2/src/orkestra/kernel/scheduler.py +902 -0
- orkestra_runtime-0.1.2/src/orkestra/kernel/states.py +81 -0
- orkestra_runtime-0.1.2/src/orkestra/policy/__init__.py +5 -0
- orkestra_runtime-0.1.2/src/orkestra/policy/engine.py +117 -0
- orkestra_runtime-0.1.2/src/orkestra/py.typed +0 -0
- orkestra_runtime-0.1.2/src/orkestra/redact.py +139 -0
- orkestra_runtime-0.1.2/src/orkestra/report/__init__.py +5 -0
- orkestra_runtime-0.1.2/src/orkestra/report/final.py +144 -0
- orkestra_runtime-0.1.2/src/orkestra/schemas/__init__.py +84 -0
- orkestra_runtime-0.1.2/src/orkestra/schemas/agent.py +112 -0
- orkestra_runtime-0.1.2/src/orkestra/schemas/capability.py +62 -0
- orkestra_runtime-0.1.2/src/orkestra/schemas/common.py +65 -0
- orkestra_runtime-0.1.2/src/orkestra/schemas/config.py +145 -0
- orkestra_runtime-0.1.2/src/orkestra/schemas/decision.py +41 -0
- orkestra_runtime-0.1.2/src/orkestra/schemas/director.py +79 -0
- orkestra_runtime-0.1.2/src/orkestra/schemas/task.py +48 -0
- orkestra_runtime-0.1.2/src/orkestra/store/__init__.py +6 -0
- orkestra_runtime-0.1.2/src/orkestra/store/db.py +92 -0
- orkestra_runtime-0.1.2/src/orkestra/store/migrations.py +126 -0
- orkestra_runtime-0.1.2/src/orkestra/store/repo.py +532 -0
- orkestra_runtime-0.1.2/src/orkestra/verify/__init__.py +5 -0
- orkestra_runtime-0.1.2/src/orkestra/verify/runner.py +130 -0
- orkestra_runtime-0.1.2/src/orkestra/workspace/__init__.py +6 -0
- orkestra_runtime-0.1.2/src/orkestra/workspace/git.py +193 -0
- orkestra_runtime-0.1.2/src/orkestra/workspace/worktrees.py +155 -0
- orkestra_runtime-0.1.2/tests/__init__.py +0 -0
- orkestra_runtime-0.1.2/tests/adapters/__init__.py +0 -0
- orkestra_runtime-0.1.2/tests/adapters/test_contract.py +37 -0
- orkestra_runtime-0.1.2/tests/adapters/test_parsers.py +343 -0
- orkestra_runtime-0.1.2/tests/cli/__init__.py +0 -0
- orkestra_runtime-0.1.2/tests/cli/test_cli.py +206 -0
- orkestra_runtime-0.1.2/tests/e2e/__init__.py +0 -0
- orkestra_runtime-0.1.2/tests/e2e/conftest.py +70 -0
- orkestra_runtime-0.1.2/tests/e2e/test_orchestration.py +327 -0
- orkestra_runtime-0.1.2/tests/unit/__init__.py +0 -0
- orkestra_runtime-0.1.2/tests/unit/test_app.py +47 -0
- orkestra_runtime-0.1.2/tests/unit/test_capabilities.py +121 -0
- orkestra_runtime-0.1.2/tests/unit/test_config.py +113 -0
- orkestra_runtime-0.1.2/tests/unit/test_dag.py +101 -0
- orkestra_runtime-0.1.2/tests/unit/test_director.py +111 -0
- orkestra_runtime-0.1.2/tests/unit/test_fake_worker.py +183 -0
- orkestra_runtime-0.1.2/tests/unit/test_ids_and_redact.py +87 -0
- orkestra_runtime-0.1.2/tests/unit/test_policy.py +87 -0
- orkestra_runtime-0.1.2/tests/unit/test_probe_runner.py +97 -0
- orkestra_runtime-0.1.2/tests/unit/test_redact_v2.py +124 -0
- orkestra_runtime-0.1.2/tests/unit/test_report.py +86 -0
- orkestra_runtime-0.1.2/tests/unit/test_states_and_retry.py +73 -0
- orkestra_runtime-0.1.2/tests/unit/test_store.py +196 -0
- orkestra_runtime-0.1.2/tests/workspace/__init__.py +0 -0
- orkestra_runtime-0.1.2/tests/workspace/test_worktrees.py +168 -0
- orkestra_runtime-0.1.2/uv.lock +1036 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
tags: ["v*"]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [main]
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
quality:
|
|
15
|
+
name: Lint, types, security
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
- uses: astral-sh/setup-uv@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.12"
|
|
22
|
+
- name: Sync dependencies
|
|
23
|
+
run: uv sync --locked
|
|
24
|
+
- name: Ruff format check
|
|
25
|
+
run: uv run ruff format --check .
|
|
26
|
+
- name: Ruff lint
|
|
27
|
+
run: uv run ruff check .
|
|
28
|
+
- name: Mypy (strict)
|
|
29
|
+
run: uv run mypy
|
|
30
|
+
- name: Bandit
|
|
31
|
+
run: uv run bandit -c pyproject.toml -r src
|
|
32
|
+
- name: pip-audit
|
|
33
|
+
run: uv run pip-audit --skip-editable
|
|
34
|
+
continue-on-error: false
|
|
35
|
+
|
|
36
|
+
secrets-scan:
|
|
37
|
+
name: Secret scan
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@v4
|
|
41
|
+
with:
|
|
42
|
+
fetch-depth: 0
|
|
43
|
+
# Direct pinned gitleaks over full history (the wrapper action fails on
|
|
44
|
+
# push ranges that include the root commit).
|
|
45
|
+
- name: Run gitleaks (full history)
|
|
46
|
+
run: |
|
|
47
|
+
curl -sSfL -o /tmp/gitleaks.tgz \
|
|
48
|
+
https://github.com/gitleaks/gitleaks/releases/download/v8.24.3/gitleaks_8.24.3_linux_x64.tar.gz
|
|
49
|
+
tar -xzf /tmp/gitleaks.tgz -C /tmp gitleaks
|
|
50
|
+
/tmp/gitleaks detect --source . --redact -v
|
|
51
|
+
|
|
52
|
+
test:
|
|
53
|
+
name: Tests (py${{ matrix.python }} / ${{ matrix.os }})
|
|
54
|
+
runs-on: ${{ matrix.os }}
|
|
55
|
+
strategy:
|
|
56
|
+
fail-fast: false
|
|
57
|
+
matrix:
|
|
58
|
+
os: [ubuntu-latest, macos-latest]
|
|
59
|
+
python: ["3.12", "3.13"]
|
|
60
|
+
steps:
|
|
61
|
+
- uses: actions/checkout@v4
|
|
62
|
+
- uses: astral-sh/setup-uv@v5
|
|
63
|
+
with:
|
|
64
|
+
python-version: ${{ matrix.python }}
|
|
65
|
+
- name: Sync dependencies
|
|
66
|
+
run: uv sync --locked
|
|
67
|
+
- name: Configure git identity (worktree tests)
|
|
68
|
+
run: |
|
|
69
|
+
git config --global user.name "CI"
|
|
70
|
+
git config --global user.email "ci@example.invalid"
|
|
71
|
+
git config --global init.defaultBranch main
|
|
72
|
+
- name: Run tests with coverage
|
|
73
|
+
run: uv run pytest --cov=orkestra --cov-report=xml --cov-report=term
|
|
74
|
+
- name: Enforce coverage floor
|
|
75
|
+
run: uv run coverage report --fail-under=80
|
|
76
|
+
|
|
77
|
+
install-smoke:
|
|
78
|
+
name: Clean install smoke test
|
|
79
|
+
runs-on: ubuntu-latest
|
|
80
|
+
steps:
|
|
81
|
+
- uses: actions/checkout@v4
|
|
82
|
+
- uses: astral-sh/setup-uv@v5
|
|
83
|
+
with:
|
|
84
|
+
python-version: "3.12"
|
|
85
|
+
- name: Build wheel
|
|
86
|
+
run: uv build
|
|
87
|
+
- name: Install wheel into fresh venv and smoke test
|
|
88
|
+
run: |
|
|
89
|
+
uv venv /tmp/smoke
|
|
90
|
+
VIRTUAL_ENV=/tmp/smoke uv pip install dist/*.whl
|
|
91
|
+
/tmp/smoke/bin/orkestra --version
|
|
92
|
+
/tmp/smoke/bin/orkestra --help
|
|
93
|
+
git config --global user.name "CI"
|
|
94
|
+
git config --global user.email "ci@example.invalid"
|
|
95
|
+
git config --global init.defaultBranch main
|
|
96
|
+
mkdir /tmp/smokeproj && cd /tmp/smokeproj
|
|
97
|
+
/tmp/smoke/bin/orkestra init . --non-interactive
|
|
98
|
+
/tmp/smoke/bin/orkestra doctor || true
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
# PyPI Trusted Publishing via GitHub OIDC — no API tokens anywhere.
|
|
4
|
+
# The `publish` job deploys through the protected `pypi` environment
|
|
5
|
+
# (required reviewer: repository owner; tag pattern v*).
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
release:
|
|
9
|
+
types: [published]
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
build:
|
|
17
|
+
name: Build distributions
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
- uses: astral-sh/setup-uv@v5
|
|
22
|
+
with:
|
|
23
|
+
python-version: "3.12"
|
|
24
|
+
- name: Build sdist and wheel
|
|
25
|
+
run: uv build
|
|
26
|
+
- name: Check package metadata
|
|
27
|
+
run: uvx twine check --strict dist/*
|
|
28
|
+
- name: Smoke test the built wheel
|
|
29
|
+
run: |
|
|
30
|
+
uv venv /tmp/pubsmoke
|
|
31
|
+
VIRTUAL_ENV=/tmp/pubsmoke uv pip install dist/*.whl
|
|
32
|
+
/tmp/pubsmoke/bin/orkestra --version
|
|
33
|
+
- uses: actions/upload-artifact@v4
|
|
34
|
+
with:
|
|
35
|
+
name: dist
|
|
36
|
+
path: dist/
|
|
37
|
+
if-no-files-found: error
|
|
38
|
+
|
|
39
|
+
publish:
|
|
40
|
+
name: Publish to PyPI (requires approval)
|
|
41
|
+
needs: build
|
|
42
|
+
runs-on: ubuntu-latest
|
|
43
|
+
environment:
|
|
44
|
+
name: pypi
|
|
45
|
+
url: https://pypi.org/project/orkestra-runtime/
|
|
46
|
+
permissions:
|
|
47
|
+
id-token: write # OIDC token for PyPI Trusted Publishing
|
|
48
|
+
steps:
|
|
49
|
+
- uses: actions/download-artifact@v4
|
|
50
|
+
with:
|
|
51
|
+
name: dist
|
|
52
|
+
path: dist/
|
|
53
|
+
- name: Publish to PyPI
|
|
54
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
|
|
11
|
+
# Tooling caches
|
|
12
|
+
.pytest_cache/
|
|
13
|
+
.mypy_cache/
|
|
14
|
+
.ruff_cache/
|
|
15
|
+
.pyright/
|
|
16
|
+
.coverage
|
|
17
|
+
coverage.xml
|
|
18
|
+
htmlcov/
|
|
19
|
+
|
|
20
|
+
# Orkestra runtime state (never commit local orchestration state)
|
|
21
|
+
.orkestra/
|
|
22
|
+
*.orkestra.db
|
|
23
|
+
*.sqlite3
|
|
24
|
+
|
|
25
|
+
# Worktrees and scratch
|
|
26
|
+
.worktrees/
|
|
27
|
+
.scratch/
|
|
28
|
+
|
|
29
|
+
# OS
|
|
30
|
+
.DS_Store
|
|
31
|
+
|
|
32
|
+
# Editors
|
|
33
|
+
.idea/
|
|
34
|
+
.vscode/
|
|
35
|
+
|
|
36
|
+
# Env / secrets
|
|
37
|
+
.env
|
|
38
|
+
.env.*
|
|
39
|
+
*.pem
|
|
40
|
+
*.key
|
|
41
|
+
.claude/
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Gitleaks configuration for Orkestra.
|
|
2
|
+
# The test suite and redaction module intentionally contain FAKE
|
|
3
|
+
# credential-shaped strings to verify that redaction works; none are
|
|
4
|
+
# real secrets.
|
|
5
|
+
|
|
6
|
+
[extend]
|
|
7
|
+
useDefault = true
|
|
8
|
+
|
|
9
|
+
[allowlist]
|
|
10
|
+
description = "Intentional fake credential shapes used to test redaction"
|
|
11
|
+
paths = [
|
|
12
|
+
'''tests/unit/test_ids_and_redact\.py''',
|
|
13
|
+
'''tests/unit/test_redact_v2\.py''',
|
|
14
|
+
'''tests/unit/test_report\.py''',
|
|
15
|
+
'''tests/unit/test_store\.py''',
|
|
16
|
+
'''src/orkestra/redact\.py''',
|
|
17
|
+
]
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Orkestra Build Status
|
|
2
|
+
|
|
3
|
+
**Status:** COMPLETE
|
|
4
|
+
**Phase:** 10 — Released (v0.1.0)
|
|
5
|
+
**Last updated:** 2026-07-24
|
|
6
|
+
|
|
7
|
+
## Phase checklist
|
|
8
|
+
|
|
9
|
+
- [x] Phase 0 — Bootstrap and environment inventory
|
|
10
|
+
- [x] Phase 1 — Research and architecture decision (docs/research/*, ADRs)
|
|
11
|
+
- [x] Phase 2 — Repository and quality foundation
|
|
12
|
+
- [x] Phase 3 — Core kernel and persistence
|
|
13
|
+
- [x] Phase 4 — Adapter layer (claude-code, codex-cli, antigravity-cli,
|
|
14
|
+
gemini-cli, fake, external + contract kit)
|
|
15
|
+
- [x] Phase 5 — Git workspace and integration engine
|
|
16
|
+
- [x] Phase 6 — Director and capability system
|
|
17
|
+
- [x] Phase 7 — CLI and operator experience
|
|
18
|
+
- [x] Phase 8 — Policy, human gates, redaction (docker sandbox deferred
|
|
19
|
+
honestly to v0.2 — refused with explanation, see ROADMAP)
|
|
20
|
+
- [ ] Phase 9 — E2E validation and dogfooding
|
|
21
|
+
- [x] 15-scenario fake-agent E2E suite (2/3/5-agent runs, fallback,
|
|
22
|
+
review rejection/repair, gate veto, decisions, interruption/
|
|
23
|
+
resume, cancellation, merge-conflict recovery)
|
|
24
|
+
- [x] Live smoke iterations 1–3 with real claude/codex/agy: director
|
|
25
|
+
analysis, live probes, plan challenges verified; three kernel
|
|
26
|
+
defects found and fixed (dirty-repo fail-fast, orphaned
|
|
27
|
+
PLANNING runs, prose acceptance commands crashing the pipeline)
|
|
28
|
+
- [x] Full live run to COMPLETE (run_7ccfb487: gate-caught failure,
|
|
29
|
+
fallback repair, Codex structured review approval, human gate,
|
|
30
|
+
integration branch verified — evidence/LIVE_SMOKE_REPORT.md)
|
|
31
|
+
- [x] Controlled self-review dogfood (run_cb25ff11: codex analysis
|
|
32
|
+
integrated after independent claude review; second task skipped
|
|
33
|
+
at the human gate after bounded review cycles — evidence in
|
|
34
|
+
docs/development/SELF_REVIEW.md)
|
|
35
|
+
- [x] Phase 10 — Documentation, packaging, GitHub publication,
|
|
36
|
+
v0.1.0 tag + release, FINAL_BUILD_REPORT.md
|
|
37
|
+
|
|
38
|
+
## Final quality gates
|
|
39
|
+
|
|
40
|
+
- 211 tests passing (unit, integration, E2E, CLI)
|
|
41
|
+
- Coverage 81% (floor 80); ruff / mypy --strict / bandit / pip-audit /
|
|
42
|
+
gitleaks clean; CI green on GitHub
|
|
43
|
+
- Live cross-vendor orchestration + dogfood evidence in
|
|
44
|
+
docs/development/evidence/
|
|
45
|
+
|
|
46
|
+
See FINAL_BUILD_REPORT.md for the complete evidence trail.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Orkestra are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
|
|
7
|
+
(pre-1.0: minor versions may contain breaking changes, announced here).
|
|
8
|
+
|
|
9
|
+
## [Unreleased]
|
|
10
|
+
|
|
11
|
+
## [0.1.2] - 2026-07-24
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- PyPI publication via Trusted Publishing (GitHub OIDC): new
|
|
16
|
+
`publish-to-pypi.yml` workflow builds, metadata-checks, and smoke-tests
|
|
17
|
+
distributions, then publishes through the protected `pypi` environment
|
|
18
|
+
with manual approval. No API tokens are stored anywhere.
|
|
19
|
+
- Orkestra is now installable as `uv tool install orkestra-runtime`
|
|
20
|
+
(or `pip install orkestra-runtime`).
|
|
21
|
+
|
|
22
|
+
## [0.1.1] - 2026-07-24
|
|
23
|
+
|
|
24
|
+
### Security
|
|
25
|
+
|
|
26
|
+
- Redaction hardening, driven directly by Orkestra's own dogfood
|
|
27
|
+
self-review (`docs/development/SELF_REVIEW.md`):
|
|
28
|
+
- New provider patterns: AWS session tokens, GCP `privateKeyData`,
|
|
29
|
+
Azure `AccountKey`/`SharedAccessSignature`/SAS `sig=`, GitLab
|
|
30
|
+
`glpat-`/`glcbt-`, Slack `xapp-`, npm `npm_`/`.npmrc` `_authToken`,
|
|
31
|
+
PyPI `pypi-`, URL userinfo passwords (user/host preserved).
|
|
32
|
+
- Generic credential matcher now covers provider-prefixed and
|
|
33
|
+
quoted-JSON keys (`AWS_SESSION_TOKEN=`, `"password": "..."`, plain
|
|
34
|
+
`token=`, camelCase `apiKey`) while skipping benign values
|
|
35
|
+
(status words, `${VAR}` templates, absolute paths, masked values)
|
|
36
|
+
and no longer over-consumes past commas.
|
|
37
|
+
- New `redact_structure()` recursively redacts sensitive keys in
|
|
38
|
+
structured event data BEFORE JSON serialization; wired into event
|
|
39
|
+
persistence.
|
|
40
|
+
- Table-driven positive/negative regression suite covering every
|
|
41
|
+
verified miss and false positive from the review.
|
|
42
|
+
|
|
43
|
+
## [0.1.0] - 2026-07-24
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
|
|
47
|
+
- Deterministic orchestration kernel: persistent SQLite state, task DAG
|
|
48
|
+
with cycle detection, async scheduler with bounded retries, backoff,
|
|
49
|
+
fallback agents, cancellation, pause/resume, and crash recovery.
|
|
50
|
+
- Agent adapter layer with first-party adapters for Claude Code, Codex
|
|
51
|
+
CLI, and Gemini CLI; scripted fake adapter; external-command adapter
|
|
52
|
+
protocol (`orkestra-jsonl/1`); adapter contract test kit.
|
|
53
|
+
- Git workspace engine: per-task worktree isolation, base-commit
|
|
54
|
+
tracking, hook-disabled Git execution, diff path-policy checks,
|
|
55
|
+
no-ff integration with conflict detection, interrupted-operation
|
|
56
|
+
recovery.
|
|
57
|
+
- Director system (default: Claude Code) with schema-validated decision
|
|
58
|
+
envelopes, deterministic heuristic fallback planner, capability
|
|
59
|
+
probes with budgets and caching, weighted capability matrix with
|
|
60
|
+
confidence, agent performance ledger, and dynamic reassignment.
|
|
61
|
+
- Policy engine with safe defaults, explicit opt-in elevated modes,
|
|
62
|
+
independent-review enforcement (implementer ≠ reviewer), and
|
|
63
|
+
deterministic verification gates that agents cannot override.
|
|
64
|
+
- Human gates: persisted decision records, `orkestra decisions` /
|
|
65
|
+
`orkestra approve`, resume-after-decision workflow.
|
|
66
|
+
- CLI: `init`, `doctor`, `agents list|probe`, `analyze`, `plan`, `run`,
|
|
67
|
+
`status`, `logs`, `decisions`, `approve`, `pause`, `resume`, `cancel`,
|
|
68
|
+
`report`.
|
|
69
|
+
- Secret redaction for logs, reports, and support bundles.
|
|
70
|
+
- Full research corpus, architecture documentation, ADRs, and threat
|
|
71
|
+
model.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our pledge
|
|
4
|
+
|
|
5
|
+
We as members, contributors, and leaders pledge to make participation in
|
|
6
|
+
the Orkestra community a harassment-free experience for everyone,
|
|
7
|
+
regardless of age, body size, visible or invisible disability, ethnicity,
|
|
8
|
+
sex characteristics, gender identity and expression, level of experience,
|
|
9
|
+
education, socio-economic status, nationality, personal appearance, race,
|
|
10
|
+
religion, or sexual identity and orientation.
|
|
11
|
+
|
|
12
|
+
## Our standards
|
|
13
|
+
|
|
14
|
+
Examples of behavior that contributes to a positive environment:
|
|
15
|
+
|
|
16
|
+
- Demonstrating empathy and kindness toward other people
|
|
17
|
+
- Being respectful of differing opinions, viewpoints, and experiences
|
|
18
|
+
- Giving and gracefully accepting constructive feedback
|
|
19
|
+
- Accepting responsibility and apologizing to those affected by our
|
|
20
|
+
mistakes, and learning from the experience
|
|
21
|
+
- Focusing on what is best for the overall community
|
|
22
|
+
|
|
23
|
+
Examples of unacceptable behavior:
|
|
24
|
+
|
|
25
|
+
- The use of sexualized language or imagery, and sexual attention or
|
|
26
|
+
advances of any kind
|
|
27
|
+
- Trolling, insulting or derogatory comments, and personal or political
|
|
28
|
+
attacks
|
|
29
|
+
- Public or private harassment
|
|
30
|
+
- Publishing others' private information without their explicit permission
|
|
31
|
+
- Other conduct which could reasonably be considered inappropriate in a
|
|
32
|
+
professional setting
|
|
33
|
+
|
|
34
|
+
## Enforcement
|
|
35
|
+
|
|
36
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
37
|
+
reported to the project maintainers via GitHub. All complaints will be
|
|
38
|
+
reviewed and investigated promptly and fairly. Maintainers are obligated
|
|
39
|
+
to respect the privacy and security of the reporter of any incident.
|
|
40
|
+
|
|
41
|
+
## Attribution
|
|
42
|
+
|
|
43
|
+
This Code of Conduct is adapted from the
|
|
44
|
+
[Contributor Covenant](https://www.contributor-covenant.org), version 2.1.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Contributing to Orkestra
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in improving Orkestra.
|
|
4
|
+
|
|
5
|
+
## Development setup
|
|
6
|
+
|
|
7
|
+
Requirements: Python ≥ 3.12, [uv](https://docs.astral.sh/uv/), Git.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
git clone https://github.com/andyyaro/orkestra
|
|
11
|
+
cd orkestra
|
|
12
|
+
uv sync # creates .venv with dev dependencies
|
|
13
|
+
uv run pytest # run the test suite
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Quality gates (run before every PR)
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
uv run ruff format --check .
|
|
20
|
+
uv run ruff check .
|
|
21
|
+
uv run mypy
|
|
22
|
+
uv run pytest --cov=orkestra
|
|
23
|
+
uv run bandit -c pyproject.toml -r src
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
CI runs the same commands; PRs must be green.
|
|
27
|
+
|
|
28
|
+
## Ground rules
|
|
29
|
+
|
|
30
|
+
- **Determinism first.** The kernel must never depend on LLM output for
|
|
31
|
+
policy, state transitions, or verification. Director/agent output is
|
|
32
|
+
untrusted input — validate it.
|
|
33
|
+
- **No fixed-agent-count assumptions.** Code, schemas, and tests must work
|
|
34
|
+
for 2 agents and for N agents. Never hard-code three.
|
|
35
|
+
- **Security posture.** Subprocesses use argument arrays (no `shell=True`);
|
|
36
|
+
external paths are resolved and scope-checked; Git runs hook-disabled;
|
|
37
|
+
secrets are redacted from anything persisted.
|
|
38
|
+
- **Evidence over self-report.** New agent-facing behavior needs a fake- or
|
|
39
|
+
contract-test demonstrating the failure modes (timeout, garbage output,
|
|
40
|
+
non-zero exit), not just the happy path.
|
|
41
|
+
- **Tests accompany code.** Bug fixes include a regression test.
|
|
42
|
+
|
|
43
|
+
## Adding an agent adapter
|
|
44
|
+
|
|
45
|
+
See `docs/adapters/AUTHORING.md`. Implement the adapter contract, then run
|
|
46
|
+
the contract test kit:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
uv run pytest tests/adapters/test_contract.py --adapter your-adapter
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Commit / PR conventions
|
|
53
|
+
|
|
54
|
+
- Small, atomic commits with imperative subjects.
|
|
55
|
+
- PRs describe *what* and *why*; link issues.
|
|
56
|
+
- ADRs (`docs/architecture/adr/`) for decisions that constrain future work.
|
|
57
|
+
|
|
58
|
+
## Code of conduct
|
|
59
|
+
|
|
60
|
+
See `CODE_OF_CONDUCT.md`. Be excellent to each other.
|
|
61
|
+
|
|
62
|
+
## License
|
|
63
|
+
|
|
64
|
+
Contributions are accepted under Apache-2.0 (inbound = outbound, per
|
|
65
|
+
Apache-2.0 §5). No CLA.
|