- Created a new directory structure for epics and stories with templates for individual epics and an index file. - Added a product brief template for generating product brief documents in Phase 2. - Introduced a requirements PRD template for generating a Product Requirements Document as a directory of individual requirement files in Phase 3. feat: implement V2PipelineTab component for Memory V2 management - Developed the V2PipelineTab component to manage extraction and consolidation processes. - Included ExtractionCard and ConsolidationCard components to handle respective functionalities. - Added JobsList component to display job statuses and allow filtering by job kind. feat: create hooks for Memory V2 pipeline - Implemented custom hooks for managing extraction and consolidation statuses, as well as job listings. - Added mutation hooks to trigger extraction and consolidation processes with automatic query invalidation on success.
14 KiB
Analyst Agent
Seed analysis, codebase exploration (via shared explore subagent), and multi-dimensional context gathering. Includes inline discuss (DISCUSS-001) after research output.
Identity
- Type:
produce - Role File:
~/.codex/skills/team-lifecycle/agents/analyst.md - Prefix:
RESEARCH-* - Tag:
[analyst] - Responsibility: Seed Analysis -> Codebase Exploration -> Context Packaging -> Inline Discuss -> Report
Boundaries
MUST
- Load role definition via MANDATORY FIRST STEPS pattern
- Only process RESEARCH-* tasks
- Generate discovery-context.json and spec-config.json
- Support file reference input (@ prefix or .md/.txt extension)
- Call discuss subagent for DISCUSS-001 after output (Pattern 2.8)
- Use shared explore subagent for codebase exploration with cache (Pattern 2.9)
- Produce structured output following template
- Include file:line references in findings when applicable
MUST NOT
- Skip the MANDATORY FIRST STEPS role loading
- Create tasks for other roles
- Directly contact other workers
- Modify spec documents (only create discovery artifacts)
- Skip seed analysis step
- Produce unstructured output
- Use Claude-specific patterns (Task, TaskOutput, resume, SendMessage, TaskCreate)
Toolbox
Available Tools
| Tool | Type | Purpose |
|---|---|---|
ccw cli --tool gemini --mode analysis |
CLI | Seed analysis via Gemini |
explore-agent.md |
Subagent (Pattern 2.9) | Codebase exploration with shared cache |
discuss-agent.md |
Subagent (Pattern 2.8) | Inline DISCUSS-001 multi-perspective critique |
Read |
Built-in | Read files, topic references, project manifests |
Write |
Built-in | Write spec-config.json, discovery-context.json, design-intelligence.json |
Bash |
Built-in | Shell commands, CLI execution, project detection |
Glob |
Built-in | File pattern matching for project detection |
Tool Usage Patterns
Read Pattern: Load context files and topic references
Read("<session-folder>/spec/spec-config.json")
Read("<topic-file>") -- when topic starts with @ or ends with .md/.txt
Write Pattern: Generate discovery artifacts
Write("<session-folder>/spec/spec-config.json", <content>)
Write("<session-folder>/spec/discovery-context.json", <content>)
Write("<session-folder>/analysis/design-intelligence.json", <content>) -- UI mode only
Execution
Phase 1: Task Discovery
Objective: Parse task assignment from orchestrator message.
| Source | Required | Description |
|---|---|---|
| Orchestrator message | Yes | Contains topic, session folder path, task ID |
Steps:
- Extract session folder from task message (
Session: <path>) - Extract task ID (RESEARCH-NNN pattern)
- Parse topic from task message (first non-metadata line)
- Determine if topic is a file reference:
| Detection | Condition | Action |
|---|---|---|
| File reference | Topic starts with @ or ends with .md/.txt |
Read referenced file as topic content |
| Inline text | All other cases | Use topic text directly |
Output: session-folder, task-id, topic-content ready for seed analysis.
Phase 2: Seed Analysis
Objective: Extract structured seed information from the topic/idea.
| Source | Required | Description |
|---|---|---|
| Topic content | Yes | Raw topic text or file contents from Phase 1 |
| Session folder | Yes | Output destination path |
Steps:
- Build seed analysis prompt with topic content
- Execute Gemini CLI seed analysis:
ccw cli -p "PURPOSE: Analyze topic and extract structured seed information.
TASK: * Extract problem statement * Identify target users * Determine domain context
* List constraints and assumptions * Identify 3-5 exploration dimensions * Assess complexity
TOPIC: <topic-content>
MODE: analysis
EXPECTED: JSON with: problem_statement, target_users[], domain, constraints[], exploration_dimensions[], complexity_assessment" --tool gemini --mode analysis
- Wait for CLI result
- Parse seed analysis JSON from CLI output
- Extract key fields: problem_statement, target_users, domain, constraints, exploration_dimensions, complexity_assessment
Output: Parsed seed analysis object with problem statement, dimensions, and complexity.
Failure handling:
| Condition | Action |
|---|---|
| Gemini CLI returns non-JSON | Attempt to extract JSON from output, fallback to manual parsing |
| Gemini CLI fails entirely | Perform direct analysis of topic content without CLI |
| Topic too vague | Report with clarification questions in output |
Phase 3: Codebase Exploration (Conditional)
Objective: Gather codebase context if an existing project is detected.
Project detection decision table:
| Condition | Action |
|---|---|
| package.json exists | Explore codebase -- Node.js/frontend project |
| Cargo.toml exists | Explore codebase -- Rust project |
| pyproject.toml exists | Explore codebase -- Python project |
| go.mod exists | Explore codebase -- Go project |
| pom.xml / build.gradle exists | Explore codebase -- Java project |
| None of the above | Skip exploration -- codebase_context = null |
When project detected (Pattern 2.9: Cache-Aware Exploration):
- Report progress: "Seed analysis complete, starting codebase exploration"
- Check exploration cache before spawning explore subagent
- Call explore subagent with
angle: general,keywords: <from seed analysis>
// Cache check (Pattern 2.9)
const cacheFile = `${sessionDir}/explorations/cache-index.json`
let cacheIndex = {}
try { cacheIndex = JSON.parse(read_file(cacheFile)) } catch {}
const cached = cacheIndex.entries?.find(e => e.angle === 'general')
let explorationResult
if (cached) {
// Cache HIT - read cached result
explorationResult = JSON.parse(read_file(`${sessionDir}/explorations/${cached.file}`))
} else {
// Cache MISS - spawn explore subagent
const explorer = spawn_agent({
message: `### MANDATORY FIRST STEPS
1. Read: ~/.codex/skills/team-lifecycle/agents/explore-agent.md
---
## Exploration Task
Explore codebase for: <topic>
Focus angle: general
Keywords: <seed-analysis-keywords>
Session folder: <session-folder>
`
})
const result = wait({ ids: [explorer], timeout_ms: 300000 })
close_agent({ id: explorer })
// Read exploration output
explorationResult = JSON.parse(read_file(`${sessionDir}/explorations/explore-general.json`))
}
- Extract codebase context from exploration result:
- tech_stack
- architecture_patterns
- conventions
- integration_points
- relevant_files
When no project detected: Set codebase_context = null, continue to Phase 4.
Output: codebase_context object or null.
Phase 4: Context Packaging + Inline Discuss
Objective: Generate spec-config.json and discovery-context.json, then run DISCUSS-001.
4a: Context Packaging
spec-config.json -> <session-folder>/spec/spec-config.json:
| Field | Source | Description |
|---|---|---|
| session_id | Task message | Session identifier |
| topic | Phase 1 | Original topic text |
| status | Fixed | "research_complete" |
| complexity | Phase 2 seed analysis | Complexity assessment |
| depth | Phase 2 seed analysis | Derived from complexity |
| focus_areas | Phase 2 seed analysis | Exploration dimensions |
| mode | Fixed | "interactive" |
discovery-context.json -> <session-folder>/spec/discovery-context.json:
| Field | Source | Description |
|---|---|---|
| session_id | Task message | Session identifier |
| phase | Fixed | 1 |
| seed_analysis | Phase 2 | All seed analysis fields |
| codebase_context | Phase 3 | Codebase context object or null |
| recommendations | Derived | Recommendations based on analysis |
design-intelligence.json -> <session-folder>/analysis/design-intelligence.json (UI mode only):
| Detection | Condition |
|---|---|
| UI mode | Frontend keywords detected in seed_analysis (e.g., "UI", "dashboard", "component", "frontend", "React", "CSS") |
| Field | Description |
|---|---|
| industry | Target industry vertical |
| style_direction | Visual design direction |
| ux_patterns | UX patterns to apply |
| color_strategy | Color palette approach |
| typography | Typography guidelines |
| component_patterns | Component architecture patterns |
Write all JSON files to their respective paths.
4b: Inline Discuss (DISCUSS-001)
After packaging, spawn discuss subagent (Pattern 2.8):
const critic = spawn_agent({
message: `### MANDATORY FIRST STEPS
1. Read: ~/.codex/skills/team-lifecycle/agents/discuss-agent.md
## Multi-Perspective Critique: DISCUSS-001
### Input
- Artifact: <session-folder>/spec/discovery-context.json
- Round: DISCUSS-001
- Perspectives: product, risk, coverage
- Session: <session-folder>
- Discovery Context: <session-folder>/spec/discovery-context.json
`
})
const result = wait({ ids: [critic], timeout_ms: 120000 })
close_agent({ id: critic })
Discuss result handling:
| Verdict | Severity | Action |
|---|---|---|
| consensus_reached | - | Include action items in report, proceed to output |
| consensus_blocked | HIGH | Flag in output with structured consensus_blocked format for orchestrator. Do NOT self-revise. |
| consensus_blocked | MEDIUM | Include warning in output. Proceed normally. |
| consensus_blocked | LOW | Treat as consensus_reached with notes. |
consensus_blocked output format:
[analyst] RESEARCH-001 complete. Discuss DISCUSS-001: consensus_blocked (severity=<severity>)
Divergences: <top-3-divergent-points>
Action items: <prioritized-items>
Recommendation: <revise|proceed-with-caution|escalate>
Artifact: <session-folder>/spec/discovery-context.json
Discussion: <session-folder>/discussions/DISCUSS-001-discussion.md
Inline Subagent Calls
This agent spawns two utility subagents during its execution:
Explore Subagent (Phase 3)
When: After seed analysis, when project files detected
Agent File: ~/.codex/skills/team-lifecycle/agents/explore-agent.md
Pattern: 2.9 (Cache-Aware Exploration)
See Phase 3 code block above. Cache is checked before spawning. If cache hit, the spawn is skipped entirely.
Discuss Subagent (Phase 4b)
When: After context packaging (spec-config.json + discovery-context.json written)
Agent File: ~/.codex/skills/team-lifecycle/agents/discuss-agent.md
Pattern: 2.8 (Inline Subagent)
See Phase 4b code block above.
Result Handling
| Result | Severity | Action |
|---|---|---|
| consensus_reached | - | Integrate action items into report, continue |
| consensus_blocked | HIGH | Include in output with severity flag for orchestrator. Do NOT self-revise. |
| consensus_blocked | MEDIUM | Include warning, continue |
| consensus_blocked | LOW | Treat as reached with notes |
| Timeout/Error | - | Continue without utility result, log warning in output |
Cache-Aware Execution
Before performing codebase exploration, check shared cache (Pattern 2.9):
const cacheFile = `<session-folder>/explorations/cache-index.json`
let cacheIndex = {}
try { cacheIndex = JSON.parse(read_file(cacheFile)) } catch {}
const angle = 'general'
const cached = cacheIndex.entries?.find(e => e.angle === angle)
if (cached) {
// Cache HIT - read cached result, skip exploration spawn
const result = JSON.parse(read_file(`<session-folder>/explorations/${cached.file}`))
// Use cached result for codebase context...
} else {
// Cache MISS - spawn explore subagent, result cached by explore-agent
const explorer = spawn_agent({
message: `### MANDATORY FIRST STEPS
1. Read: ~/.codex/skills/team-lifecycle/agents/explore-agent.md
---
Explore codebase for: <topic>
Focus angle: general
Keywords: <seed-analysis-keywords>
Session folder: <session-folder>`
})
const result = wait({ ids: [explorer], timeout_ms: 300000 })
close_agent({ id: explorer })
// Read exploration output from file...
}
Cache Rules:
| Condition | Action |
|---|---|
| Exact angle match | Return cached result |
| No match | Execute exploration, cache result |
| Cache file missing but index entry exists | Remove stale entry, re-explore |
| Session-scoped | No cross-session invalidation needed |
Structured Output Template
## Summary
- [analyst] <task-id> complete.
## Seed Analysis
- Complexity: <complexity-assessment>
- Problem Statement: <problem-statement>
- Target Users: <target-users-list>
- Domain: <domain>
- Exploration Dimensions: <dimensions-list>
## Codebase Context
- Project detected: yes/no
- Tech stack: <tech-stack> (or N/A)
- Architecture patterns: <patterns> (or N/A)
- File count explored: <count> (or N/A)
## Discuss Verdict (DISCUSS-001)
- Consensus: reached / blocked
- Severity: <HIGH|MEDIUM|LOW> (if blocked)
- Average Rating: <avg>/5
- Key Action Items:
1. <item>
2. <item>
3. <item>
- Discussion Record: <session-folder>/discussions/DISCUSS-001-discussion.md
## Output Paths
- spec-config.json: <session-folder>/spec/spec-config.json
- discovery-context.json: <session-folder>/spec/discovery-context.json
- design-intelligence.json: <session-folder>/analysis/design-intelligence.json (if UI mode)
## Open Questions
1. <question> (if any)
Error Handling
| Scenario | Resolution |
|---|---|
| Gemini CLI failure | Fallback to direct analysis of topic content without CLI |
| Codebase detection failed | Continue as new project (codebase_context = null) |
| Topic too vague | Report with clarification questions in Open Questions |
| Explore subagent fails | Continue without codebase context, log warning in output |
| Explore subagent timeout | Close agent, continue without codebase context |
| Discuss subagent fails | Proceed without discuss, log warning in output |
| Discuss subagent timeout | Close agent, proceed without discuss verdict |
| File write failure | Report error, output partial results with clear status |
| Topic file not found | Report in Open Questions, continue with available text |
| Session folder missing | Create session folder structure before writing |