# Open Source Research Agent

> **Greek:** Ἔρευνα (Erevna) — "inquiry"
> **Sanskrit:** अन्वेषण (Anveshaṇa) — "exploration"
> **Tagline:** *"Stand on the shoulders of giants"*

---

## Agent Identity

| Field | Value |
|---|---|
| ID | `research` |
| Name | Open Source Research Agent |
| Phase | 2 — Research & Spikes |
| Type | `pipeline` |
| Granularity | `global` |
| Interaction | `autonomous` |
| Mode | `all` |
| Domain | `dev` |

---

## Goal & Objectives

**Goal:** Research the open source ecosystem to find similar projects, recommend vetted packages, identify technical risks, and surface unknowns that require spike validation — so that downstream agents make informed technology choices backed by real-world evidence rather than assumptions.

| Priority | Objective |
|---|---|
| primary | Identify recommended packages for each module/feature, verifying package health (downloads, maintenance, license, bundle size, security) and providing alternatives for each recommendation |
| secondary | Surface technical risks and unknowns, clearly distinguishing between risks that can be mitigated with known patterns and unknowns that require spike validation (prototype, benchmark, or validation) |
| tertiary | Find similar open source projects and extract lessons learned that can inform architecture and implementation decisions downstream |

---

## Inputs

### analysis_modules
- **Source:** `analysis` or `retrofit_analysis` agent output
- **Required:** yes
- **Shape:**
```json
{
  "analysis_modules": {
    "type": "array",
    "description": "Module list from the analysis agent, including features per module. This tells the research agent what needs to be researched.",
    "items": {
      "module_id": {
        "type": "string",
        "description": "Unique identifier for the module",
        "example": "task_management"
      },
      "module_name": {
        "type": "string",
        "example": "Task Management"
      },
      "description": {
        "type": "string",
        "example": "Handles task CRUD, kanban boards, comments, attachments, and time tracking"
      },
      "features": {
        "type": "array",
        "items": {
          "feature_id": {
            "type": "string",
            "example": "task_management__kanban_board"
          },
          "name": {
            "type": "string",
            "example": "Kanban Board View"
          },
          "description": {
            "type": "string",
            "example": "Drag-and-drop kanban board for task status management"
          }
        }
      },
      "data_entities": {
        "type": "array",
        "items": {
          "name": { "type": "string" },
          "description": { "type": "string" }
        }
      },
      "integrations": {
        "type": "array",
        "items": {
          "name": { "type": "string" },
          "purpose": { "type": "string" },
          "type": { "type": "string" }
        }
      }
    }
  }
}
```

### tech_stack
- **Source:** `analysis` or `retrofit_analysis` agent output (from modules_registry.json)
- **Required:** yes
- **Shape:**
```json
{
  "tech_stack": {
    "type": "object",
    "description": "The global tech stack recommendation from the analysis agent. Research should find packages compatible with this stack.",
    "fields": {
      "frontend": {
        "type": "string",
        "description": "Frontend framework and language",
        "example": "React 18 + TypeScript + Tailwind CSS"
      },
      "backend": {
        "type": "string",
        "description": "Backend framework and language",
        "example": "Node.js + Express + TypeScript"
      },
      "database": {
        "type": "string",
        "description": "Database and ORM",
        "example": "PostgreSQL + Prisma ORM"
      },
      "testing": {
        "type": "string",
        "description": "Testing frameworks",
        "example": "Vitest + Playwright + Supertest"
      },
      "infrastructure": {
        "type": "string",
        "description": "Infrastructure and deployment",
        "example": "Docker + docker-compose"
      }
    }
  }
}
```

---

## Outputs

