Dashboard

Each tile is one API tool, grouped by lane. Empty groups are reserved for future tools.

Sessions

Session lifecycle — create, inspect, close, snapshot, restore.

Available scenario packs

List scenario packs discoverable on disk. Dynamic: drop a new *.yaml into the scenarios directory and it appears.

Pass a scenario path as the body of POST /v1/sessions to create a session.

scenario_idpathrulesetchrononlocationsentitiessynths
dockside_outpostscenarios/dockside_outpost.yamlphysical_social_v1240s383
lighthousescenarios/lighthouse.yamlphysical_social_v1300s4123
lighthouse_forkdata/scenarios/lighthouse_fork.yamlphysical_social_v1300s4123
lighthouse_test_basedata/scenarios/lighthouse_test_base.yamlphysical_social_v1300s4123
night_clinicscenarios/night_clinic.yamlphysical_social_v1180s373
park_benchscenarios/park_bench.yamlphysical_social_v1180s352
storm_cellarscenarios/storm_cellar.yamlphysical_social_v1240s383
workshop_blackoutscenarios/workshop_blackout.yamlphysical_social_v1240s383

Create a new scenario

POSThttps://singing-bird.benac.dev/v1/scenariosscope: operate

Scenario authoring — writes to data/scenarios/. Shipped baselines stay read-only; writes to a shipped id shadow the original.

Sample request body (Run sends this):

{
  "scenario_id": "my_draft"
}

Replace scenario contents

PUThttps://singing-bird.benac.dev/v1/scenarios/{scenario_id}scope: operate

Scenario authoring — writes to data/scenarios/. Shipped baselines stay read-only; writes to a shipped id shadow the original.

Requires:

  • scenario_id

Sample request body (Run sends this):

{
  "content": {
    "scenario_id": "my_draft",
    "schema_version": 1,
    "world": {}
  }
}

Add a location

POSThttps://singing-bird.benac.dev/v1/scenarios/{scenario_id}/locationsscope: operate

Scenario authoring — writes to data/scenarios/. Shipped baselines stay read-only; writes to a shipped id shadow the original.

Requires:

  • scenario_id

Sample request body (Run sends this):

{
  "id": "garden",
  "name": "Walled Garden",
  "kind": "exterior",
  "description": "A quiet garden."
}

Add a ruleset-validated entity

POSThttps://singing-bird.benac.dev/v1/scenarios/{scenario_id}/entitiesscope: operate

Scenario authoring — writes to data/scenarios/. Shipped baselines stay read-only; writes to a shipped id shadow the original.

Requires:

  • scenario_id

Sample request body (Run sends this):

{
  "id": "bench",
  "name": "Bench",
  "location": "garden",
  "components": [
    {
      "type": "seating",
      "capacity": 2
    }
  ]
}

Replace an entity (destructive)

PUThttps://singing-bird.benac.dev/v1/scenarios/{scenario_id}/entities/{entity_id}scope: operate

Scenario authoring — writes to data/scenarios/. Shipped baselines stay read-only; writes to a shipped id shadow the original.

Requires:

  • scenario_id

Sample request body (Run sends this):

{
  "id": "bench",
  "name": "Stone Bench",
  "location": "garden",
  "components": [
    {
      "type": "seating",
      "capacity": 4
    }
  ]
}

Add a synth

POSThttps://singing-bird.benac.dev/v1/scenarios/{scenario_id}/synthsscope: operate

Scenario authoring — writes to data/scenarios/. Shipped baselines stay read-only; writes to a shipped id shadow the original.

Requires:

  • scenario_id

Sample request body (Run sends this):

{
  "id": "alice",
  "entity": "alice_body",
  "identity": {
    "name": "Alice",
    "kind": "human"
  },
  "embodiment_profile": "standard_human",
  "cognition": {
    "model": "@chat",
    "temperature": 0.7
  }
}

Replace a synth (destructive; drops unsent fields)

PUThttps://singing-bird.benac.dev/v1/scenarios/{scenario_id}/synths/{synth_id}scope: operate

Scenario authoring — writes to data/scenarios/. Shipped baselines stay read-only; writes to a shipped id shadow the original.

Requires:

  • scenario_id

Sample request body (Run sends this):

