Harness ↔ LangGraph equivalence
I built my own staged-orchestration engine before I sat down and compared it concept-for-concept against LangGraph. The mapping below isn't retrofitted marketing — it's the actual correspondence between constructs I arrived at independently and the primitives LangGraph ships as a framework. Where I don't have a direct equivalent, I've said so.
1. Equivalence table
| My harness | LangGraph | Notes |
|---|---|---|
Numbered stage scripts emitting STAGE_RESULT | Nodes | one unit of work, typed result |
| Run-state file + run-id | Graph state / thread | persisted between steps |
| Exit code 4 = paused (human gate) | interrupt() / checkpointer | resume via --resume |
| Skills (SKILL.md + scripts) | Tools | discoverable, contract-documented |
Dispatcher reading .stage-order | Graph edges / router | sequencing + conditional skips |
| Model router fallback chain | with_fallbacks() | plus schema-validated strict-retry |
Token ledger (tokenlog) | LangSmith/Langfuse traces | append-only, per-attempt |
| Golden retrieval tests | evals | regression-gated retrieval |
2. A real run
This is the actual shape of a content-production run through my pipeline: numbered stages, a pause gate wherever a human needs to pick between options before the pipeline can keep going.
flowchart LR
A[Topic select] --> G1{{Gate: pick topic}}
G1 --> B[Research]
B --> C[Angle]
C --> G2{{Gate: pick angle}}
G2 --> D[Assets]
D --> E[Captions]
classDef gate fill:#f6ad55,stroke:#c05621,color:#1a1a1a;
class G1,G2 gate;
Exit code 4 fires at each gate: the run pauses, state persists to disk, and a human picks (a topic, then later an angle) before--resume carries the same run-id forward into the next stage.
3. Evidence
- Exhibit 04 — workflow dispatcher with human gates
- Exhibit 03 — model router + fallback chain
- Capabilities matrix — every claim on this page traced to evidence