Skip to main content

Watson

Robotics logging, bag storage, and experiment retrieval. Watson records and retrieves experiments; robosim-prorokLab plots and renders their recordings.

Watson builds on Goggles, preserving its implementation, tests, MIT license, and Git history at upstream commit 5b850d3d89b3b7cebb364f89722ff0fb9f1684b8. See GOGGLES.md for the complete inherited API and examples.

Install

Python 3.10 or newer:

pip install robo-watson
pip install 'robo-watson[wandb]'
pip install 'robo-watson[jax]'

These commands become available after the first PyPI release. Until then, repository collaborators can clone the repository and run pip install -e ..

The distribution is robo-watson; the public import is watson. It also ships goggles for compatibility. Use this distribution in place of robo-goggles; installing both in the same environment would give them ownership of the same package files. The GitHub repository is private; distributions uploaded to PyPI are public and include the Python source code.

Log experiments

import watson as wt

wt.attach(wt.ConsoleHandler(name="navigation.console"))
logger = wt.get_logger("navigation", with_metrics=True)
logger.info("Experiment started")
logger.scalar("tracking_error", 0.12, step=1)
wt.finish()

All of Goggles' public top-level exports are available through watson: console and JSONL logging, scoped routing, multiprocessing and shared-memory transport, W&B metrics and media, grouped runs and tags, artifacts, timing, exception tracing, YAML configuration, filtering, and graceful shutdown. Specialized modules retain their existing imports: goggles.history, goggles.media, goggles.config, goggles.types, and goggles.filters. JAX histories require the jax extra. W&B features require the wandb extra.

Choose a separate logging socket for each application before importing Watson:

export GOGGLES_SOCKET=/tmp/watson-navigation.sock

Related worker processes must share that socket. Existing GOGGLES_* environment settings continue to apply.

Save and find bags

Save a completed recording file (.bag, .db3, .mcap, etc.) or an entire recording directory. For run folders containing a rosbag/ subdirectory, use --bag-path rosbag; copying the full run preserves rollout sidecars.

watson save /data/flight --bag-path rosbag --name navigation \
  --tag baseline --robosim /path/to/robosim-prorokLab \
  --wandb-run team/navigation/run_id
watson list --name navigation --tag baseline
watson show BAG_ID
watson path BAG_ID
watson verify BAG_ID

Storage defaults to ~/.watson/bags. Set WATSON_BAGS or use watson --root /data/bags ... to choose another store.

from watson import Bag, BagStore

store = BagStore("/data/saved-bags")
bag = store.save(
    "/data/flight", bag_path="rosbag", name="navigation",
    tags=("baseline",), robosim="/path/to/robosim-prorokLab",
    wandb_run="team/navigation/run_id",
)
bag = store.get(bag.id)
bag.verify()
print(bag.path)
print(store.list(name="navigation", tag="baseline"))

Each save has a unique ID and a portable manifest.json containing the original source path, relative bag path, name, tags, creation time, W&B run reference, file hashes, and optional RoboSim repository path, origin URL, commit, and dirty state. Bag.load(directory) reads an exported recording. The relative payload path still works after transferring the recording to another machine. Repository provenance is a reference; it does not copy a checkout or capture uncommitted changes.

Saves copy data, reject symlinks, and become visible only after the copy and manifest succeed. Sources are never removed. Save only after recording has stopped: a live recording cannot be copied as a consistent snapshot. Hashes check accidental corruption; they do not authenticate the artifact publisher.

W&B organization and retrieval

Use project, group, and tags on WandBHandler as described in GOGGLES.md. To attach a bag to an existing SDK run:

import wandb
from watson import BagStore
from watson.tracking import fetch_bag, find_runs, upload_bag

store = BagStore()
with wandb.init(project="navigation", group="baseline", tags=["flight"]) as run:
    bag = store.save("/data/flight", bag_path="rosbag", wandb_run=run.path)
    artifact = upload_bag(bag, run)

for run in find_runs("team/navigation", group="baseline", tag="flight"):
    for artifact in run.logged_artifacts():
        if artifact.type == "bag":
            print(artifact.qualified_name)

bag = fetch_bag("team/navigation/bag-BAG_ID:v0", BagStore("/data/retrieved"))

upload_bag verifies files and attaches the manifest and payload to the caller's run. It does not start or finish a run. For Goggles-managed W&B runs, use the inherited logger's artifact method with path=str(bag.directory), name=f"bag-{bag.id}", and type="bag" in its payload. Keep the directory available until wt.finish() completes the asynchronous upload.

wandb login
watson --root /data/retrieved fetch team/navigation/bag-BAG_ID:v0

Fetch validates payload paths and checks hashes before admitting a downloaded recording to the store. Existing IDs are never overwritten. Choose a version such as :v0 for reproducible retrieval; :latest follows the latest upload. W&B project access and visibility follow your W&B account settings, independently of this repository's GitHub privacy. Uploads include source and repository paths from the manifest; review those before sharing an artifact.

Render with RoboSim

Watson returns a real local bag path. From the RoboSim checkout:

python -m robosim.bag "$(watson path BAG_ID)"
python -m robosim.build "bag.path=$(watson path BAG_ID)"

The first command decodes a summary; the second uses RoboSim's rendering pipeline and configuration. RoboSim's multi-flight viewer discovers recordings under its own bags/ directory; Watson does not change that checkout or install its rendering dependencies. Bag format support is determined by RoboSim.

Development

uv sync --extra dev --extra wandb --extra jax
uv run pytest
uv run pre-commit run --all-files
uv run pre-commit run --all-files --hook-stage pre-push
uv build

Watson additions live in small modules under watson/: bag manifests, local storage, repository provenance, optional W&B tracking, and the CLI. New code has no inline comments. The inherited goggles/ implementation is kept intact to retain its features and make future upstream updates practical. The upstream remote tracks Goggles. See Publishing for the one-time PyPI setup and version-tag release process.

CodeQL analysis for this private repository is saved as a GitHub Actions artifact because GitHub code-scanning uploads are not enabled here.

Metadata

Release files for robo-watson 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for robo-watson 0.1.0
File Size Uploaded Provenance Actions
robo_watson-0.1.0.tar.gz 119.0 kB With provenance Details for robo_watson-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for robo-watson 0.1.0
File Interpreter ABI Platform Actions
robo_watson-0.1.0-py3-none-any.whl Python 3 none any Details for robo_watson-0.1.0-py3-none-any.whl

Total release size: 223.7 kB

Release files / robo_watson-0.1.0.tar.gz

Download URL robo_watson-0.1.0.tar.gz
Size 119.0 kB
Tags Source
SHA-256 checksum
How to use checksums
fd90eab396b33a7fd9693b571150625f6844b23d3d1f69908e0032a70139f618
BLAKE2b-256 checksum
How to use checksums
da02d2fac1786c86a40b1302f4cab66d0c93ed794d083f63cbc162c2a0dea392
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Release files / robo_watson-0.1.0-py3-none-any.whl

Download URL robo_watson-0.1.0-py3-none-any.whl
Size 104.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
61176028992eb1daf75d89121725072d6fdaecceb2fbcf92105ec6f70c61ae01
BLAKE2b-256 checksum
How to use checksums
fa4fb69901552ae53239833f088b63db5485daadc9a51ce84aa0c75742d2bcf1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

Security for robo-watson 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for robo_watson-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page