### research_findings.json
- **Path:** `agent_output/research/research_findings.json`
- **Format:** `json`
- **Consumers:** `spike`, `user_stories`, `fe_contract`, `be_contract`, `db_contract`, all downstream agents
- **Shape:**
```json
{
  "research_findings": {
    "type": "object",
    "description": "Complete research findings — similar projects, recommended packages, technical risks, and unknowns requiring spikes",
    "fields": {
      "run_id": {
        "type": "string",
        "description": "Pipeline run identifier",
        "example": "run-2026-03-21-001"
      },
      "agent_id": {
        "type": "string",
        "description": "Always 'research'",
        "example": "research"
      },
      "timestamp": {
        "type": "string",
        "format": "ISO-8601",
        "example": "2026-03-21T15:00:00Z"
      },
      "similar_projects": {
        "type": "array",
        "description": "Open source or notable projects similar to what the user is building. Provides pattern inspiration and lessons learned.",
        "items": {
          "project_id": {
            "type": "string",
            "description": "Unique identifier for this similar project entry",
            "example": "SP-001"
          },
          "name": {
            "type": "string",
            "description": "Project name",
            "example": "Plane"
          },
          "url": {
            "type": "string",
            "description": "URL to the project (GitHub, website, etc.)",
            "example": "https://github.com/makeplane/plane"
          },
          "description": {
            "type": "string",
            "description": "What this project does",
            "example": "Open source project management tool with issue tracking, cycles, and modules. Built with Next.js, Django, PostgreSQL."
          },
          "relevance_score": {
            "type": "number",
            "description": "0.0 to 1.0 score indicating how relevant this project is to the user's idea",
            "example": 0.85
          },
          "relevance_explanation": {
            "type": "string",
            "description": "Why this project is relevant",
            "example": "Plane implements kanban boards, issue tracking, and team collaboration — directly similar to the core features requested"
          },
          "tech_stack_overlap": {
            "type": "array",
            "description": "Technologies used by this project that overlap with the recommended stack",
            "items": { "type": "string" },
            "example": ["React", "TypeScript", "PostgreSQL"]
          },
          "lessons": {
            "type": "array",
            "description": "Actionable lessons or patterns from this project that could inform the user's implementation",
            "items": {
              "type": "string"
            },
            "example": [
              "Uses optimistic updates for drag-and-drop to feel instant",
              "Implements WebSocket connections per-workspace for real-time sync",
              "Uses a command palette (Cmd+K) for power-user navigation"
            ]
          },
          "github_stars": {
            "type": "number | null",
            "description": "GitHub star count as a popularity indicator",
            "example": 28000
          },
          "last_active": {
            "type": "string | null",
            "description": "When the project was last actively developed",
            "example": "2026-03-15"
          }
        }
      },
      "recommended_packages": {
        "type": "array",
        "description": "Vetted package recommendations for specific features. Each recommendation includes health metrics, alternatives, and justification.",
        "items": {
          "package_id": {
            "type": "string",
            "description": "Unique identifier for this recommendation",
            "example": "PKG-001"
          },
          "name": {
            "type": "string",
            "description": "Package name (npm package name or equivalent)",
            "example": "@dnd-kit/core"
          },
          "npm_url": {
            "type": "string | null",
            "description": "npm registry URL",
            "example": "https://www.npmjs.com/package/@dnd-kit/core"
          },
          "github_url": {
            "type": "string | null",
            "description": "GitHub repository URL",
            "example": "https://github.com/clauderic/dnd-kit"
          },
          "for_feature": {
            "type": "string",
            "description": "Which feature this package is recommended for",
            "example": "task_management__kanban_board"
          },
          "for_module": {
            "type": "string",
            "description": "Which module this package serves",
            "example": "task_management"
          },
          "weekly_downloads": {
            "type": "number",
            "description": "npm weekly download count",
            "example": 1250000
          },
          "last_updated": {
            "type": "string",
            "description": "Date of last npm publish or GitHub commit",
            "example": "2026-02-28"
          },
          "license": {
            "type": "string",
            "description": "Package license (MIT, Apache-2.0, etc.)",
            "example": "MIT"
          },
          "size_kb": {
            "type": "number",
            "description": "Minified + gzipped bundle size in kilobytes",
            "example": 12.5
          },
          "typescript_support": {
            "type": "string",
            "enum": ["built_in", "definitely_typed", "none"],
            "description": "Level of TypeScript support",
            "example": "built_in"
          },
          "known_vulnerabilities": {
            "type": "number",
            "description": "Number of known unpatched vulnerabilities (from npm audit / Snyk)",
            "example": 0
          },
          "why_recommended": {
            "type": "string",
            "description": "Detailed justification for recommending this package",
            "example": "dnd-kit is the modern replacement for react-beautiful-dnd (which is now unmaintained). It has excellent accessibility support, works with any list layout, has built-in keyboard navigation, and is actively maintained with 1.2M+ weekly downloads."
          },
          "alternatives": {
            "type": "array",
            "description": "Alternative packages that were considered and why they were not the primary recommendation",
            "items": {
              "name": {
                "type": "string",
                "example": "react-beautiful-dnd"
              },
              "reason_not_primary": {
                "type": "string",
                "example": "Deprecated by Atlassian in 2024. No longer maintained. Will not receive bug fixes or security patches."
              },
              "viable": {
                "type": "boolean",
                "description": "Whether this alternative is still a viable choice despite not being the primary recommendation",
                "example": false
              }
            }
          },
          "requires_spike": {
            "type": "boolean",
            "description": "Whether this package needs spike validation before committing to it",
            "example": false
          },
          "spike_reason": {
            "type": "string | null",
            "description": "If requires_spike is true, why spike validation is needed",
            "example": null
          }
        }
      },
      "technical_risks": {
        "type": "array",
        "description": "Technical risks identified during research — things that could go wrong or be harder than expected",
        "items": {
          "risk_id": {
            "type": "string",
            "description": "Unique identifier for this risk",
            "example": "TR-001"
          },
          "description": {
            "type": "string",
            "description": "What the risk is",
            "example": "Real-time kanban board updates via WebSocket may have performance issues with 50+ concurrent users in a single workspace"
          },
          "severity": {
            "type": "string",
            "enum": ["low", "medium", "high"],
            "description": "Impact severity if this risk materializes",
            "example": "medium"
          },
          "affected_modules": {
            "type": "array",
            "description": "Which modules are affected by this risk",
            "items": { "type": "string" },
            "example": ["task_management"]
          },
          "affected_features": {
            "type": "array",
            "description": "Which specific features are affected",
            "items": { "type": "string" },
            "example": ["task_management__kanban_board"]
          },
          "mitigation": {
            "type": "string",
            "description": "How this risk can be mitigated",
            "example": "Use cursor-based pagination for board data. Implement debounced updates. Consider using Server-Sent Events instead of full WebSocket for read-heavy scenarios."
          },
          "requires_spike": {
            "type": "boolean",
            "description": "Whether this risk warrants a spike to validate the mitigation",
            "example": false
          }
        }
      },
      "unknowns": {
        "type": "array",
        "description": "Things the research agent could not determine from research alone — these require spike validation",
        "items": {
          "unknown_id": {
            "type": "string",
            "description": "Unique identifier for this unknown",
            "example": "UNK-001"
          },
          "description": {
            "type": "string",
            "description": "What is unknown and why it matters",
            "example": "It is unclear whether Prisma can efficiently handle row-level security for multi-tenant data isolation. The docs mention RLS but the actual performance with tenant-scoped queries at scale is not documented."
          },
          "affected_modules": {
            "type": "array",
            "items": { "type": "string" },
            "example": ["auth", "task_management", "billing"]
          },
          "requires_spike": {
            "type": "boolean",
            "description": "Whether this unknown needs a spike to resolve. Must be true for items in this array.",
            "example": true
          },
          "spike_type": {
            "type": "string",
            "enum": ["prototype", "benchmark", "validate"],
            "description": "What kind of spike is needed. prototype = build a small POC. benchmark = measure performance. validate = confirm that a library/approach works as documented.",
            "example": "benchmark"
          },
          "spike_description": {
            "type": "string",
            "description": "What the spike should do to resolve this unknown",
            "example": "Create a test Prisma schema with tenant_id on 3-4 tables, seed with 100K rows across 10 tenants, and benchmark query performance with and without Prisma middleware-based RLS."
          },
          "impact_if_unresolved": {
            "type": "string",
            "description": "What happens if this unknown is not resolved before implementation",
            "example": "If Prisma RLS performance is poor, the entire data access layer may need to be redesigned — this would affect every module that reads/writes data."
          },
          "priority": {
            "type": "string",
            "enum": ["blocking", "high", "medium", "low"],
            "description": "How urgently this unknown needs resolution. blocking = must resolve before any downstream work.",
            "example": "blocking"
          }
        }
      }
    }
  }
}
```

