Control plane · simulation kernelSinging Bird
A canonical-world simulation kernel with LLM-powered synths, exposed as REST, MCP, and SSE over a single OpenAPI schema.
What this is
Four pillars that define the system under the control plane.
KernelCanonical world with transactional cycles
Every cognitive cycle runs against a working copy. The Director commits only after invariants pass; on failure, the working copy is discarded and canonical state is unchanged. Snapshots land at cycle boundaries.
SynthsLLM-powered agents with theory of mind
Each synth owns a phenomenology — self-model, beliefs, mental models of other synths, affect, projects, memories. Perception is mediated through sensory bundles; actions flow through symbolic intent resolution.
AuditAppend-only replayable event trail
Every canonical change is journaled to per-session JSONL. Runs are deterministic (stable IDs from scenario_id + authored_id) and fully replayable from cached LLM responses.
SurfacesHTTP/JSON + MCP + SSE, one OpenAPI schema
The same OpenAPI spec drives REST, Swagger UI, ReDoc, the LLM tool manifest, the MCP tools/list for agent discovery, and this dashboard. Six consumers, one source of truth.
Who it's for
Each role has a direct entry point. Scopes are checked on every call.
ObserverFor watchers
Attach to a running simulation without disturbing it. scope: read
- Dashboard → Sessions — live session list with sim time
- Dashboard → Observation — overviews, events, changes, reports
- SSE streaming at
/v1/sessions/{id}/stream — browser-native live feed - Natural-language ref resolver (
resolve_ref) for finding synths by name
OperatorFor drivers
Step the simulation, submit turns, manage sessions. scope: operate
- Create sessions from scenario packs (
list_scenarios → create_session) - Advance cycles (
step_session) or auto-advance (resume_session) - Inject human turns via
submit_turn - Snapshot and roll back with
list_snapshots + restore_snapshot
BuilderFor integrators
Build on top of the control plane — agents, UIs, or new synths. scope: any
- OpenAPI 3.1 at
/openapi.json — authoritative contract - MCP streamable HTTP at
POST /mcp — JSON-RPC 2.0 tool discovery for agents - Scenario authoring — YAML at
scenarios/*.yaml; contract in Architecture - Extending the kernel — dev guide covers ruleset boundaries, invariants, persistence
AdminFor debuggers & ops
See what happened, find what broke, drop a new scenario without code changes. scope: admin
- Full request/response audit at
/v1/admin/logs — 15 filters - Every response carries
X-Request-Id — grep the log by ID for full context - Dashboard log tile renders the tail with colored status + MCP markers
- Apply live patches (
apply_patch) and queue stimuli (queue_stimulus) — admin only
Quick starts
Copy-paste, LAN-accessible. No auth by default; set SINGING_BIRD_API_TOKEN to turn it on.
Discover scenarios
# List available scenario packs
curl -s https://singing-bird.benac.dev/v1/scenarios | jq
Create and step a session
# Create a session and keep the id
SID=$(curl -s -X POST https://singing-bird.benac.dev/v1/sessions \
-H 'content-type: application/json' \
-d '{"scenario_path":"scenarios/park_bench.yaml"}' | jq -r .session_id)
# Advance one cognitive cycle
curl -X POST https://singing-bird.benac.dev/v1/sessions/$SID/step \
-H 'content-type: application/json' -d '{"n":1}'MCP tool discovery
# Any MCP-aware client (Claude Desktop, agent, etc.)
curl -X POST https://singing-bird.benac.dev/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | jqDebug a request by ID
# Every response carries X-Request-Id; use it to pull the record
curl -D - https://singing-bird.benac.dev/v1/scenarios -o /dev/null | grep -i request-id
curl 'https://singing-bird.benac.dev/v1/admin/logs?request_id=<id>' | jq
Every surface, one schema
All six are derived from the same OpenAPI document. Change the code, all six update.
Dashboard
Operator UI — 22 tiles across five lanes, live status, audit tail, theme-aware.
OpenAPI schema
OpenAPI 3.1 JSON. Source of truth for every other surface. Load into any generator.
Swagger UI
Interactive API explorer with try-it-out forms for every endpoint.
ReDoc
Reference-style API docs, easier to read in long form than Swagger.
Tool manifest
Compact LLM-friendly JSON tool list (name, method, path, scope, description).
MCP endpoint
JSON-RPC 2.0 over POST /mcp. tools/list, tools/call, ping. GET returns 405.
Everything, one click
Bookmarkable index of every URL on this host.