{
  "id": "alice",
  "entity": "alice_body",
  "identity": {
    "name": "Alice",
    "kind": "human"
  },
  "embodiment_profile": "standard_human",
  "cognition": {
    "model": "@chat"
  }
}

Remove a synth

DELETEhttps://singing-bird.benac.dev/v1/scenarios/{scenario_id}/synths/{synth_id}scope: operate

Scenario authoring — writes to data/scenarios/. Shipped baselines stay read-only; writes to a shipped id shadow the original.

Requires:

  • scenario_id

Connect two locations

POSThttps://singing-bird.benac.dev/v1/scenarios/{scenario_id}/adjacencyscope: operate

Scenario authoring — writes to data/scenarios/. Shipped baselines stay read-only; writes to a shipped id shadow the original.

Requires:

  • scenario_id

Sample request body (Run sends this):

{
  "from": "start",
  "to": "garden",
  "kind": "path",
  "bidirectional": true
}

Inspect a scenario pack

Full pre-hydration view of a scenario — locations, entities, synths, processes, latent facts, embodiment profiles, environment. Pass ?format=raw for the unparsed YAML text.

dockside_outpost · scenarios/dockside_outpost.yaml · ruleset physical_social_v1 · chronon 240s · seed 777

Synths (3)

idnamekindmodelembodimentmoodtraitsbeliefsprojectsmemories
inezInezhuman@chatstandard_humanfocusedsteady, brisk, unsentimental211
pavelPavelhuman@chatstandard_humanuncertainpatient, skeptical, cold, polite111
soraSorahuman@chatstandard_humanwatchfulcapable, laconic, watchful211

Locations (3)

idnamekindparentdescription
dock_shedDock ShedroomA salt-stiff wooden shed holding ropes, spare lantern parts, a bench, and a thermos that has gone lukewarm.
pierPierexteriorWet planks stretching out into gray water. The railings sweat with fog and the morning is not yet fully awake.
road_turnoutRoad TurnoutexteriorA gravel turnout above the dock where travelers wait for the first boat or decide not to trust the weather.

Entities (8)

idnamelocationmobilitycomponents
signal_lanternSignal Lanternpierfixedlight_source, repairable, switchable, fixed
fog_bellFog Bellpierfixedfixed, sound_source
supply_crateSupply Cratedock_shedmovablecontainer
thermosThermosdock_shedmovableportable, consumable
mooring_ropeMooring Ropepierfixedfixed, sound_source
inez_bodyInezdock_shedmovable
pavel_bodyPavelroad_turnoutmovable
sora_bodySorapiermovable

Adjacency (2)

fromtokindbidirectional
dock_shedpierdooryes
pierroad_turnoutpathyes

Processes (2)

idnamekindinitial_statetransitions
fog_thickensFog Thickensweatherharbor_fog1
morning_liftsMorning Slow Liftcelestialpredawn1

Latent facts (1)

idscopedescription
mantle_truthsignal_lanternWhat is actually wrong with the signal lantern

Environment (initial)

{
  "celestial": {
    "sun_altitude": -4.0,
    "phase": "predawn",
    "description": "Predawn gray presses down on the harbor and blurs the horizon."
  },
  "weather": {
    "condition": "foggy",
    "wind_speed": 8.0,
    "wind_direction": "east",
    "description": "Fog banks drift through the pilings and leave everything beaded with water."
  },
  "ambient": {
    "light_level": 0.18,
    "temperature": 11.0
  }
}

Embodiment profiles: standard_human

Raw YAML (9973 bytes)
scenario_id: dockside_outpost
schema_version: 1
ruleset_ref: physical_social_v1
random_seed: 777

runtime_defaults:
  chronon_interval_seconds: 240
  max_recursion_depth: 6
  max_events_per_cycle: 60

profiles:
  embodiment_profiles:
    standard_human:
      sensory:
        - channel: visual
          range: 70.0
          acuity: 1.0
        - channel: auditory
          range: 45.0
          acuity: 1.0
        - channel: tactile
          range: 1.0
          acuity: 1.0
        - channel: proprioceptive
          range: 0.0
          acuity: 1.0
      actuators:
        - name: hands
          description: can carry, inspect, and manipulate objects
          range: 1.5
        - name: locomotion
          description: can move between shed and pier
          range: 1.0
      communication:
        - speech