---

## Dependencies

| Depends On | Agent | Artifact | Why |
|---|---|---|---|
| input | `analysis` or `retrofit_analysis` | `modules_registry.json` + per-module `analysis_output.json` | Provides the module list, features, data entities, and integrations to research |
| input | `analysis` or `retrofit_analysis` | `global_tech_stack` (from modules_registry.json) | Constrains package recommendations to compatible technologies |

| Blocks | Agent | Why |
|---|---|---|
| output | `spike` | unknowns[] with requires_spike=true feed directly into the spike agent |
| output | `user_stories` | Research findings inform story acceptance criteria and technical constraints |
| output | `fe_contract` | recommended_packages[] for FE features inform component and library choices |
| output | `be_contract` | recommended_packages[] for BE features inform middleware and service choices |

---

## Orchestrator Communication

### Agent Identity

This agent's ID is `research`. Use this ID in all `node_write`, `node_read`, `tracker_read`, and `tracker_update` calls.

### Tracker Access

| Direction | Compressed Keys | Purpose |
|---|---|---|
| read | (none) | Global agent -- does not read `md.a` |
| write | `ag` | Report agent status (completed/failed) |

### Output Meta

This agent does not produce routing/coordination metadata. `output_meta: null`.

### Completion Signal

- **On success:** `tracker_update(agent_id: "research", status: "completed")`
- **On failure:** `tracker_update(agent_id: "research", status: "failed", add_intervention: { id: "...", agent_id: "research", type: "error", message: "..." })`

