EVA / tree
The full EVA system on one screen. A single decision tree, keyed by user intent, walking you from "where do I start?" to "how can I be sure this is finished?" — every prompt in prompts/ is a leaf. Source: docs/eva-decision-tree.md.
kick <id>)
flowchart TD
%% ───── ROOT ─────
R{{"What's your situation
right now?"}}
R -->|"Let the harness
drive itself"| B0
R -->|"Never run EVA/Petrova
here before"| B1
R -->|"I'm here — what's
the state?"| B2
R -->|"I need to record or
justify a choice"| B3
R -->|"I'm scoping work
to do next"| B4
R -->|"I'm doing the work"| B5
R -->|"Something's off /
I'm stuck"| B6
R -->|"Am I done?"| B7
%% ───── 0. META-ORCHESTRATION (the EVA harness itself) ─────
B0{{"What should the
harness do for you?"}}
B0 -->|"Bring a fresh repo
into the fleet"| P_eonboard(["eva-onboard"])
B0 -->|"Pick the single next
highest-leverage move"| P_enext(["eva-next"])
B0 -->|"Plan→queue→execute
one goal, step by step"| P_eflow(["eva-flow"])
B0 -->|"Run one governed
autopilot tick"| P_etick(["eva-tick"])
B0 -->|"Cross the phase
boundary (verify→close→open)"| P_ecycle(["eva-cycle"])
B0 -->|"Respond to the
latest red signal"| P_erecover(["eva-recover"])
B0 -->|"A script's CLI drifted
from an external tool"| P_ecli(["eva-cli-drift-recover"])
B0 -->|"Governance gauntlet,
one PASS/WARN/FAIL table"| P_ehealth(["eva-health"])
B0 -->|"Ratify a new fleet
baseline"| P_ebaseline(["eva-baseline"])
B0 -->|"Ask a question,
evidence-bound"| P_eask(["eva-ask"])
B0 -->|"Re-project the
handbook + manifest"| P_eproject(["eva-project"])
%% Branch 0 composes the arc below it
P_eonboard -.->|"drives"| B1
P_enext -.->|"emits dispatch,
doesn't invoke"| B2
P_eflow -.->|"drives"| B4
P_etick -.->|"drives one
petrova verb"| B5
P_ecycle -.->|"drives"| B7
P_erecover -.->|"drives"| B6
P_ehealth -.->|"reads"| B2
P_ebaseline -.->|"requires"| P_ehealth
%% ───── 1. ONBOARDING ─────
B1{{"First contact?"}}
B1 -->|"Brand-new machine"| P_onboard(["petrova-onboard"])
B1 -->|"Repo present, env not wired"| P_boot(["petrova-bootstrap"])
B1 -->|"Installing into a sibling repo"| P_install(["petrova-install-playbook"])
B1 -->|"Handing off to a
fresh agent mid-task"| P_handoff(["session-handoff"])
P_onboard --> B2
P_boot --> B2
P_install --> B2
P_handoff --> B2
%% ───── 2. ORIENTING ─────
B2{{"What do you need
to see?"}}
B2 -->|"Whole fleet at a glance"| P_snap(["petrova-fleet-snapshot"])
B2 -->|"Is this repo healthy?"| P_health(["petrova-health-check"])
B2 -->|"Is my tooling healthy?"| P_doc(["petrova-doctor"])
B2 -->|"What governance exists?"| P_gov(["petrova-governance-inventory"])
B2 -->|"What changed since X?"| P_chg(["petrova-changes-since"])
B2 -->|"Are the docs current?"| P_fresh(["petrova-doc-freshness"])
B2 -->|"What manual ops should
become Routines?"| P_arch(["petrova-routine-archaeology"])
%% ───── 3. DECIDING ─────
B3{{"What kind of decision?"}}
B3 -->|"Capture a single decision"| P_dec(["petrova-decision-doc"])
B3 -->|"Weigh options / ADR"| P_adr(["petrova-adr-tradeoff"])
B3 -->|"Freeze a current-state baseline"| P_base(["petrova-declare-baseline"])
B3 -->|"Check alignment with the north star"| P_ns(["petrova-north-star-align"])
%% ───── 4. PLANNING ─────
B4{{"What are you planning?"}}
B4 -->|"One feature, one repo"| P_plan(["petrova-plan-feature"])
B4 -->|"Bundle of tasks"| P_bundle(["task-bundle-planner"])
B4 -->|"An implementation prompt for
a downstream agent"| P_mpg(["meta-prompt-generator"])
B4 -->|"Add a milestone to the roadmap"| P_ms(["petrova-milestone-add"])
B4 -->|"Cross-repo execution graph"| P_dag(["repo-dag-generator"])
B4 -->|"Open a governance phase"| P_popen(["petrova-phase-open"])
P_dag --> B5
P_plan --> B5
P_bundle --> B5
P_mpg --> B5
%% ───── 5. EXECUTING ─────
B5{{"What are you executing?"}}
B5 -->|"Multi-step task, one repo"| P_orch(["orchestrate-multistep"])
B5 -->|"Cross-repo DAG"| P_dagx(["repo-dag-executor"])
B5 -->|"Refactor with hard limits"| P_ref(["refactor-with-constraints"])
B5 -->|"Let the autopilot drive"| P_auto(["petrova-autopilot"])
B5 -->|"Propose a fix for a known issue"| P_fix(["petrova-propose-fix"])
B5 -->|"Wire a sibling system"| B5W{{"Which system?"}}
B5 -->|"Author content / harness"| B5A{{"What kind of content?"}}
B5 -->|"Publish content downstream"| B5C{{"What stage of the
content pipeline?"}}
B5 -->|"Fleet infrastructure op"| B5F{{"What kind of
fleet op?"}}
%% 5a — Wiring sub-branch
B5W -->|"ares"| P_wa(["petrova-wire-ares"])
B5W -->|"crumb"| P_wc(["petrova-wire-crumb"])
B5W -->|"eva"| P_we(["petrova-wire-eva"])
B5W -->|"rocky"| P_wr(["petrova-wire-rocky"])
B5W -->|"traceo"| P_wt(["petrova-wire-traceo"])
B5W -->|"generic integration"| P_wi(["petrova-wire-integration"])
B5W -->|"an HTTP API as MCP tools"| P_mcpw(["mcp-provider-wire"])
%% 5b — Authoring sub-branch
B5A -->|"Impeccable handbook (full)"| P_ihg(["impeccable-handbook-generator"])
B5A -->|"Run an impeccable harness"| P_ihe(["impeccable-harness-executor"])
B5A -->|"One handbook section"| P_hsg(["handbook-section-generator"])
B5A -->|"Brand asset"| P_brand(["brand-asset-generator"])
B5A -->|"Email-flow verification harness"| P_email(["verify-email-flow-harness"])
B5A -->|"Crumb extraction (raw)"| P_crumbx(["crumb-extraction-harness"])
B5A -->|"Crumb → flashcards"| P_crumbf(["crumb-flashcard-extractor"])
B5A -->|"RAG: rewrite query"| P_rqr(["rag-query-rewriter"])
B5A -->|"RAG: rerank chunks"| P_rcr(["rag-chunk-reranker"])
B5A -->|"RAG: synthesize context"| P_rcs(["rag-context-synthesizer"])
B5A -->|"RAG: validate evidence"| P_rev(["rag-evidence-validator"])
B5A -->|"Call fleet MCP tools
via PEBBLE gateway"| P_pebble(["pebble-tools"])
%% 5c — Content/Downlink publishing sub-branch
B5C -->|"Declare the org's
content arc/manifest"| P_carc(["content-arc-declare"])
B5C -->|"Gate A: intake a closed
decision into abacus"| P_cintake(["content-decision-intake"])
B5C -->|"Draft a downlink
blog entry"| P_dentry(["downlink-entry-author"])
B5C -->|"Project abacus → landing,
or check drift"| P_dpub(["downlink-publish"])
B5C -->|"Generalize publish to
any org's own surface"| P_cpub(["content-publish-sink"])
B5C -->|"Repurpose a shipped entry
into a social artefact"| P_drepurp(["downlink-social-repurposer"])
B5C -->|"Gate D: dispatch the
social artefact — the only
prompt that actually posts"| P_csocial(["content-social-dispatch"])
P_carc --> P_cintake --> P_dentry --> P_dpub
P_dpub --> P_drepurp --> P_csocial
P_cpub -.->|"generalizes"| P_dpub
%% 5d — Fleet-ops sub-branch
B5F -->|"Roll out install.sh
across tenant roots"| P_frollout(["fleet-host-rollout"])
B5F -->|"Triage an ingest ticket
on a shared fleet host"| P_ftriage(["fleet-ingest-triage"])
%% ───── 6. STUCK / DIAGNOSE ─────
B6{{"What kind of stuck?"}}
B6 -->|"A run failed"| P_ft(["petrova-failure-triage"])
B6 -->|"Work is sitting idle"| P_stall(["petrova-stalled-work"])
B6 -->|"Feels harder than it should"| P_fric(["petrova-friction-classify"])
B6 -->|"Capture a one-off observation"| P_find(["petrova-finding"])
B6 -->|"Suspect drift between repos"| P_drift(["petrova-drift-check"])
B6 -->|"Suspect a boundary violation"| P_bnd(["petrova-boundary-audit"])
B6 -->|"Old decision still binding?"| P_sup(["petrova-supersession-check"])
B6 -->|"Upstream dep changed?"| P_up(["petrova-upstream-watch"])
B6 -->|"Wire a contract-drift detector"| P_wcd(["petrova-wire-contract-drift"])
B6 -->|"Soak an invariant under load"| P_inv(["petrova-invariant-soak"])
B6 -->|"Suspect a dev-mode
auth fail-open"| P_authaudit(["auth-fail-open-audit"])
%% loops back: triage → fix → execute
P_ft -.->|"propose a fix"| P_fix
%% ───── 7. VERIFYING / CLOSING ─────
B7{{"What are you verifying?"}}
B7 -->|"A single task's AC"| P_tac(["task-acceptance-check"])
B7 -->|"A full verification round"| P_vr(["petrova-verify-round"])
B7 -->|"A merge request is green"| P_mr(["petrova-mr-check"])
B7 -->|"Need human review"| P_rr(["petrova-request-review"])
B7 -->|"Auto-merge when CI passes"| P_rmw(["petrova-request-merge-when-green"])
B7 -->|"Write up after-the-fact"| P_pm(["petrova-post-mortem"])
B7 -->|"Close the governance phase"| P_pclose(["petrova-phase-close"])
B7 -->|"Is this green signal
even real?"| P_vfr(["verify-for-real"])
%% lessons from a post-mortem usually become a new decision
P_pm -.->|"often spawns"| P_dec
%% lifecycle loop: closing a phase opens the next orientation cycle
P_pclose -.->|"new cycle"| B2
P_popen -.->|"phase active"| B5
%% ───── style ─────
classDef root fill:#1f2937,color:#fff,stroke:#111,stroke-width:2px;
classDef branch fill:#fef3c7,stroke:#92400e,color:#111;
classDef prompt fill:#ecfdf5,stroke:#065f46,color:#064e3b;
classDef meta fill:#ede9fe,stroke:#5b21b6,color:#3b0764;
class R,B1,B2,B3,B4,B5,B5W,B5A,B5C,B5F,B6,B7 branch;
class B0 branch;
class R root;
class P_eonboard,P_enext,P_eflow,P_etick,P_ecycle,P_erecover,P_ecli,P_ehealth,P_ebaseline,P_eask,P_eproject meta;
class P_onboard,P_boot,P_install,P_handoff,P_snap,P_health,P_doc,P_gov,P_chg,P_fresh,P_arch,P_dec,P_adr,P_base,P_ns,P_plan,P_bundle,P_mpg,P_ms,P_dag,P_popen,P_orch,P_dagx,P_ref,P_auto,P_fix,P_wa,P_wc,P_we,P_wr,P_wt,P_wcd,P_wi,P_mcpw,P_ihg,P_ihe,P_hsg,P_brand,P_email,P_crumbx,P_crumbf,P_rqr,P_rcr,P_rcs,P_rev,P_pebble,P_carc,P_cintake,P_dentry,P_dpub,P_cpub,P_drepurp,P_csocial,P_frollout,P_ftriage,P_ft,P_stall,P_fric,P_find,P_drift,P_bnd,P_sup,P_up,P_inv,P_authaudit,P_pm,P_tac,P_vr,P_mr,P_rr,P_rmw,P_pclose,P_vfr prompt;
qa-adversary excluded (stub, no meta.yml/prompt.xml) · source of truth: docs/eva-decision-tree.md ↗