Structure that does the deciding.
Morphogen expresses an agentic workflow as a typed graph — an organism. Most cells are deterministic code. A few are bounded agent cells with a declared context view, a typed output contract, and a budget. The graph, not the prompt, carries the decisions.
The shape
cells:
- id: route
kind: classifier # bounded LLM call, closed label set
output: { kind: choice, labels: [bug, feature, question] }
- id: as-bug
kind: fn # deterministic code
edges:
- from: route.out
to: as-bug.tag
guard: { equals: bug } # the structure carries the routing
What a run produces
Every run emits a content-addressed receipt: which cells committed,
which skipped, what each agent cell asked and returned, and the work
ledger. morphogen verify replays the run offline with the
recorded receipts fixed — the same manifest, the same outputs, the same
digest — or reports exactly where it diverges.
$ morphogen run triage.morphogen.json --responses triage.responses.json
$ morphogen verify run.receipt.json triage.morphogen.json
{"ok":true,"outcome":"complete","digest":"sha256:…"}
Boundaries
- A manifest carries no executable code.
fncells name host-registered functions; agent cells declare prompts, views, and contracts. - An agent cell sees only its declared view of the graph — byte-bounded, computed, never a stuffed prompt.
- Model output is data. It re-enters the graph only after binding to a declared output contract.
- Organisms embed: a sealed, content-addressed manifest becomes one cell inside a larger organism, exposing only its declared ports.
- Receipts make runs replayable, not reproducible — the same organism on fresh inputs can legitimately diverge.
Status
Early. morphogen.organism.v1 covers the manifest contract,
the scheduler, the effect/receipt seam, nested organisms, and offline
verification. Hosted habitats, multi-owner messaging, and workflow
breeding are deliberately deferred.
hraness/morphogen · MIT