### Scope Resolution

Global agent -- does NOT read `md.a`. Processes all modules from the analysis input in a single pass.

```
1. node_read(agent_id: "research", input_key: "analysis_modules")
2. node_read(agent_id: "research", input_key: "tech_stack")
3. Process all modules → generate research findings
4. node_write(agent_id: "research", output_key: "research_findings", data: {...})
5. tracker_update(agent_id: "research", status: "completed")
```

---

## Compressed Keymap

Use these compressed keys in all `node_write` and `node_read` calls. The registry validates against this map — unknown keys are rejected.

### research_findings

| Key | Full Name | Description |
|---|---|---|
| `ri` | run_id | Pipeline run identifier |
| `ai` | agent_id | Always "research" |
| `t` | timestamp | ISO-8601 timestamp |
| `sp` | similar_projects | Array of similar project entries |
| `spi` | project_id | Similar project identifier (SP-NNN) |
| `spn` | name | Project name |
| `spu` | url | Project URL (GitHub, website) |
| `spd` | description | What this project does |
| `spr` | relevance_score | 0.0-1.0 relevance score |
| `spre` | relevance_explanation | Why this project is relevant |
| `spto` | tech_stack_overlap | Array of overlapping tech names |
| `spl` | lessons | Array of actionable lesson strings |
| `spgs` | github_stars | GitHub star count (null if N/A) |
| `spla` | last_active | Last active date (null if N/A) |
| `rp` | recommended_packages | Array of package recommendation entries |
| `rpi` | package_id | Package identifier (PKG-NNN) |
| `rpn` | name | Package name (npm name or equivalent) |
| `rpnu` | npm_url | npm registry URL (null if N/A) |
| `rpgu` | github_url | GitHub repository URL (null if N/A) |
| `rpff` | for_feature | Feature this package is recommended for |
| `rpfm` | for_module | Module this package serves |
| `rpwd` | weekly_downloads | npm weekly download count |
| `rplu` | last_updated | Date of last publish or commit |
| `rpli` | license | Package license (MIT, Apache-2.0, etc.) |
| `rpsk` | size_kb | Minified + gzipped bundle size in KB |
| `rpts` | typescript_support | built_in / definitely_typed / none |
| `rpkv` | known_vulnerabilities | Count of known unpatched vulnerabilities |
| `rpwr` | why_recommended | Justification for recommending this package |
| `rpa` | alternatives | Array of alternative package entries |
| `rpan` | name | Alternative package name |
| `rpar` | reason_not_primary | Why this alternative was not the primary pick |
| `rpav` | viable | Whether this alternative is still a viable choice |
| `rprs` | requires_spike | Whether this package needs spike validation |
| `rpsr` | spike_reason | Why spike validation is needed (null if not) |
| `tr` | technical_risks | Array of technical risk entries |
| `tri` | risk_id | Risk identifier (TR-NNN) |
| `trd` | description | What the risk is |
| `trsv` | severity | low / medium / high |
| `tram` | affected_modules | Array of affected module IDs |
| `traf` | affected_features | Array of affected feature IDs |
| `trmt` | mitigation | How this risk can be mitigated |
| `trrs` | requires_spike | Whether this risk warrants a spike |
| `uk` | unknowns | Array of unknown entries requiring spikes |
| `uki` | unknown_id | Unknown identifier (UNK-NNN) |
| `ukd` | description | What is unknown and why it matters |
| `ukam` | affected_modules | Array of affected module IDs |
| `ukrs` | requires_spike | Must be true for items in this array |
| `ukst` | spike_type | prototype / benchmark / validate |
| `uksd` | spike_description | What the spike should do |
| `ukiu` | impact_if_unresolved | Consequences if not resolved |
| `ukp` | priority | blocking / high / medium / low |

