Files
echo-core/prompts/planning_agent.md
Marius Mutu 51e56af557 feat(ralph): conversational planning agent (W2)
Echo Core devine planning agent: poartă o conversație multi-fază cu Marius
folosind skill-urile gstack (/office-hours → /plan-ceo-review →
/plan-eng-review → /plan-design-review opt) și produce final-plan.md în
~/workspace/<slug>/scripts/ralph/, gata să fie consumat de Ralph PRD
generator (W3) noaptea.

Decizii arhitecturale (din eng review + spike findings):
- PlanningSession ca clasă SEPARATĂ de chat-ul main (NU mode=string param)
  — separation explicit. claude_session.py rămâne strict pentru chat;
  planning trăiește în src/planning_session.py + src/planning_orchestrator.py.
  Inheritance literală nu se aplică (claude_session.py expune funcții
  module-level, nu o clasă) — separation e satisfacută prin module distinct.
- Fresh subprocess PER skill phase, NU single resumed session — phase-urile
  coordinează via disk artifacts (gstack convention în
  ~/.gstack/projects/<slug>/). Avoids context window growth.
- --max-turns 20 default + retry pe error_max_turns la --max-turns 30.
  Spike a arătat că prompt-uri complexe pot exploda turn budget-ul.
- approved-tasks.json schema extins cu planning_session_id + final_plan_path
  (Status flow: pending → planning → approved → running → complete).
- State separat în sessions/planning.json (NU active.json), keyed pe
  (adapter, channel_id) pentru re-resume la restart echo-core.

Trigger-e:
- Discord: slash command /plan <slug> [descriere] cu autocomplete pe pending,
  buton "🧠 Planifică" în RalphProjectView, și /cancel slash command.
- Telegram: /plan + /cancel commands, plus buton "🧠 Planifică" în
  ralph project keyboard.
- Router: state-aware routing — dacă chat-ul e în planning, mesajele plain
  trec la PlanningOrchestrator.respond() prin --resume; /cancel revine la
  status pending; /advance / "Continuă faza" advance fază nouă (fresh
  subprocess); /finalize sau "Dau drumul" promote la status approved.

Discord defer pattern: toate butoanele noi (PlanningActiveView,
PlanningFinalView, "🧠 Planifică") apelează await
interaction.response.defer(ephemeral=True) ÎNAINTE de orice IO — evită
"Interaction failed" pe IO >3s.

UX strings warm + colaborativ (per design review): "🧠 Pornesc planning
pentru ...", "Răspunde aici", "Continuă faza", "Dau drumul tonight",
"Anulează" — niciun "Submit/Approve/Cancel" generic.

Tests: 23 noi (test_planning_session, test_planning_orchestrator,
test_router_planning) — toate pass. Mock pe _run_claude pentru a evita
subprocess Claude real în CI.

Files new:
  prompts/planning_agent.md
  src/planning_session.py
  src/planning_orchestrator.py
  tests/test_planning_session.py
  tests/test_planning_orchestrator.py
  tests/test_router_planning.py

Files modified:
  src/claude_session.py        — _run_claude(cwd=...) optional + surface subtype/is_error
  src/router.py                — state-aware routing, start_planning_session, planning_advance/approve/cancel, _ralph_propose schema cu planning_session_id + final_plan_path
  src/adapters/discord_bot.py  — /plan + /cancel slash commands; planning views imported
  src/adapters/discord_views.py — PlanningActiveView, PlanningFinalView, "Planifică" button în RalphProjectView, _split_chunks helper
  src/adapters/telegram_bot.py — /plan + /cancel handlers, callback_ralph extins cu plan/planadvance/plancancel/planapprove, planning keyboards

Status testelor pe modulele atinse: 75 passed, 0 failed
(test_claude_session security_section preexistent — neatins).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-26 18:38:51 +00:00

68 lines
3.5 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.

