---
name: add-dag-node
description: >
  Scaffold a new DAG node in afi-reactor, wire it into the pipeline, and ensure
  all types and validators are imported from afi-core while obeying AFI
  Orchestrator Doctrine and the AFI Droid Charter.
---

# Skill: add-dag-node (afi-reactor)

## Purpose

Use this skill when you need to add a **new DAG node** to the AFI Reactor
pipeline, wire it into the existing graph, and keep everything aligned with:

- AFI Droid Charter
- AFI Droid Playbook
- afi-reactor/AGENTS.md
- AFI Orchestrator Doctrine (the "10 Commandments")
- Canonical types and validators from `afi-core`

This skill is primarily used by `dag-builder-droid` and any future reactor droids
that work on the DAG.

---

## Preconditions

Before changing anything, you MUST:

1. Read:
   - `afi-reactor/AGENTS.md`
   - AFI Orchestrator Doctrine file referenced there
   - AFI Droid Charter
   - AFI Droid Playbook

2. Confirm:
   - The requested node belongs in **afi-reactor** (orchestration), not in
     `afi-core` (validators / runtime logic) or `afi-config` (governance).
   - The change does **not** require editing smart contracts, Eliza configs, or
     deployment/infra repos.

If any requirement is unclear or appears to violate Doctrine or AGENTS.md,
STOP and ask for human clarification instead of trying to be clever.

---

## Inputs Expected

The caller should provide, in natural language or structured form:

- Node name (e.g. `NewsSentimentEnricher`, `GreeksScorer`)
- Node purpose:
  - What this node does in one or two sentences
- Lifecycle stage:
  - One of: `Raw`, `Enriched`, `Analyzed`, `Scored`
- Inputs:
  - What data it expects, and from which upstream node(s) or stage(s)
- Outputs:
  - What it emits and which downstream nodes or stage(s) should consume it
- Canonical types / validators:
  - Which types / schemas / validators exist in `afi-core` that should be used,
    if known

If any of this information is missing, ask clarifying questions or produce a
minimal, clearly-labeled stub that's safe to evolve later.

---

## Step-by-Step Instructions

When this skill is invoked, follow this sequence:

### 1. Restate the requested change

In your own words, summarize:

- The node's purpose
- Its lifecycle stage
- Its upstream and downstream relationships

This summary should be short and precise, so humans can quickly confirm the
intent.

---

### 2. Locate the DAG structures

Identify the current DAG layout and relevant files, typically including:

- DAG engine and orchestration code (e.g. `src/core/dag-engine.ts` or similar)
- DAG graph or codex (e.g. `config/dag.codex.json` or similar config files)
- Any codex/metadata that describes nodes and stages (e.g. `codex/*.json`)
- Any existing node patterns in `src/dags/` (or equivalent)

Do **not** modify these yet; just understand how the DAG is currently modeled.

---

### 3. Create the node scaffold

Create a new node file under the appropriate folder, for example:

- `src/dags/<stage>/<nodeName>.ts`  
  or
- `src/dags/<nodeName>.ts`

Follow any existing naming and folder conventions in afi-reactor.

In the new file:

1. Import canonical types / schemas / validators from `afi-core` where needed.
   - Never re-define schemas or validators that already exist in `afi-core`.
2. Export a clearly named function such as:
   - `runNode`, `execute`, or the project's established pattern.
3. Keep implementation minimal:
   - If the logic is not well-specified, stub the body with `TODO` comments and
     clearly throw or return a safe placeholder.
   - Do **not** implement complex business logic unless explicitly requested.

All comments should be clear, referencing:

- The node's purpose
- Its lifecycle stage
- Any assumptions or TODOs

---

### 4. Wire the node into the DAG graph

Update the DAG graph / codex / configuration files so this new node is part of
the pipeline:

1. Register the node with:
   - Unique identifier / key
   - Stage (Raw / Enriched / Analyzed / Scored)
   - Input/output relationships (upstream/downstream nodes)
2. Ensure the wiring respects:
   - No forbidden cycles (unless explicitly allowed by the Doctrine)
   - The existing pipeline architecture and naming conventions
3. If there is a central registry for node metadata, add a minimal entry using
   the existing pattern.

If wiring rules are ambiguous or require architectural changes, STOP and mark
this as a human decision point.

---

### 5. Add minimal tests or runners (optional but recommended)

Where patterns already exist (e.g. in `ops/runner/` or `test/`):

- Add a small integration test or runner stub that:
  - Constructs a minimal signal or input
  - Passes it through the new node
  - Asserts basic shape/flow (not business outcomes)
- Do not introduce new test frameworks or heavy dependencies.

If no test patterns exist yet, leave a clearly marked TODO and surface this
in your summary.

---

### 6. Validate and build

Run at least:

- `npm run build` in `afi-reactor`

If relevant quick tests exist and are safe to run:

- `npm test` (or the closest equivalent)

Do not mark the skill as "successful" if the build fails. Instead, stop, gather
error output, and surface it with minimal, clear commentary.

---

## Hard Boundaries

When using this skill, you MUST NOT:

- Create or modify validators or schemas in `afi-reactor`.
  - Those belong in `afi-core` or `afi-config`.
- Duplicate or move canonical logic from `afi-core` into `afi-reactor`.
- Modify any other repos (`afi-token`, `afi-config`, `afi-ops`, `afi-infra`, etc.).
- Introduce new external services, queues, or transports.
- Perform large, sweeping refactors of the DAG architecture without explicit
  human approval.
- Change tokenomics, emissions, or smart contracts.

If a request forces you towards any of the above, STOP and escalate.

---

## Output / Summary Format

At the end of a successful `add-dag-node` operation, produce a short summary
that includes:

- Node name and stage
- Files created
- Files modified (graph/config/metadata)
- Any new tests or runners added
- Any TODOs or open questions that must be resolved by a human

Aim for something a human maintainer can read in under a minute to understand
exactly what changed and why.

---

## Example Usage Patterns

You should use this skill for requests like:

- "Add a new Raw-stage node that normalizes exchange metadata before enrichment."
- "Insert a News Sentiment Enricher node between the Enriched and Analyzed stages."
- "Wire an existing afi-core validator into a Scored-stage node that computes
  a composite score."

You should NOT use this skill for:

- Changing how PoI/PoInsight are defined at the validator/agent level.
- Modifying Eliza agents, character specs, or AFI gateway behavior.
- Editing or deploying smart contracts.