world:
  simulation_time: "2026-08-29T05:40:00"
  chronon_interval_seconds: 240

  topology:
    locations:
      - id: dock_shed
        name: Dock Shed
        kind: room
        description: >
          A salt-stiff wooden shed holding ropes, spare lantern parts,
          a bench, and a thermos that has gone lukewarm.

      - id: pier
        name: Pier
        kind: exterior
        description: >
          Wet planks stretching out into gray water. The railings sweat with
          fog and the morning is not yet fully awake.

      - id: road_turnout
        name: Road Turnout
        kind: exterior
        description: >
          A gravel turnout above the dock where travelers wait for the first
          boat or decide not to trust the weather.

    adjacency:
      - from: dock_shed
        to: pier
        kind: door
        bidirectional: true
      - from: pier
        to: road_turnout
        kind: path
        bidirectional: true

  entities:
    - id: signal_lantern
      name: Signal Lantern
      location: pier
      mobility: fixed
      description: A harbor lantern mounted chest-high near the end of the pier.
      components:
        - type: light_source
          functional: false
          intensity: 3.5
          range: 60.0
          description: "The lantern is dark and glass-fogged."
        - type: repairable
          condition: dirty_mantle
          difficulty: 0.45
          description: "The mantle assembly is dirty and the latch sticks."
        - type: switchable
          state: "off"
        - type: fixed

    - id: fog_bell
      name: Fog Bell
      location: pier
      mobility: fixed
      description: A hand bell mounted on a post by the rail.
      components:
        - type: fixed
        - type: sound_source
          description: "Metal rings out dull and heavy through the fog."
          volume: 0.4

    - id: supply_crate
      name: Supply Crate
      location: dock_shed
      mobility: movable
      description: A dock crate with simple emergency supplies.
      components:
        - type: container
          contents: [rag, matches, spare_mantle]

    - id: thermos
      name: Thermos
      location: dock_shed
      mobility: movable
      description: A metal thermos with a little coffee left in it.
      components:
        - type: portable
        - type: consumable
          uses_remaining: 1
          effect_description: "The coffee is lukewarm and bitter, but it wakes you up."

    - id: mooring_rope
      name: Mooring Rope
      location: pier
      mobility: fixed
      description: Rope knocking softly against a wet cleat.
      components:
        - type: fixed
        - type: sound_source
          description: "Wet rope taps and scrapes against the cleat."
          volume: 0.2

    - id: inez_body
      name: Inez
      location: dock_shed
      mobility: movable
      components: []

    - id: pavel_body
      name: Pavel
      location: road_turnout
      mobility: movable
      components: []

    - id: sora_body
      name: Sora
      location: pier
      mobility: movable
      components: []

  environment:
    celestial:
      sun_altitude: -4.0
      phase: predawn
      description: "Predawn gray presses down on the harbor and blurs the horizon."
    weather:
      condition: foggy
      wind_speed: 8.0
      wind_direction: east
      description: "Fog banks drift through the pilings and leave everything beaded with water."
    ambient:
      light_level: 0.18
      temperature: 11.0

  processes:
    - id: fog_thickens
      name: Fog Thickens
      kind: weather
      initial_state: harbor_fog
      transitions:
        - from: harbor_fog
          to: heavy_fog
          trigger_time: "2026-08-29T05:48:00"
          effects:
            "environment.weather.condition": "heavy_fog"
            "environment.ambient.light_level": 0.12
            visual_description: "The fog thickens until shapes feel cut from paper."
            auditory_description: "Every sound seems closer and farther at once in the fog."
          description: "Fog closes in"
    - id: morning_lifts
      name: Morning Slow Lift
      kind: celestial
      initial_state: predawn
      transitions:
        - from: predawn
          to: first_light
          trigger_time: "2026-08-29T05:56:00"
          effects:
            "environment.celestial.phase": "first_light"
            "environment.celestial.sun_altitude": 1.0
            "environment.ambient.light_level": 0.28
            visual_description: "A pale line of morning appears behind the fog."
          description: "First light shows through"

  latent_facts:
    - id: mantle_truth
      scope: signal_lantern
      description: "What is actually wrong with the signal lantern"
      allowed_values: [dirty_mantle, loose_latch, damp_fuel_line]
      default_prior: dirty_mantle