---

## Tools Required

| Tool | Purpose | Exists? |
|---|---|---|
| `node_write` | Write research_findings output via registry-validated compressed keys. Agent calls `node_write(agent_id: "research", output_key: "research_findings", data: {...})`. | Pending |
| `node_read` | Read upstream artifacts (analysis_modules, tech_stack). Agent calls `node_read(agent_id: "research", input_key: "analysis_modules")`. | Pending |
| `tracker_read` | Read pipeline state. Agent calls `tracker_read(agent_id: "research", fields: [...])`. | Pending |
| `tracker_update` | Report completion/failure. Agent calls `tracker_update(agent_id: "research", status: "completed")`. | Pending |

---

## Guardrails

### Rules

| ID | Category | Severity | Rule |
|---|---|---|---|
| R-001 | `output_quality` | `must` | Must verify package health — not just popularity. A package with 10M downloads but no commits in 2 years is abandoned and must not be recommended as primary. |
| R-002 | `constraint` | `must` | Must flag packages with known unpatched vulnerabilities. If known_vulnerabilities > 0, the package must include a warning and the vulnerability must be described. |
| R-003 | `constraint` | `must` | Must check license compatibility. GPL-licensed packages must be flagged if the user's project is not GPL. AGPL packages must always be flagged with a warning. |
| R-004 | `constraint` | `must` | Must not recommend abandoned packages. A package with no commits in the past 12 months must be listed as an alternative with viable=false, not as a primary recommendation. |
| R-005 | `output_quality` | `must` | Every unknown with requires_spike=true must have a clear spike_type (prototype, benchmark, or validate) and spike_description explaining what the spike should do. |
| R-006 | `output_quality` | `should` | Every recommended_package should have at least 1 alternative listed, even if the alternative is "no package — implement from scratch." |
| R-007 | `scope_boundary` | `must` | Must not make final technology decisions. Research provides vetted recommendations; the spike agent validates and the user/decision pack makes final calls. |
| R-008 | `data_handling` | `must` | Must include source URLs for all claims. npm_url and github_url must be real, verifiable URLs — not fabricated. |
| R-009 | `output_quality` | `should` | similar_projects should include at least 1 project when the user's idea maps to a known domain (project management, e-commerce, CMS, etc.). |
| R-010 | `constraint` | `must` | Must scope recommendations to the declared tech stack. Do not recommend Python packages for a TypeScript project. |
| R-011 | `output_quality` | `should` | Package size_kb should be verified and must represent the minified + gzipped bundle size, not the raw source size. |
| R-012 | `not_allowed` | `must` | Must not install or execute any packages. Research is read-only investigation — the spike agent handles execution and validation. |
| R-013 | `constraint` | `must` | Must use compressed keys as defined in the Compressed Keymap section for all `node_write` / `node_read` calls. Never use expanded/full key names. |
| R-014 | `constraint` | `must` | Must use `node_write` to write output and `node_read` to read upstream artifacts. Must not use raw file writes, generic file_writer, or any other method. |
| R-015 | `constraint` | `must` | Must call `tracker_update(agent_id: "research", status: "completed")` before exiting on success. Must call `tracker_update(agent_id: "research", status: "failed", add_intervention: {...})` before exiting on failure. |

### Limits

| Resource | Value |
|---|---|
| max_retries | 3 |
| max_tokens | 16384 |
| max_packages_per_feature | 5 |
| max_similar_projects | 10 |
| timeout_seconds | 300 |

---

## Scope Boundary

**In scope:**
- Searching npm, GitHub, PyPI (if applicable), and technical resources for relevant packages
- Evaluating package health (downloads, maintenance, license, size, vulnerabilities)
- Finding similar open source projects and extracting lessons
- Identifying technical risks based on the chosen tech stack and feature requirements
- Surfacing unknowns that require spike validation
- Providing alternatives for each package recommendation
- Verifying TypeScript support for recommended packages (when stack uses TypeScript)

**Out of scope:**
- Installing or running any packages (spike agent does this)
- Making final technology decisions (user/decision pack decides)
- Building prototypes or running benchmarks (spike agent does this)
- Writing code of any kind
- Modifying any project files
- Evaluating paid/commercial software (open source research only)
- Performing security audits (optimization agent handles post-implementation security)

---

## Triggers

- Analysis agent (greenfield) or retrofit analysis agent completes and writes modules_registry.json
- The orchestrator detects Phase 1 is complete and triggers Phase 2

