trading-system-docs/a4/README.md

178 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Red Queen — A4: Bounded Orchestrator (V1)
Der **Bounded Orchestrator** verbindet erstmals kontrolliert die A1-Architektur,
den A2 **Mission/WP-State** (`missions.db`, autoritativ für Transitionen), den A3
**Deterministic Safety Layer** (`safety.db`, verbindliche Safety-Decision) und
die **Hermes-native `delegate_task`**-Sub-Agenten (Planner/Maker/Checker) zu
einer **expliziten, garantiert endenden** Build-Pipeline:
```
MISSION → VALIDATE STATE → VALIDATE SAFETY → PLAN → VALIDATE PLAN
→ CREATE WORK PACKAGES → SELECT RUNNABLE WP → MAKER → TEST
→ FRESH CHECKER → SAFETY DECISION → STATE UPDATE → NEXT BOUNDED STEP
→ FINALIZE / STOP
```
**WICHTIG:** A4 ist **KEIN 24/7-System.** Kein Heartbeat, kein Mission-Cron, kein
dauerhafter Worker, kein while-True-Agentloop, kein Background-Daemon, kein
Self-Improvement-Automation, keine automatische Rain-Eskalation. A4 läuft nur nach
einem **expliziten Start** und endet **garantiert** (bounded).
---
## Architektur-Prinzip
**Red Queen (ein Hermes-Agent) ist der Orchestrator.** Der echte Sub-Agenten-Versand
(Planner/Maker/Checker) läuft über die Hermes-native `delegate_task`-Engine — ein
Python-Prozess kann diese NICHT aufrufen. Deshalb implementiert A4 die
**deterministische Orchestrierungs-Logik** als reine, inaktive Python-Library
(`Orchestrator`), die Red Queen als **Entscheidungs- und State-Maschine** importiert
und ansteuert:
- Die **Library** entscheidet deterministisch: was ist runnable, Safety-Gate,
Risk>Size, Approval-Gate, Completion-Gate, Bounded-Run-Limits, Repair-Flow,
idempotente Wiederaufnahme, Restart-Persistenz.
- **Red Queen selbst** startet die tatsächlichen Child-Agenten (Planner/Maker/Checker)
über `delegate_task`, übergibt ihnen das von der Library erzeugte
Dispatch-Contract und führt das Ergebnis über `apply_child_result` zurück.
- Für Tests wird ein simuliertes `ChildDispatcher`-Callable injiziert — die Library
selbst startet nichts und läuft nie zyklisch.
---
## Datenfluss & Gates
| Schritt | Mechanik | Verbindlich |
|---------|----------|-------------|
| 1. Plan erhalten | von Planner | Output-Format laut AGENT_CONTRACTS |
| 2. Plan-Validierung | `PlanValidator.validate()` | §6; ungültig → REJECT, keine Ausführung |
| 3. WP-Anlage | A2 `MissionStore` | kein direkter SQL außerhalb A2-APIs |
| 4. Runnable-Selection | `select_runnable()` | §8; DONE-Deps + READY + Safety CLOSED + Scope erlaubt |
| 5. Consistency-Gate | `_consistency_gate()` | §9: A2-State + A3-Check vor JEDER Mutation |
| 6. Risk-Klassifikation | `classify_risk()` | §26/27: RISK überschreibt SIZE |
| 7. Approval-Gate | `requires_approval()` | §25: CRITICAL/Approval-Target → APPROVAL_REQUIRED |
| 8. Dispatch | `build_maker_contract` / `build_checker_contract` | Minimum-Necessary-Context |
| 9. Safety-Decision | A3 `evaluate_next_action` | verbindlich |
| 10. Repair-Flow | RETRY max 3 / gleiche Error-Sig max 2 | SAFETY_CONTRACT |
| 11. Circuit-Enforcement | Circuit OPEN → NO MUTATION | §19 |
| 12. Completion-Gate | `mission_completion_gate()` | §20 + Final-Review-Gate |
| 13. Bounded-Run | `run_bounded()` | §22: endet garantiert |
---
## A2/A3-Integration
A4 **importiert** und nutzt die bestehenden Module (kein Duplikat):
```python
from a2.rq_mission import MissionStore # autoritativ für Mission-/WP-Transitions
from a3.rq_safety import SafetyStore # verbindliche Safety-Decision
```
- A2 (`missions.db`) ist die **autoritative Quelle** für Mission-/WP-State und
erlaubte Transitionen.
- A3 (`safety.db`) ist die **verbindliche Safety-Decision** (`evaluate_next_action`,
`check_safety_state`, `record_attempt`, `open_circuit`).
- A4 selbst hält **keine neue zentrale DB**; Run-Flags/Sub-Agent-Evidence werden
über A2/A3-APIs bzw. den A3-Safety-Evidence-Mechanismus persistiert.
- Import-Lösung: `sys.path` wird um Repo-Root und `a4/` ergänzt
(`Path(__file__).resolve().parent.parent`).
---
## Planner/Maker/Checker-Contract
| Rolle | Output | Gate |
|-------|--------|------|
| **Planner** | WORK_PACKAGES / DEPENDENCIES / RISK_CLASS / ORDER / TEST_REQUIREMENTS | Red Queen validiert deterministisch (§6) |
| **Maker** | IMPLEMENTATION_SUMMARY / FILES_CHANGED / TESTS_RUN / TEST_RESULTS | Nie final PASS |
| **Checker** | PASS / FAIL / Verdict | **FRESH** Child, ohne Maker-Argumentation |
`build_maker_contract` und `build_checker_contract` erzeugen die
**Minimum-Necessary-Context**-Contracts. Der Checker-Contract enthält bewusst
**keine** Maker-Rechtfertigung (AGENT_CONTRACTS §3). Werte werden secret-redacted.
---
## Bounded Run (Limits aus Konstanten)
```python
MAX_WORK_PACKAGES_PER_RUN = 12
MAX_REPAIR_CYCLES = 3 # entspricht A3 MAX_MAKER_CHECKER_REPAIRS
MAX_CHILDREN_ACTIVE = 3
MAX_BOUNDED_RUNTIME = 1000 # Sekunden / Steps
```
`run_one_step()` führt **GENAU EINEN** deterministischen Schritt aus und endet
**garantiert** (keine Rekursion). `run_bounded()` stoppt bei
`MISSION_COMPLETED / BLOCKED / ESCALATED / CIRCUIT_OPEN / NO_RUNNABLE_WP /
RUN_BUDGET_REACHED / ERROR` — kein self-reschedule.
---
## Approval Gates
WP, die laut `ROOT_SSH_GATE` einen **kritischen Bereich** berühren (SSH, Firewall,
Auth, Secrets, Recovery, Red Queen Runtime, Circuit Breaker, Root Policy, Live
Trading) → `ST_APPROVAL_REQUIRED`, **keine Ausführung**. Red Queen legt den Antrag
im `EXTERNAL_REVIEW`-Format vor und wartet auf Christian.
---
## Failure Handling / Idempotenz
- **Failure:** `evaluate_next_action`-Decision wird verbindlich befolgt
(RETRY / DEBUG / SECOND_OPINION / BLOCK / CIRCUIT_BREAK). Repair max 3, gleiche
Error-Signatur max 2. Kein implizit PASS, kein endlos Spawn.
- **SECOND_OPINION → KEIN automatisches Rain** (nur interner frischer Child oder
BLOCK; Rain ausschließlich Christian-gated, EXTERNAL_REVIEW_CONTRACT).
- **Idempotenz:** DONE-WP wird nie erneut Maker; bereits registrierter Attempt
nicht doppelt; COMPLETED-Mission nie erneut; gleiche Child-Task-ID nie doppelt
gewertet.
- **Restart:** State in A2/A3-DBs persistent; nach Restart wird der Zustand gelesen,
ohne doppelte WP-Ausführung oder verlorene Attempts.
---
## Sub-Agent-Evidence (§30)
`make_child_evidence()` erzeugt einen maschinenlesbaren Evidence-Record
(Child Role, Child Task ID, Mission ID, WP ID, Start, Result, Verdict) —
**KEINE Chain-of-Thought**. Credentials werden redactiert (nur EXISTS/LENGTH/redacted).
---
## CLI
`rq_orchestrator_cli.py``--json`, Exit-Code 2 bei `OrchestratorError` (A2/A3-Muster):
```
plan Plan validieren + WP-Anlage
run-one-step Einen deterministischen Schritt ausführen
run-bounded Begrenzter Run (endet garantiert)
complete Completion-Gate prüfen / Final-Review
status Status abfragen
evaluate A3-Safety-Decision
approve Approval registrieren
```
---
## Test Harness
`python3 a4/test_a4.py` — isolierte, deterministische Tests (temp-DBs, kein Netz,
kein hermes). Injiziert simulierte `ChildDispatcher`. Exit-Code 0 = PASS.
Deckt A4 §6§33 ab: Plan-/Dependency-Validierung, Runnable-Selection, A2/A3-
Consistency-Gate, Maker/Checker-Contract, Checker-Pass/Fail, Retry allowed/denied,
Retry-4-Impossible, Circuit-open-blocks-Maker, Approval-Gate, Risk-overrides-Size,
No-Runnable-Stop, Completion-/Final-Review-Gate, Idempotent-WP, Restart-Resume,
Child-Failure, Reason-Codes, Secret-safe-Logging.
---
## Known Limitations
- A4 selbst führt **keine** echte `delegate_task` aus (das macht Red Queen).
- Kein automatisches Rain; kein Heartbeat/Cron/Daemon.
- DEBUG ist als Schnittpunkt implementiert (leitet an A5-Debugger/Strategiewechsel
weiter), erzwingt aber keine interne Debugger-Logik.