This document shows a complete orchestrator workflow using the lightweight context handoff pattern for implementing a JWT authentication system.
import { createContextIndex } from './.opencode/skill/task-management/scripts/context-index';
// Create lightweight index with initial context
const result = createContextIndex('auth-system', {
contextFiles: [
'.opencode/context/core/standards/code-quality.md',
'(example: (example: .opencode/context/security/auth-patterns.md))',
'(example: (example: .opencode/context/architecture/ddd-patterns.md))',
'(example: (example: .opencode/context/core/story-mapping/guide.md))'
],
referenceFiles: [
'src/auth/old-auth.ts',
'src/middleware/auth.middleware.ts'
]
});
// Result: .tmp/context-index/auth-system.json created
What's in the index:
{
"feature": "auth-system",
"created": "2026-02-15T10:00:00Z",
"updated": "2026-02-15T10:00:00Z",
"agents": {},
"contextFiles": [
".opencode/context/core/standards/code-quality.md",
"(example: (example: .opencode/context/security/auth-patterns.md))",
"(example: (example: .opencode/context/architecture/ddd-patterns.md))",
"(example: (example: .opencode/context/core/story-mapping/guide.md))"
],
"referenceFiles": [
"src/auth/old-auth.ts",
"src/middleware/auth.middleware.ts"
]
}
import { getContextForAgent } from './.opencode/skill/task-management/scripts/context-index';
const archContext = getContextForAgent('auth-system', 'ArchitectureAnalyzer');
// Returns:
{
feature: "auth-system",
agentType: "ArchitectureAnalyzer",
contextFiles: [
"(example: .opencode/context/architecture/ddd-patterns.md)"
],
referenceFiles: [
"src/auth/old-auth.ts",
"src/middleware/auth.middleware.ts"
],
agentOutputs: [],
metadata: {}
}
Key Point: ArchitectureAnalyzer gets ONLY:
task(
subagent_type="ArchitectureAnalyzer",
description="Analyze authentication system architecture",
prompt=`
Analyze the architecture for implementing JWT authentication.
Context files to load:
- ${archContext.contextFiles[0]}
Reference files to analyze:
- ${archContext.referenceFiles[0]}
- ${archContext.referenceFiles[1]}
Identify:
- Bounded contexts
- Module boundaries
- Integration points
Output: .tmp/architecture/auth-system/contexts.json
`
);
import { addAgentOutput } from './.opencode/skill/task-management/scripts/context-index';
// Read ArchitectureAnalyzer output
const archOutput = JSON.parse(
fs.readFileSync('.tmp/architecture/auth-system/contexts.json', 'utf-8')
);
// Update index with output path and metadata
addAgentOutput(
'auth-system',
'ArchitectureAnalyzer',
'.tmp/architecture/auth-system/contexts.json',
{
boundedContext: archOutput.primary_context, // "authentication"
module: archOutput.module_name, // "auth-service"
complexity: archOutput.complexity // "medium"
}
);
Index now contains:
{
"feature": "auth-system",
"agents": {
"ArchitectureAnalyzer": {
"outputs": [".tmp/architecture/auth-system/contexts.json"],
"metadata": {
"boundedContext": "authentication",
"module": "auth-service",
"complexity": "medium"
},
"timestamp": "2026-02-15T10:05:00Z"
}
},
...
}
const storyContext = getContextForAgent('auth-system', 'StoryMapper');
// Returns:
{
feature: "auth-system",
agentType: "StoryMapper",
contextFiles: [
"(example: .opencode/context/core/story-mapping/guide.md)"
],
referenceFiles: [],
agentOutputs: [
".tmp/architecture/auth-system/contexts.json"
],
metadata: {
boundedContext: "authentication",
module: "auth-service",
complexity: "medium"
}
}
Key Point: StoryMapper gets:
task(
subagent_type="StoryMapper",
description="Create user story map for authentication",
prompt=`
Create a user story map for JWT authentication system.
Context files to load:
- ${storyContext.contextFiles[0]}
Previous agent outputs to read:
- ${storyContext.agentOutputs[0]}
Metadata from ArchitectureAnalyzer:
- Bounded Context: ${storyContext.metadata.boundedContext}
- Module: ${storyContext.metadata.module}
Create vertical slices for:
- User login
- Token refresh
- Logout
Output: .tmp/story-maps/auth-system/map.json
`
);
const storyOutput = JSON.parse(
fs.readFileSync('.tmp/story-maps/auth-system/map.json', 'utf-8')
);
addAgentOutput(
'auth-system',
'StoryMapper',
'.tmp/story-maps/auth-system/map.json',
{
verticalSlice: storyOutput.primary_slice, // "user-login"
storyCount: storyOutput.stories.length // 8
}
);
const prioContext = getContextForAgent('auth-system', 'PrioritizationEngine');
// Returns:
{
feature: "auth-system",
agentType: "PrioritizationEngine",
contextFiles: [], // No prioritization context file in index
referenceFiles: [],
agentOutputs: [
".tmp/story-maps/auth-system/map.json"
],
metadata: {
verticalSlice: "user-login",
storyCount: 8
}
}
Key Point: PrioritizationEngine gets:
task(
subagent_type="PrioritizationEngine",
description="Prioritize authentication stories",
prompt=`
Prioritize user stories for authentication system.
Story map to read:
- ${prioContext.agentOutputs[0]}
Metadata:
- Vertical Slice: ${prioContext.metadata.verticalSlice}
- Story Count: ${prioContext.metadata.storyCount}
Calculate RICE and WSJF scores.
Assign to release slices.
Output: .tmp/planning/auth-system/prioritized.json
`
);
const prioOutput = JSON.parse(
fs.readFileSync('.tmp/planning/auth-system/prioritized.json', 'utf-8')
);
addAgentOutput(
'auth-system',
'PrioritizationEngine',
'.tmp/planning/auth-system/prioritized.json',
{
releaseSlice: prioOutput.release_slice, // "v1.0.0"
avgRiceScore: prioOutput.avg_rice_score // 6750
}
);
const taskContext = getContextForAgent('auth-system', 'TaskManager');
// Returns:
{
feature: "auth-system",
agentType: "TaskManager",
contextFiles: [
".opencode/context/core/standards/code-quality.md"
],
referenceFiles: [],
agentOutputs: [
".tmp/architecture/auth-system/contexts.json",
".tmp/story-maps/auth-system/map.json",
".tmp/planning/auth-system/prioritized.json"
],
metadata: {
ArchitectureAnalyzer: {
boundedContext: "authentication",
module: "auth-service"
},
StoryMapper: {
verticalSlice: "user-login",
storyCount: 8
},
PrioritizationEngine: {
releaseSlice: "v1.0.0",
avgRiceScore: 6750
}
}
}
Key Point: TaskManager gets:
task(
subagent_type="TaskManager",
description="Break down authentication into subtasks",
prompt=`
Create task breakdown for JWT authentication system.
Context files to load:
- ${taskContext.contextFiles[0]}
Previous agent outputs to read:
- ${taskContext.agentOutputs[0]} (Architecture)
- ${taskContext.agentOutputs[1]} (Stories)
- ${taskContext.agentOutputs[2]} (Priorities)
Metadata from previous agents:
${JSON.stringify(taskContext.metadata, null, 2)}
Create task.json and subtask_NN.json files.
Use metadata to populate enhanced fields.
Output: .tmp/tasks/auth-system/
`
);
addAgentOutput(
'auth-system',
'TaskManager',
'.tmp/tasks/auth-system/task.json',
{
subtaskCount: 5,
parallelTasks: 2
}
);
const coderContext = getContextForAgent('auth-system', 'CoderAgent');
// Returns:
{
feature: "auth-system",
agentType: "CoderAgent",
contextFiles: [
".opencode/context/core/standards/code-quality.md",
"(example: .opencode/context/security/auth-patterns.md)"
],
referenceFiles: [],
agentOutputs: [
".tmp/tasks/auth-system/task.json"
],
metadata: {}
}
Key Point: CoderAgent gets:
// Read task.json to get subtask list
const taskJson = JSON.parse(
fs.readFileSync('.tmp/tasks/auth-system/task.json', 'utf-8')
);
// For each subtask
for (let seq = 1; seq <= taskJson.subtask_count; seq++) {
const subtaskPath = `.tmp/tasks/auth-system/subtask_${seq.toString().padStart(2, '0')}.json`;
task(
subagent_type="CoderAgent",
description=`Implement subtask ${seq}`,
prompt=`
Implement the subtask defined in: ${subtaskPath}
Context files to load:
${coderContext.contextFiles.map(f => `- ${f}`).join('\n')}
Follow acceptance criteria exactly.
Run self-review before completion.
`
);
}
Context Files: 1 (architecture patterns)
Reference Files: 2 (existing code)
Agent Outputs: 0
Total Files to Read: 3
Context Files: 1 (story mapping guide)
Reference Files: 0
Agent Outputs: 1 (ArchitectureAnalyzer)
Total Files to Read: 2
Context Files: 0
Reference Files: 0
Agent Outputs: 1 (StoryMapper)
Total Files to Read: 1
Context Files: 1 (code quality standards)
Reference Files: 0
Agent Outputs: 3 (all previous agents)
Total Files to Read: 4
Context Files: 2 (code quality + security)
Reference Files: 0
Agent Outputs: 1 (TaskManager - subtask JSON)
Total Files to Read: 3
Every agent receives:
- Full session context.md (500+ lines)
- All context files (10+ files)
- All reference files
- All previous agent outputs
- Full decision history
- Full progress tracking
Total: 15+ files, 5000+ lines per agent
Each agent receives:
ArchitectureAnalyzer: 3 files
StoryMapper: 2 files
PrioritizationEngine: 1 file
TaskManager: 4 files
CoderAgent: 3 files
Average: 2.6 files per agent
Reduction: ~83% fewer files per agent
Each agent reads only what it needs, nothing more.
Orchestrator just passes file paths, not content.
Agent outputs are explicitly tracked and passed.
Index stays small (~200 lines JSON) even with 5 agents.
Adding more agents doesn't bloat the index.
Easy to trace: "Which agent produced this file?"
import {
createContextIndex,
addAgentOutput,
getContextForAgent
} from './.opencode/skill/task-management/scripts/context-index';
// 1. Initialize
createContextIndex(feature, { contextFiles, referenceFiles });
// 2. For each agent in pipeline
const agentTypes = [
'ArchitectureAnalyzer',
'StoryMapper',
'PrioritizationEngine',
'TaskManager',
'CoderAgent'
];
for (const agentType of agentTypes) {
// Get minimal context
const context = getContextForAgent(feature, agentType);
// Delegate with minimal context
const result = task(
subagent_type=agentType,
description=`Execute ${agentType} for ${feature}`,
prompt=`
Context files: ${context.contextFiles.join(', ')}
Previous outputs: ${context.agentOutputs.join(', ')}
Metadata: ${JSON.stringify(context.metadata)}
Your task: ...
`
);
// Update index with output
addAgentOutput(feature, agentType, outputPath, metadata);
}
✅ Use Lightweight Context Index when:
❌ Don't use when:
Alternative: Use session-context-manager.ts for human-readable tracking alongside context-index for agent coordination.