Chat models answer once. A ReAct harness loops: classify intent → complete → dispatch tools → update context → repeat until the task finishes or limits hit. Liminal is that harness for real software work.
Deeper architecture post: Inside the Liminal harness.
One send() turn
When you message the agent, AgentHarness.send():
- Binds chat id and workspace fingerprint (for memory federation).
- Runs intent inference on the fast model (
AGENT_INTENT_INFERENCE) — coding vs knowledge vs workflow-suitable, etc. - Injects reasoning budget and output effort (
AGENT_EFFORT) as system guidance. - Enters runReActLoop: the main model (or fast route when confidence is high) returns text and/or tool calls each round.
- ToolDispatcher validates schema, runs safety pre-flight, acquires locks, requests approval, executes, distills huge outputs.
- ContextManager keeps hot rounds verbatim, warm with provenance, cold compressed or elided to
.agent_artifacts/. - Ends with trajectory memory, optional vault auto-write, outcome scoring, and session JSONL.
That is why a “simple question” can still spawn ten tool rounds — the harness optimizes for done, not brevity.
140+ tools, lazy-loaded
AGENT_TOOL_LAZY (default on) registers a baseline profile (balanced, knowledge_first, or max_autonomy). The model calls activate_tool_family for shell, git, browser, memory_advanced, workflow, etc. when needed. Duplicate activation is tracked in tool_catalog.ts.
Families matter for SEO and ops: you can see exactly which capabilities were live in a session trace.
Context is a budget, not a log dump
| Mechanism | Purpose |
|---|---|
| Hot / warm rounds | Keep recent tool I/O readable |
AGENT_DISTILL | Shrink stale giant outputs to artifact pointers |
AGENT_TOOL_BODY_ELIDE | Replace very old tool bodies with pointers |
| Harness rules (round 2) | Inject named rules, recipes, failure digests |
Comparison table
The model is nudged to read_artifact instead of re-ingesting megabytes.
Orchestration beyond one loop
- spawn_agent — fork child harnesses with scoped tools.
- plan_workflow / run_workflow — phased sub-agents, outputs in
.agent_workflows/, distilled summaries only in parent context. - ToolDag — intra-round dependencies when calls must serialize.
Root-only tools (orchestration, workflows, refresh_world_context) never copy to children — preventing unbounded nesting.
Safety and recovery
- Approvals on destructive tools; optional safety judge to skip obvious safe cases.
- Retries on 429/5xx with circuit breaker on the provider.
- Self-heal lint optional loop after edits.
- Length-resume for truncated streamed writes.
Why developers search “ReAct agent for coding”
They need execution: git status, multi-file edits, tests, browser repro, memory recall — with a trace they can audit. The harness is the product; the LLM is interchangeable via OpenRouter or local servers.