Files
wehub-resource-sync 426e9eeabd
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Waiting to run
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Waiting to run
Build Agent Image / build-and-push (push) Waiting to run
Chat shell gestures / Chat shell gesture + parity e2e (push) Waiting to run
ci / test (push) Waiting to run
ci / lint-and-format (push) Waiting to run
ci / build (push) Waiting to run
ci / dev-startup (push) Waiting to run
Cloud Gateway Discord / Test (push) Waiting to run
Cloud Gateway Webhook / Test (push) Waiting to run
Cloud Tests / lint-and-types (push) Waiting to run
Cloud Tests / unit-tests (push) Waiting to run
Cloud Tests / integration-tests (push) Waiting to run
Cloud Tests / e2e-tests (push) Blocked by required conditions
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Apps Worker (Product 2) / Determine environment (push) Waiting to run
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Blocked by required conditions
Deploy Eliza Provisioning Worker / Determine environment (push) Waiting to run
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Blocked by required conditions
Dev Smoke / Classify changed paths (push) Waiting to run
Dev Smoke / bun run dev onboarding chat (push) Blocked by required conditions
Dev Smoke / Vite HMR dependency-level smoke (push) Blocked by required conditions
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Waiting to run
gitleaks / gitleaks (push) Waiting to run
Markdown Links / Relative Markdown Links (push) Waiting to run
Publish @elizaos/example-code / check_npm (push) Waiting to run
Publish @elizaos/example-code / publish_npm (push) Blocked by required conditions
Publish @elizaos/plugin-elizacloud / verify_version (push) Waiting to run
Publish @elizaos/plugin-elizacloud / publish_npm (push) Blocked by required conditions
Quality (Extended) / Homepage Build (PR smoke) (push) Waiting to run
Quality (Extended) / Comment-only diff guard (push) Waiting to run
Quality (Extended) / Format + Type Safety Ratchet (push) Waiting to run
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Waiting to run
Quality (Extended) / Develop Gate (lint) (push) Waiting to run
Sandbox Live Smoke / Sandbox live smoke (push) Waiting to run
Snap Build & Test / Build Snap (amd64) (push) Waiting to run
Snap Build & Test / Build Snap (arm64) (push) Waiting to run
supply-chain / sbom (push) Waiting to run
supply-chain / vulnerability-scan (push) Waiting to run
Build, Push & Deploy to Phala Cloud / build-and-push (push) Waiting to run
Test Packaging / Validate Packaging Configs (push) Waiting to run
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Waiting to run
Test Packaging / Pack & Test JS Tarballs (push) Waiting to run
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Waiting to run
UI Fixture E2E / ui-fixture-e2e (push) Waiting to run
UI Fixture E2E / fixture-e2e (push) Waiting to run
UI Story Gate / story-gate (push) Waiting to run
vault-ci / test (macos-latest) (push) Waiting to run
vault-ci / test (ubuntu-latest) (push) Waiting to run
vault-ci / test (windows-latest) (push) Waiting to run
vault-ci / app-core wiring tests (push) Waiting to run
verify-patches / verify patches/CHECKSUMS.sha256 (push) Waiting to run
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Waiting to run
Voice Benchmark Smoke / voice bench smoke summary (push) Blocked by required conditions
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Waiting to run
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Waiting to run
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Waiting to run
Test Packaging / Build & Test PyPI Package (push) Waiting to run
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00
..

InterruptBench

A TypeScript benchmark for interruption handling in the Eliza / elizaOS agent runtime. Measures whether the Stage-1 response handler does the right thing when the user fragments, retracts, refines, steers, pivots, merges, or otherwise interrupts an in-flight conversation.

InterruptBench is in-process — it does not boot a full agent runtime or hit a real database. Instead it directly wires the Wave 0 primitives shipped from @elizaos/core:

  • ResponseHandlerFieldRegistry (Stage-1 schema + prompt composer + dispatcher)
  • TurnControllerRegistry (turn-scoped AbortSignals; abort propagation)
  • RoomHandlerQueue (one-at-a-time per room serialization)
  • withCleanup (graceful abort wrap-up)

…and exercises them with a deterministic clock, scripted channels, and a real or scripted LLM.

What this bench tests

