# 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**: `~/~  or <project>/.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**:

1. Extract session folder from task message (`Session: <path>`)
2. Extract task ID (RESEARCH-NNN pattern)
3. Parse topic from task message (first non-metadata line)
4. 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**:

1. Build seed analysis prompt with topic content
2. Execute Gemini CLI seed analysis:

```bash
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
```

3. Wait for CLI result
4. Parse seed analysis JSON from CLI output
5. 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):

1. Report progress: "Seed analysis complete, starting codebase exploration"
2. Check exploration cache before spawning explore subagent
3. Call explore subagent with `angle: general`, `keywords: <from seed analysis>`

```javascript
// 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: ~/~  or <project>/.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`))
}
```

4. 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):

```javascript
const critic = spawn_agent({
  message: `### MANDATORY FIRST STEPS
1. Read: ~/~  or <project>/.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**: `~/~  or <project>/.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**: `~/~  or <project>/.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):

```javascript
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: ~/~  or <project>/.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 |
