Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)
Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
4.5 KiB
4.5 KiB
SPEC.md — AI-Orchestrator
Purpose
A Python service implementing the Symphony specification — it polls a task board (OrgMyLife) for agent-ready tasks, dispatches them to a coding agent (Codex CLI or alternative), manages isolated workspaces, and reports results back. Teams manage work; the orchestrator handles execution.
Tech Stack
| Layer | Technology |
|---|---|
| Language | Python 3.11+ (strict typing) |
| Package manager | Hatch (pyproject.toml) |
| Testing | pytest + pytest-asyncio + hypothesis (property-based) |
| Linting | ruff |
| Type checking | mypy (strict) |
| HTTP | httpx (client), starlette + uvicorn (server) |
| Templating | Jinja2 |
| Config format | YAML (WORKFLOW.md with front matter) |
| Deployment | Docker / systemd |
Architecture
src/ai_orchestrator/
├── cli.py # Entry point (ai-orchestrator command)
├── config.py # Typed config from WORKFLOW.md front matter
├── workflow.py # WORKFLOW.md parser (YAML + Jinja2 template)
├── models.py # Data models (Issue, WorkspaceState, etc.)
├── orchestrator.py # Poll loop, dispatch, concurrency, retries
├── tracker.py # Abstract tracker interface
├── tracker_orgmylife.py # OrgMyLife adapter (REST API)
├── workspace.py # Per-issue workspace lifecycle and hooks
├── agent_runner.py # Codex subprocess integration
├── prompt.py # Jinja2 prompt rendering
├── http_server.py # Optional REST API + dashboard
└── watcher.py # File system watcher for hot-reload
scripts/pat_manager/ # PAT lifecycle management (check, alert, rotate)
├── checker.py # Token expiry checking
├── alerter.py # Alert dispatch (OrgMyLife task creation)
├── rotator.py # Token rotation logic
├── reporter.py # Status reporting
├── registry.py # pat-registry.json I/O
├── models.py # PAT data models
└── errors.py # Error types
Components
Orchestrator Core
- Workflow Loader — Parses
WORKFLOW.md(YAML front matter + Jinja2 prompt template) - Config Layer — Typed getters, defaults, env var resolution (
$VAR_NAME), validation - Tracker Client — OrgMyLife REST adapter with pagination and state mapping
- Orchestrator — Poll loop, task dispatch, concurrency limits, retry with backoff
- Workspace Manager — Per-issue workspace creation, hooks, cleanup
- Agent Runner — Codex app-server subprocess integration
- HTTP Server — REST API (
/api/v1/state) and dashboard for observability
PAT Manager
- Checker — Reads pat-registry.json, calculates days until expiry
- Alerter — Creates OrgMyLife tasks for expiring/expired tokens, deduplicates
- Rotator — Automated token rotation (where supported)
- Reporter — Generates status reports
Configuration
The orchestrator reads WORKFLOW.md in the working directory. Format:
---
tracker:
kind: orgmylife
endpoint: https://api.andreknie.de
api_key: $ORGMYLIFE_API_SECRET
polling:
interval_ms: 30000
workspace:
root: ~/ai_orchestrator_workspaces
agent:
max_concurrent_agents: 3
max_turns: 15
codex:
command: codex app-server
approval_policy: auto-edit
---
<Jinja2 prompt template>
Conventions
- All source in
src/ai_orchestrator/(installed as package) - Tests in
tests/— mirror source structure withtest_prefix - Property-based tests use
_propertiessuffix (e.g.,test_alerter_properties.py) - PAT manager scripts in
scripts/pat_manager/(standalone, own requirements.txt) - File naming: snake_case for Python modules
- Config via environment variables (prefixed as needed) or WORKFLOW.md
Rules
- Never store secrets in code — use env vars or
.secretsfile. - All tracker interactions go through the abstract
Trackerinterface. - Property-based tests (hypothesis) for all domain logic.
- Async by default for I/O operations.
- Typed models for all data transfer (no raw dicts at boundaries).
- PAT manager must deduplicate alerts (check existing tasks before creating new ones).
Current State
- Orchestrator core: implemented (poll, dispatch, workspace, agent runner)
- OrgMyLife tracker adapter: implemented
- PAT manager: fully implemented + tested (checker, alerter, rotator, reporter)
- HTTP server: implemented
- Deployment: Docker + docker-compose ready, systemd pending
- Blocked: needs Codex CLI or alternative agent installed on target server