Process: Discover → Propose → Approve → Init Session → Persist Context → Delegate → Cleanup
Location: .tmp/sessions/{YYYY-MM-DD}-{task-slug}/context.md
Key Principle: ContextScout discovers paths. The orchestrator persists them into context.md AFTER approval. Downstream agents read from context.md — no re-discovery.
Only create a session when:
For simple tasks (1-3 files, direct execution): skip session creation entirely.
Stage 1: DISCOVER → ContextScout finds paths (read-only, nothing written)
Stage 2: PROPOSE → Show user lightweight summary (nothing written)
Stage 3: APPROVE → User says yes. NOW we can write.
Stage 4: INIT → Create session dir + context.md (persist discovered paths here)
Stage 5: DELEGATE → Pass session path to TaskManager / working agents
Stage 6: CLEANUP → Ask user, then delete session dir
Location: .tmp/sessions/{YYYY-MM-DD}-{task-slug}/context.md
# Task Context: {Task Name}
Session ID: {YYYY-MM-DD}-{task-slug}
Created: {ISO timestamp}
Status: in_progress
## Current Request
{What user asked for — verbatim or close paraphrase}
## Context Files (Standards to Follow)
These are the paths ContextScout discovered. Downstream agents load these for coding standards, patterns, and conventions.
- .opencode/context/core/standards/code-quality.md
- .opencode/context/core/standards/test-coverage.md
- {other paths discovered by ContextScout}
## Reference Files (Source Material to Look At)
These are project files relevant to the task — NOT standards. Downstream agents reference these to understand existing code, config, or structure.
- {e.g. package.json}
- {e.g. src/existing-module.ts}
## External Context Fetched
These are live documentation files fetched from external libraries via ExternalScout. Subagents should reference these instead of re-fetching.
- `.tmp/external-context/{package-name}/{topic}.md` — {description}
- `.tmp/external-context/{package-name}/{topic}.md` — {description}
**Important**: These files are read-only and cached for reference. Do not modify them.
## Components
{The functional units identified during proposal}
- {Component 1} — {what it does}
- {Component 2} — {what it does}
## Constraints
{Technical constraints, preferences, compatibility notes, version requirements}
## Exit Criteria
- [ ] {specific, measurable completion condition}
- [ ] {specific, measurable completion condition}
## Progress
- [ ] Session initialized
- [ ] Tasks created (if using TaskManager)
- [ ] Implementation complete
- [ ] Tests passing
- [ ] Handoff complete
Step 1: Discover (before approval)
Step 2: Propose (before approval)
Step 3: Approve (gate)
Step 4: Init Session (first writes, only after approval)
.tmp/sessions/{YYYY-MM-DD}-{task-slug}/context.md using the template above.## Context Files with the paths ContextScout discovered in Step 1. This is the handoff point — if you skip this, downstream agents lose the context.## Reference Files with any project source files relevant to the task.Step 5: Delegate with context path
task(
subagent_type="TaskManager", // or CoderAgent, TestEngineer, etc.
description="{brief description}",
prompt="Load context from .tmp/sessions/{session-id}/context.md
Read the context file for full requirements, standards, and constraints.
{specific instructions for this subagent}"
)
Step 6: Cleanup after completion
.tmp/sessions/{session-id}/?"When TaskManager creates subtask JSONs, it MUST follow these rules:
| Field | Contains | Example |
|---|---|---|
context_files |
Standards only — paths to coding conventions, patterns, security rules | .opencode/context/core/standards/code-quality.md |
reference_files |
Source material only — project files to look at for existing patterns | src/auth/existing-service.ts, package.json |
external_context |
External docs only — cached documentation from external libraries (read-only) | .tmp/external-context/drizzle-orm/modular-schemas.md |
Never mix them. A downstream agent reading context_files expects "rules to follow." A downstream agent reading reference_files expects "files to understand." A downstream agent reading external_context expects "cached external docs to reference" (read-only). Mixing them causes confusion about what to follow vs. what to reference vs. what to read.
| Agent | What it reads | What it does with it |
|---|---|---|
| TaskManager | context.md (full session) |
Extracts context_files + reference_files + external_context, puts them into subtask JSONs |
| CoderAgent | subtask JSON (context_files + reference_files + external_context) |
Loads standards, references source files, reads external docs, implements |
| TestEngineer | session context.md path (passed in prompt) |
Knows what standards were applied, reads external context, writes tests accordingly |
| CodeReviewer | session context.md path (passed in prompt) |
Knows what standards were applied, reviews against them, considers external context |
Key:
external_context files to understand external library patterns and requirements — this avoids re-fetching and ensures consistency.For repeated task types (e.g., "write tests", "code review", "documentation"), cache discovered context to avoid re-discovery overhead.
Cache context when:
.tmp/sessions/{session-id}/
├── context.md (main session context)
├── .cache/
│ ├── test-coverage.md (cached from .opencode/context/core/standards/test-coverage.md)
│ ├── code-quality.md (cached from .opencode/context/core/standards/code-quality.md)
│ └── code-review.md (cached from .opencode/context/core/workflows/code-review.md)
└── .manifest.json (tracks cache status)
{
"session_id": "2026-01-28-parallel-tests",
"created_at": "2026-01-28T14:30:22Z",
"cache": {
"test-coverage.md": {
"source": ".opencode/context/core/standards/test-coverage.md",
"cached_at": "2026-01-28T14:30:25Z",
"used_by": ["subtask_01", "subtask_02", "subtask_03"],
"status": "valid"
},
"code-quality.md": {
"source": ".opencode/context/core/standards/code-quality.md",
"cached_at": "2026-01-28T14:30:26Z",
"used_by": ["subtask_01", "subtask_02"],
"status": "valid"
}
}
}
Cache is INVALID when:
Cache is VALID when:
Step 1: Check Cache
// Before delegating to subagent
IF cache exists AND cache is valid:
USE cached context file
SKIP re-reading from .opencode/context/
ELSE:
READ from .opencode/context/
CACHE the file
Step 2: Cache Hit Example
Session: 2026-01-28-parallel-tests
Task 1: Write component A
→ Load test-coverage.md (CACHE MISS)
→ Cache it at .tmp/sessions/.../cache/test-coverage.md
Task 2: Write component B
→ Load test-coverage.md (CACHE HIT)
→ Use cached version (faster)
Task 3: Write tests
→ Load test-coverage.md (CACHE HIT)
→ Use cached version (faster)
Step 3: Cache Miss Example
Session: 2026-01-28-parallel-tests
Task 1: Write code
→ Load code-quality.md (CACHE MISS)
→ Cache it
Task 2: Code review
→ Load code-review.md (CACHE MISS)
→ Cache it
Task 3: Write more code
→ Load code-quality.md (CACHE HIT)
→ Use cached version
// Session initialization
session_id = "2026-01-28-parallel-tests"
context_cache = {}
// Task 1: Write component A (parallel)
task(
subagent_type="CoderAgent",
description="Write component A",
prompt="Load context from .tmp/sessions/{session_id}/context.md
Use cached context if available at .tmp/sessions/{session_id}/.cache/"
)
// Task 2: Write component B (parallel)
task(
subagent_type="CoderAgent",
description="Write component B",
prompt="Load context from .tmp/sessions/{session_id}/context.md
Use cached context if available at .tmp/sessions/{session_id}/.cache/"
)
// Task 3: Write tests (depends on 1+2)
task(
subagent_type="TestEngineer",
description="Write tests",
prompt="Load context from .tmp/sessions/{session_id}/context.md
Use cached context if available at .tmp/sessions/{session_id}/.cache/"
)
// Result: Tasks 1 & 2 cache context, Task 3 uses cache (faster)
Track cache effectiveness:
{
"cache_stats": {
"total_reads": 15,
"cache_hits": 9,
"cache_misses": 6,
"hit_rate": "60%",
"time_saved": "2.3 seconds"
}
}
✅ Do:
❌ Don't: