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 harnessLangGraphNotes
Numbered stage scripts emitting STAGE_RESULTNodesone unit of work, typed result
Run-state file + run-idGraph state / threadpersisted between steps
Exit code 4 = paused (human gate)interrupt() / checkpointerresume via --resume
Skills (SKILL.md + scripts)Toolsdiscoverable, contract-documented
Dispatcher reading .stage-orderGraph edges / routersequencing + conditional skips
Model router fallback chainwith_fallbacks()plus schema-validated strict-retry
Token ledger (tokenlog)LangSmith/Langfuse tracesappend-only, per-attempt
Golden retrieval testsevalsregression-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