7.7 KiB
Context Handoff in Orquestra
Orquestra keeps agents focused by making context explicit. Agents do not pass a whole chat history to the next agent. They pass durable artifacts on disk, and each new stage reads only the files declared for that stage.
Quick path
- The current agent writes its result to
work/artifacts/<feature_id>/. - From the active Pi session,
/orquestra-stage <stage> [feature_id]callsscripts/run_stage.py. run_stage.pystarts a fresh Pi process.- The new agent receives only the
inputpaths declared inharness/workflow.stages.yml. - The new agent writes its own output artifact.
scripts/agent_status.pyandscripts/verify.shenforce stage order and gates.- When the
closestage completes,scripts/close_feature.py <feature_id>runs automatically to validate gates, update the backlog, commit and push if a remote repo is configured.
Mental model
Agent A
reads its stage inputs
writes one durable artifact
│
▼
work/artifacts/F-001/agent-a-output
│
▼
run_stage.py starts a fresh Pi process
│
▼
Agent B
reads only declared inputs, including Agent A's artifact if relevant
writes its own artifact
The agents “talk” through files, not through memory-heavy chat context.
Why fresh processes matter
A single long Pi session naturally accumulates chat, tool output, false starts, and old assumptions. That causes two problems:
| Problem | Orquestra answer |
|---|---|
| The next agent gets distracted by old context | Start the next stage with --no-session --no-context-files |
| Token usage grows until compaction | Each stage starts with a small prompt and declared files |
| Claims become hard to verify | Only artifacts on disk count as handoff evidence |
| Agents can skip gates in chat | agent_status.py validates stage owner and prerequisites |
What a stage receives
Each stage receives three kinds of context:
-
Harness rules — always read first.
AGENTS.mdharness/agents.matrix.ymlharness/workflow.stages.ymlharness/contracts/handoff.md
-
Declared stage inputs — from
harness/workflow.stages.yml. -
Selected Engram memory — only when the agent performs a narrow search for a concrete need.
The full previous chat is not valid input.
Example: design to build
architect receives product/spec context:
- name: design
owner: architect
input:
- work/current.md
- spec/product.md
- spec/tech.md
- spec/acceptance.md
output:
- work/artifacts/<feature_id>/architect.md
It writes:
work/artifacts/F-001/architect.md
Then implementer starts fresh from the active Pi session:
/orquestra-stage build F-001
Equivalent shell form:
python3 scripts/run_stage.py build --feature-id F-001
The generated prompt gives it only:
- name: build
owner: implementer
input:
- work/current.md
- spec/product.md
- spec/tech.md
- spec/acceptance.md
- work/artifacts/<feature_id>/architect.md
output:
- work/artifacts/<feature_id>/implementer.md
So the implementer knows the design result, but not the architect's full chat.
Example: build to review
The implementer writes evidence:
work/artifacts/F-001/implementer.md
A minimal implementer artifact should answer:
# Implementer Evidence
## Changed files
- project/app.py
- tests/test_app.py
## What changed
- Added ticket creation validation.
## Checks
- `python3 -m unittest discover -s tests -v` passed.
## Notes for reviewer
- Main behavior lives in `project/app.py:create_ticket`.
Then reviewer starts fresh:
/orquestra-stage review_gate F-001
Reviewer input is only:
input:
- work/current.md
- spec/acceptance.md
- work/artifacts/<feature_id>/implementer.md
Reviewer does not need the architect's whole reasoning unless the workflow explicitly declares it. If reviewer needs more, it blocks and asks for a specific artifact/path.
Example: security and QA reuse only relevant context
Security does not need all acceptance prose plus every design note. It needs the implementation evidence and review result:
- name: security_gate
owner: security
input:
- work/current.md
- work/artifacts/<feature_id>/implementer.md
- work/artifacts/<feature_id>/reviewer.json
QA needs acceptance criteria and approved gate context:
- name: qa_gate
owner: qa
input:
- work/current.md
- spec/acceptance.md
- work/artifacts/<feature_id>/implementer.md
- work/artifacts/<feature_id>/reviewer.json
- work/artifacts/<feature_id>/security.json
That is the core rule: give each agent the smallest context that lets it do its job.
Anti-cheating controls
run_stage.py
├─ starts fresh Pi process
├─ disables previous session/context files
└─ injects only declared input/output paths
agent_status.py
├─ validates stage owner
├─ requires feature_id for real stages
├─ rejects gated stages when prerequisite artifacts are missing
└─ keeps visible runtime status
orquestra-status extension
├─ blocks writes outside allowed directories: project/, tests/, work/, backlog/, spec/, harness/, scripts/, platforms/, docs/
├─ blocks product/test writes outside implementer build stage
└─ blocks product code in repository root
verify.sh
├─ validates harness structure
├─ validates backlog/runtime JSON
├─ validates Engram availability
└─ rejects done features without approved gate artifacts
Chat-only claims do not pass any gate. The agent must write evidence to disk.
Ticket lifecycle commands
Do not edit backlog/features.json directly. Use the repository scripts:
# Create a pending ticket interactively.
python3 scripts/new_ticket.py
# Select exactly one pending ticket and promote it to in_progress.
python3 scripts/new_ticket.py --start F-048
# Repair the deprecated `review` gate key in imported/legacy tickets.
python3 scripts/new_ticket.py --normalize-gates
# After reviewer, security and QA approve, close and commit the ticket.
python3 scripts/close_feature.py F-048
--start refuses to run when another feature is already in_progress. verify.sh also rejects a runtime marked running when the matching backlog feature is still pending.
What Engram is for
Engram is durable memory for reusable facts, not a replacement for stage artifacts.
Each stage must save to Engram only when it produced durable knowledge.
Use Engram for:
- stable project decisions,
- bug fixes,
- non-obvious discoveries,
- reusable conventions or patterns,
- configuration changes,
- repeated gotchas,
- environment facts,
- lessons learned across features.
Do not use Engram for:
- replacing
implementer.md, - hiding gate evidence,
- routine progress,
- command output dumps,
- artifact summaries,
- passing huge summaries to every stage,
- bypassing declared workflow inputs.
A good Engram lookup is narrow:
Search: "orquestra project root product files rule"
Use result only if it affects this stage.
A bad lookup is broad:
Search: "everything about this project"
Updating an installed project safely
From the Orquestra source checkout:
/path/to/orquestra/scripts/install.sh /path/to/project
cd /path/to/project
./scripts/verify.sh
The installer updates harness-owned files and preserves project-owned progress files when they already exist:
backlog/features.json
spec/*
work/current.md
work/history.md
work/runtime-status.json
project/*
work/artifacts/*
That means an existing project can adopt fresh-stage handoff without losing its current feature state.