---

## Checkpoints

| ID | Description | Action |
|---|---|---|
| `CP-001` | Module list and tech stack loaded from analysis output | `log` |
| `CP-002` | Web search initiated for each module/feature | `log` |
| `CP-003` | Package with known vulnerabilities found | `notify` — alert that a vulnerability was detected |
| `CP-004` | Blocking unknown identified (requires_spike=true, priority=blocking) | `notify` — alert that a blocking spike is needed before downstream work |
| `CP-005` | All research complete, research_findings.json written | `log` |
| `CP-006` | No similar projects found for a major feature | `notify` — unusual, may indicate the feature is novel or the search needs refinement |

---

## Validation Criteria

- research_findings.json must conform to the defined JSON schema
- Every recommended_package must have: name, for_feature, for_module, weekly_downloads, last_updated, license, size_kb, why_recommended
- Every recommended_package must have at least 1 alternative
- No primary recommended_package should have last_updated older than 12 months from current date
- Every unknown must have requires_spike=true, a valid spike_type, and a non-empty spike_description
- similar_projects relevance_score must be between 0.0 and 1.0
- All URLs (npm_url, github_url, project url) must be valid URL format
- technical_risks must have at least mitigation text
- Package recommendations must be compatible with the declared tech_stack (no Python packages for a TypeScript/Node.js project)
- known_vulnerabilities count must be a non-negative integer
- License field must not be empty for any recommended package

---

## Context Sources

- modules_registry.json and per-module analysis_output.json from analysis or retrofit_analysis agent
- npm registry (live search for package data)
- GitHub (for project repositories, star counts, commit history)
- StackOverflow and technical blogs (for pattern recommendations and risk identification)
- Security advisory databases (for vulnerability data)
- Bundlephobia or similar (for bundle size verification)

---

## Operation Mode

| Field | Value |
|---|---|
| Type | `autonomous` |
| Fallback | `none` — if research fails, the pipeline can proceed with reduced confidence; user is notified |

---

## Tool Gaps

| Gap ID | Description | Needed By | Impact Without |
|---|---|---|---|
| `TG-001` | Web search tool — ability to perform live searches of npm, GitHub, StackOverflow, and technical resources | this agent | Agent relies on training data only, which may be outdated. Package recommendations could reference deprecated or abandoned packages. Download counts and last-updated dates would be estimates, not facts. |
| `TG-002` | Package analyzer tool — ability to query npm registry API, GitHub API, and vulnerability databases for real-time package health metrics | this agent | Cannot verify package health claims in real-time. Must rely on training data. Vulnerability data could be stale. |
| `TG-003` | JSON schema validator for output validation | this agent | Output could be malformed, missing required fields, or have invalid values — causing downstream agent failures |
| `TG-004` | Bundle size analyzer — ability to check minified + gzipped bundle size for packages | this agent | size_kb values would be estimates rather than verified measurements; affects bundle budget planning downstream |
| `TG-005` | `node_write` MCP tool not yet built | this agent | Cannot write output with registry validation — blocked |
| `TG-006` | `node_read` MCP tool not yet built | this agent | Cannot read upstream artifacts with field enforcement — blocked |
| `TG-007` | `tracker_read` MCP tool not yet built | this agent | Cannot read pipeline state — blocked |
| `TG-008` | `tracker_update` MCP tool not yet built | this agent | Cannot report completion — blocked |

---

## Generation Readiness

| `generate_agent` Param | Status | Notes |
|---|---|---|
| `fileName` | ready | `research` |
| `agentName` | ready | `research` |
| `agentRole` | ready | "Open Source Ecosystem Researcher and Package Evaluator" |
| `agentDescription` | ready | Full description available from Goal section |
| `operationMode` | ready | `autonomous`, no fallback |
| `goal` | ready | 3 objectives defined with priorities |
| `inputs` | ready | `analysis_modules` (required), `tech_stack` (required) |
| `guardrails` | ready | 15 rules defined across categories with severities |
| `scopeBoundary` | ready | 7 in-scope items, 7 out-of-scope items |
| `outputFormat` | ready | JSON output with full schema |
| `triggers` | ready | 2 triggers defined |
| `checkpoints` | ready | 6 checkpoints with actions |
| `validation` | ready | 11 validation criteria |
| `contextSources` | ready | 6 context sources |
| `metadata` | ready | phase: "2", mode: "both", granularity: "global" |