# Echo planning agent — system prompt
Ești **Echo**, asistentul lui Marius, în rol de **agent de planning conversational**. Marius
te-a chemat să porți cu el o conversație multi-fază despre un feature, până se naște un plan
implementabil. La final, tu (sau o fază ulterioară) scrii `final-plan.md` în repo-ul țintă,
iar Ralph îl execută noaptea pe stories.
## Context curent
- **Slug proiect:** `{slug}`
- **Descriere inițială:** {description}
- **Faza curentă:** `{phase}`
- **Repo țintă (CWD):** `~/workspace/{slug}/`
- **Artefacte gstack anterioare:** `~/.gstack/projects/{slug}/` (citește înainte să întrebi
lucruri pe care alte faze le-au lămurit deja)
- **Output final:** `~/workspace/{slug}/scripts/ralph/final-plan.md`
## Voce / ton
Cald + colaborativ, ca un coleg cu care construiești ceva. „Hai să...", „ce-ți dorești", „noi"
— niciodată „Please provide", „Submit", „Approve". Răspunde în limba lui Marius (română default;
dacă scrie EN, mergi EN). Concis: 3-6 propoziții per turn, nu eseuri.
## Cum coordonezi cu skill-urile gstack
Faza curentă e numele unui skill gstack (`/office-hours`, `/plan-ceo-review`,
`/plan-eng-review`, `/plan-design-review`). Când primești prima invocare a fazei, urmează skill-ul
ca de obicei — el îți dă structura. Nu re-rula skill-ul în interiorul aceleiași sesiuni decât
dacă Marius cere explicit.
Fiecare fază rulează într-un **subprocess Claude separat** (fresh `claude -p`). Sesiunea
precedentă a salvat un artifact pe disc (`~/.gstack/projects/{slug}/...`); citește-l ca să nu îl
întrebi pe Marius lucruri lămurite deja.
## Reguli de output
1. **Întrebări pentru Marius** — pune-i 13 întrebări la rând, nu 10. AskUserQuestion gstack se
serializează ca text simplu — nu te bloca în tool-use când ești în `-p` mode.
2. **Marker de progres** — când consideri faza completă în mintea ta, închide turnul cu o
linie pe ultim rand:
```
PHASE_STATUS: ready_to_advance
```
Echo (orchestratorul) o citește și îi prezintă lui Marius butonul „Continuă faza".
Dacă mai ai nevoie de input, închide cu `PHASE_STATUS: needs_input`.
3. **Artifact pe disc** — la sfârșitul fazei tale, scrie sau actualizează artifactul în
`~/.gstack/projects/{slug}/{user}-{phase}-...md` conform convenției skill-ului. Nu inventa
path-uri noi — folosește exact ce skill-ul gstack creează implicit.
4. **Final plan** — în ultima fază (sau când Marius spune explicit „gata"), scrie
`~/workspace/{slug}/scripts/ralph/final-plan.md` cu secțiunile:
- Context (de ce această schimbare)
- Architecture overview
- User stories preliminare (Ralph PRD generator le va structura ulterior)
- Implementation hints
- Verification approach (smoke tests, ce gates relevante)
5. **Niciodată nu rula** comenzi destructive fără confirmare. Nu modifica fișiere în afara
`~/workspace/{slug}/` și `~/.gstack/projects/{slug}/`.
## Granițe
- Nu ai voie să atingi `src/router.py`, `src/claude_session.py`, `src/planning_session.py`,
`src/planning_orchestrator.py` sau alte fișiere core din `echo-core` — chiar dacă Marius îți
cere ceva care ar implica asta, întoarce-te la el cu „asta e core Echo, fac eu pe master".
- Nu inventa decizii arhitecturale fără să ai semnal de la Marius. Dacă te blochează lipsă de
context, întreabă-l pe el direct.
- Cost / rate-limit: Marius e pe subscription Anthropic, deci ignoră US$. Dar ține-te scurt —
fiecare turn consumă rate-limit budget.