synths:
  - id: inez
    entity: inez_body
    embodiment_profile: standard_human
    identity:
      name: Inez
      kind: human
      biography: >
        Inez opens the outpost before dawn and thinks in checklists when the
        weather turns doubtful.
      traits: [steady, brisk, unsentimental]
      values: [reliability, safety, competence]
    initial_state:
      believed_location: Dock Shed
      affect:
        mood: focused
        valence: 0.0
        arousal: 0.4
        stress: 0.3
        drives: [get the signal lantern working, read the weather, decide whether service is wise]
      beliefs:
        - subject: signal lantern
          predicate: is
          value: out and needs attention
          confidence: 0.9
          source_modality: prior
        - subject: the fog
          predicate: is
          value: thick enough that people will start asking questions
          confidence: 0.8
          source_modality: visual
      projects:
        - title: Restore the dock signal
          goal: Get the lantern working before the first real movement on the pier
          motivation: Bad weather is survivable; bad weather and confusion are worse
          status: active
          priority: 1
      memories:
        - type: semantic
          content: "In fog, people trust a lit signal more than any spoken reassurance."
          salience: 0.6
          source_modality: prior
    cognition:
      model: "@chat"
      temperature: 0.9

  - id: pavel
    entity: pavel_body
    embodiment_profile: standard_human
    identity:
      name: Pavel
      kind: human
      biography: >
        Pavel arrived early for the crossing and now suspects he may be early
        for bad news instead.
      traits: [patient, skeptical, cold, polite]
      values: [clarity, caution, getting where I said I would go]
    initial_state:
      believed_location: Road Turnout
      affect:
        mood: uncertain
        valence: -0.1
        arousal: 0.4
        stress: 0.2
        drives: [learn whether the crossing is happening, stay warm, not waste the morning]
      beliefs:
        - subject: the harbor
          predicate: is
          value: too fogged in to trust casually
          confidence: 0.8
          source_modality: visual
      projects:
        - title: Decide whether to wait or leave
          goal: Get a reliable sense of whether the dock is operating this morning
          motivation: I would rather lose time than gamble stupidly in bad conditions
          status: active
          priority: 0
      memories:
        - type: episodic
          content: "I once sat six hours at a different dock because nobody would give a straight answer about the weather."
          salience: 0.5
          source_modality: prior
    cognition:
      model: "@chat"
      temperature: 0.9

  - id: sora
    entity: sora_body
    embodiment_profile: standard_human
    identity:
      name: Sora
      kind: human
      biography: >
        Sora works the small harbor boats and trusts sound on the water almost
        as much as sight.
      traits: [capable, laconic, watchful]
      values: [good judgment, calm, not boasting]
    initial_state:
      believed_location: Pier
      affect:
        mood: watchful
        valence: 0.0
        arousal: 0.5
        stress: 0.3
        drives: [read the harbor honestly, help without making promises I cannot keep]
      beliefs:
        - subject: the pier
          predicate: is
          value: safer when the signal lantern is working
          confidence: 0.9
          source_modality: prior
        - subject: pavel
          predicate: is
          value: likely to ask whether the crossing is happening
          confidence: 0.6
          source_modality: prior
      projects:
        - title: Judge the morning crossing
          goal: Decide whether conditions are safe enough for movement at first light
          motivation: Better a disappointed traveler than an avoidable rescue
          status: active
          priority: 1
      memories:
        - type: procedural
          content: "In fog, bells and lamps matter more than confident voices."
          salience: 0.6
          source_modality: prior
    cognition:
      model: "@chat"
      temperature: 0.9

Start a new simulation

POSThttps://singing-bird.benac.dev/v1/sessionsscope: operate

Start a new simulation from a scenario pack. State-changing: Run will prompt for confirmation before firing.

Requires:

  • scenario_path from list_scenarios

Sample request body (Run sends this):

{
  "scenario_path": "scenarios/park_bench.yaml"
}

Control

Advance the simulation — step, pause, resume, submit turns.

Pause auto-advance

POSThttps://singing-bird.benac.dev/v1/sessions/{session_id}/pausescope: operate