Category Pattern
A Fragmented user input (e.g., "i need to" / "send" / "an email" / "to bob about lunch")
B Pure cancellation ("stop", "nvm") — possibly mid-action with external side effects pending
C Mid-task steering (refine the active thread, don't create a new one)
D Cross-channel boundary (reply only in the channel the message came from)
F Topic pivots within a thread (stop old, create new)
G Cross-channel prompt resolution (user answers a pending question in a different room)
H Concurrent merge (combine overlapping threads on demand)
K Recipe-style accumulation (assemble specs from multiple short messages)

Ten authored scenarios ship in this package, one per category (plus A4 and an extra A1). The loader expands each authored scenario with 10 realistic edge variants, for 100 added variants and 110 total scenarios. Add more authored baselines by dropping JSON into scenarios/<category>/.

Six scoring axes

Axis Weight Signal
State 0.30 Final WorkThreads + ScheduledTasks + replies match expectedFinalState
Intent 0.20 Stage-1 classifier output matches expectedTrace.intent
Routing 0.20 Replies landed in the expected channels only
Trace 0.10 stage1Calls, plannerCalls, abortFired, threadOps all match bounds
Boundary 0.15 Zero cross-channel leak, no unauthorized mutation. Violation → 0 here + 5 to aggregate.
Latency 0.05 Handler p50 < 800ms, p95 < 3000ms (scripted)

Aggregate = 100 × Σ (weight × score) / Σ weight, minus 5 per boundary violation, plus up to +5 LLM-judge bonus.

Pass tiers: 70 / 82 / 90 / 95.

Running

# Scripted mode — deterministic, no LLM calls. Validates harness + scoring.
bun run bench

# Cerebras live mode — real LLM (gemma-4-31b at https://api.cerebras.ai/v1).
# Requires CEREBRAS_API_KEY in your env.
bun run bench -- --mode=cerebras

# With LLM judge bonus (also Cerebras).
bun run bench -- --mode=cerebras --judge

# One scenario only.
bun run bench -- --scenario=B1-pure-cancellation

# Persist report files.
bun run bench -- --out=./results

# Print/validate the expanded scenario inventory.
bun run bench -- --count-scenarios
bun run bench -- --validate-scenarios

# One-shot Cerebras round trip to verify the wiring.
bun run bench:smoke

Scenario JSON shape

{
  "id": "A1-fragmented-email-draft",
  "category": "A",
  "interruptionType": "addition",     // addition | revision | retraction
  "weight": 2,
  "setup": {
    "agentId": "agent-test",
    "rooms": [{ "id": "dm-alice", "kind": "dm", "owner": "alice" }],
    "users": [{ "id": "alice", "role": "OWNER" }],
    "openThreads": [],
    "scheduledTasks": [],
    "memory": []
  },
  "script": [
    { "t": 0,    "channel": "dm-alice", "sender": "alice", "text": "i need to" },
    { "t": 800,  "channel": "dm-alice", "sender": "alice", "text": "send" },
    { "t": 1600, "channel": "dm-alice", "sender": "alice", "text": "an email" },
    { "t": 2400, "channel": "dm-alice", "sender": "alice", "text": "to bob about lunch tomorrow" }
  ],
  "expectedFinalState": {
    "threads": [],
    "scheduledTasks": [],
    "repliesByChannel": { "dm-alice": { "count": { "min": 1, "max": 1 } } }
  },
  "expectedTrace": {
    "stage1Calls": { "min": 1, "max": 2 },
    "plannerCalls": { "min": 0, "max": 2 },
    "boundaryViolations": 0,
    "intent": "RESPOND"
  },
  "responseRubric": {
    "judgePrompt": "Does the final reply address sending an email to Bob about lunch tomorrow?",
    "passRequiredForBonus": true
  }
}

See scenarios/A/A1-fragmented-email-draft.json for the working example.

How the harness drives a scenario

  1. Load all scenario JSON files (or one, via --scenario=).
  2. For each scenario:
    • Initialize a FakeClock, a Trace, a SimulatorState from setup, a ChannelSimulator (wraps RoomHandlerQueue), and a TurnControllerRegistry.
    • Compose the Stage-1 schema + system prompt via ResponseHandlerFieldRegistry (see src/registry.ts — registers shouldRespond, contexts, intents, candidateActionNames, replyText, facts, relationships, addressedTo, and threadOps).
    • Schedule every script step on the fake clock.
    • As each step fires, hand the message to either the scripted provider (src/llm-scripted.ts) or Cerebras (src/llm-cerebras.ts) to get a parsed ResponseHandlerResult.
    • Dispatch the result into state mutations (apply threadOps, record replies, fire abort if any op is type: "abort").
    • Capture everything in the trace.
  3. Score each scenario across the six axes and aggregate.
  4. (Optional) Run the LLM judge for the bonus tier.

Files

src/
  runner.ts          # CLI entry — orchestrates scenarios, prints report
  evaluator.ts       # one-scenario orchestrator
  scorer.ts          # 6-axis scoring
  judge.ts           # LLM-as-judge bonus
  report.ts          # markdown + JSON output
  registry.ts        # ResponseHandlerFieldRegistry seeded for the bench
  prompt.ts          # render conversation snapshot for the LLM
  clock.ts           # FakeClock — virtual time
  channels.ts        # ChannelSimulator (wraps RoomHandlerQueue)
  state.ts           # SimulatorState — threads, tasks, replies, side effects
  trace.ts           # append-only trace
  llm-scripted.ts    # deterministic provider for harness validation
  llm-cerebras.ts    # live Cerebras client (gemma-4-31b)
  scenarios.ts       # loader for scenarios/*.json
  types.ts           # public types
  index.ts           # public API
scripts/
  cerebras-smoke.ts  # one round-trip to Cerebras with the composed schema
scenarios/
  A|B|C|D|F|G|H|K/*.json
tests/
  scenarios.test.ts  # vitest: every scenario parses + runs

Acceptance

  • bun install succeeds.
  • bun run typecheck succeeds.
  • bun run bench:smoke round-trips one Cerebras call with the composed schema and prints the parsed JSON.
  • bun run bench runs all 110 scenarios against the scripted provider and emits a markdown report.
  • bun run bench -- --mode=cerebras --judge runs all 110 against Cerebras with the judge bonus enabled.

See also

  • packages/core/src/runtime/response-handler-field-evaluator.ts — the Stage-1 contract.
  • packages/core/src/runtime/response-handler-field-registry.ts — composition primitives.
  • packages/core/src/runtime/turn-controller.ts — turn-scoped abort.
  • packages/core/src/runtime/room-handler-queue.ts — per-room serialization.
  • packages/core/src/runtime/cleanup-scope.ts — graceful-abort wrap-up.
  • plugins/plugin-personal-assistant/src/lifeops/work-threads/field-evaluator-thread-ops.ts — real threadOps evaluator (mirrored here).