Verify before you say done.
An evidence-first foundation for mobile domestic robots: bounded actions, replayable events, and a verifier that can say confirmed, refuted, or insufficient evidence.
Robot demos often treat “command accepted” as “task complete”. Workbench keeps the proof in the loop:
goal -> bounded planner -> semantic action -> trusted executor
\-> event store -> verifier -> replay/dashboard
| Layer | Responsibility |
|---|---|
| Intent | Select from a small, typed action vocabulary |
| Execution | Dispatch through trusted runtime code |
| Verification | Check post-action evidence; never guess success |
| Replay | Rebuild the state from an append-only event stream |
Requirements: Python 3.12. No GPU is required for the offline runtime.
git clone https://github.com/Quchaosheng/workbench-desk-robot.git
cd workbench-desk-robot
python -m pip install -e ".[dev]"
python tools/scripts/sim_cli.py doctor
python tools/scripts/sim_cli.py run normal-001 --runner scripted --output-dir runs/demoRun the full portable checks:
python -m pytest -q
python -m ruff check .The scripted runner writes a replayable artifact (manifest, scene, events,
logs, metadata, and SHA-256 checksums) labelled SCRIPTED_FIXTURE.
- Evidence-first verification with
confirmed,refuted, andinsufficient_evidence. - Strict JSON schemas and matching Pydantic contracts.
- Append-only SQLite event storage with integrity-checked replay.
- Fail-closed policy validation for bounded semantic tools.
- Read-only dashboard and deterministic simulation fixtures.
- Software-only foundations for MCU, CAN, Motion, and BSP boundaries.
OmniLink AI is an independent service for searching maintenance notes, ADRs, issues, and Workbench run summaries. It is not a planner, executor, verifier, or robot-control dependency.
git clone https://github.com/vivekmaru/omnilink-ai.git
cd omnilink-ai
npm install
npm run dev # normally http://127.0.0.1:3000Workbench uses the standard-library adapter in integrations/omnilink/:
from integrations.omnilink import OmniLinkClient
client = OmniLinkClient("http://127.0.0.1:3000")
results = client.search("gripper calibration")
answer = client.ask("Which calibration notes mention the gripper?")Only bounded run summaries are exportable. Raw JSONL, TaskGraph,
SemanticAction, action results, camera data, and safety state stay in
Workbench. Catch OmniLinkError so an unavailable knowledge service cannot
block offline operation. See the integration guide
for deployment and security requirements.
The offline runtime and software boundaries are tested. End-to-end Gazebo worlds,
real perception, semantic motion execution, and physical hardware evidence are
not yet release claims. See docs/architecture/ and
sim/README.md for the current evidence boundary.
- User guide
- Product evidence layer
- System architecture
- Simulation boundary
- Motion foundation
- Safety MCU
- Robot BSP
- Deployment
- Security policy
Apache-2.0. See LICENSE.