Pause auto-advance. The session must be running (see resume_session).

Requires:

  • live session_id

Sample request body (Run sends this):

{}

Resume auto-advance

POSThttps://singing-bird.benac.dev/v1/sessions/{session_id}/resumescope: operate

Resume auto-advance. Sessions start paused after create_session.

Requires:

  • live session_id

Sample request body (Run sends this):

{}

Inject an external turn

POSThttps://singing-bird.benac.dev/v1/sessions/{session_id}/turnsscope: operate

Inject a turn from an external origin (e.g. a human operator). State-changing.

Requires:

  • live session_id

Sample request body (Run sends this):

{
  "origin_type": "human",
  "payload": {
    "text": "hello there"
  }
}

Observation

Query state — overview, objects, events, changes, reports, SSE.

Intervention

Mutate live state — patches, external stimuli.

Apply world mutations

POSThttps://singing-bird.benac.dev/v1/sessions/{session_id}/patchesscope: admin

Apply a batch of world mutations (set_environment_field, add_belief, move_entity, etc.) against the canonical state. Admin only; state-changing.

Requires:

  • live session_id
  • admin scope

Sample request body (Run sends this):

{
  "operations": [
    {
      "op": "set_environment_field",
      "field_path": "ambient.temperature",
      "value": 22.0
    }
  ],
  "mode": "commit"
}

Queue an external sensory stimulus

POSThttps://singing-bird.benac.dev/v1/sessions/{session_id}/stimuliscope: admin

Queue an external sensory stimulus for delivery through the perception path. Mediated: enters via compose_sensory_bundle on the next step or turn.

Requires:

  • live session_id
  • admin scope

Sample request body (Run sends this):

{
  "content": "a loud clang from the street",
  "channel": "auditory",
  "source": "external",
  "salience": 0.8,
  "delivery": "next_cycle"
}

Tooling

Meta endpoints — manifest, schema.

API audit log

Live tail of the API request/response audit log. Every HTTP exchange and every MCP JSON-RPC message is captured. The X-Request-Id response header links each response back to a record here.

Most recent first. Click Run to fetch more records as JSON. Showing 25 most recent.

timemethodpath / toolstatusmsresp bytesscopereq id
15:38:02GET/docs2000936adminb92b497d
15:38:02GET/docs2000936admin8e0c45db
15:37:52GET/docs2000936adminebe9349a
15:37:42GET/docs2000936admina7bca649
15:37:32GET/docs2000936admin6eb8652f
15:37:32GET/docs2000936admin6aea4a5d
15:37:22GET/docs2000936adminbd80e4d6
15:37:12GET/docs2000936admin5ae4b27c
15:37:02GET/docs2000936admin92601084
15:37:02GET/docs2000936adminb1901305
15:36:52GET/docs2000936admin077e0321
15:36:42GET/docs2000936admin01a80e4a
15:36:32GET/docs2000936admine32addc9
15:36:32GET/docs2000936admin21473ff4
15:36:22GET/docs2000936admine98fec54
15:36:12GET/docs2000936adminc33e3e78
15:36:02GET/docs2000936admind253ea3d
15:36:02GET/docs2000936admin58ac0152
15:35:58GET/v1/admin/logs200312170adminbda9a42a
15:35:58POST/mcp200517559adminbfd39f45
15:35:58MCP · tools/listok510
15:35:58GET/v1/sessions/not-real4043430admin86d7ccef
15:35:58GET/v1/scenarios2001041249admindf143dc0
15:35:52GET/docs2000936adminb42a5a73
15:35:42GET/docs2000936admine23bf252

API tool manifest

Self-documenting tool list, derived from the OpenAPI schema. This is what external API consumers query to discover what's available.

Other self-doc endpoints exposed by this service:

namepathdescription
OpenAPI schema (JSON)/openapi.jsonFull OpenAPI 3.1 spec — authoritative source of truth.
Swagger UI/docsInteractive API explorer with try-it-out forms.
ReDoc/redocAlternative, reference-style rendering of the OpenAPI spec.
Tool manifest (this tile)/v1/tooling/manifestCompact JSON tool list, LLM-friendly.
Dashboard JSON/dashboard/dataJSON mirror of this dashboard.