Skip to content

docs(limx): bind final TRON 2 visual evidence #6

docs(limx): bind final TRON 2 visual evidence

docs(limx): bind final TRON 2 visual evidence #6

name: LimX TRON 2 Tier 1 contract
on:
# Live settlement runs only where repository secrets are available. External
# pull requests still execute every offline authorization and simulator gate.
workflow_dispatch:
pull_request:
paths:
- "tunnel/**"
- "bridge/common/**"
- "registry/vendors/limx/tron2/**"
- "scripts/registry/**"
- ".github/workflows/limx-tron2-tier1.yml"
push:
branches: [limx-tron2-tier-1]
paths:
- "tunnel/**"
- "bridge/common/**"
- "registry/vendors/limx/tron2/**"
- "scripts/registry/**"
- ".github/workflows/limx-tron2-tier1.yml"
env:
PROFILE: registry/vendors/limx/tron2/limx.tron2.wheeled-mujoco-webots-obstacle-nav.v1
permissions:
contents: read
jobs:
tunnel-and-contract:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.25"
- name: Build and test the real Go Tunnel
run: |
make build
make test
- uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install pinned profile dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -r "$PROFILE/bridge/requirements-dev.txt"
python "$PROFILE/bridge/download_vendor_assets.py"
- name: Run fail-closed profile and registry contracts
env:
PYTHONPATH: ${{ github.workspace }}/${{ env.PROFILE }}/bridge
run: |
python scripts/registry/validate_profiles.py --registry-root registry/vendors/limx
python -m pytest -q "$PROFILE/tests/test_contract.py" "$PROFILE/tests/test_bridge_contract.py" "$PROFILE/tests/test_registry_contract.py"
- name: Prove isValid false cannot publish, actuate, or settle
env:
PYTHONPATH: ${{ github.workspace }}/${{ env.PROFILE }}/bridge
TUNNEL_BIN: ${{ github.workspace }}/bin/tunnel
LD_LIBRARY_PATH: ${{ github.workspace }}/.zenoh-c/lib
run: python -m pytest -q "$PROFILE/tests/test_x402_invalid_payment_gate.py"
tron2-mujoco:
name: TRON 2 real MuJoCo policy and Zenoh replay proof
runs-on: ubuntu-latest
timeout-minutes: 20
needs: tunnel-and-contract
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install pinned profile dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -r "$PROFILE/bridge/requirements-dev.txt"
python "$PROFILE/bridge/download_vendor_assets.py"
- name: Run official ONNX policy and real Zenoh bridge
env:
PYTHONPATH: ${{ github.workspace }}/${{ env.PROFILE }}/bridge
run: |
python -m pytest -q "$PROFILE/tests/test_mujoco_runtime.py" "$PROFILE/tests/test_real_zenoh_bridge.py"
python "$PROFILE/bridge/run_mujoco_obstacle_course.py" --json-output "$PROFILE/artifacts/mujoco_result.json"
- name: Upload MuJoCo evidence
if: always()
uses: actions/upload-artifact@v4
with:
name: limx-tron2-mujoco-evidence
path: ${{ env.PROFILE }}/artifacts/mujoco_result.json
retention-days: 90
if-no-files-found: error
tron2-sim2sim:
name: TRON 2 Sim-to-Sim (MuJoCo + Webots)
runs-on: ubuntu-latest
timeout-minutes: 35
needs: tunnel-and-contract
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install Webots and simulator dependencies
run: |
sudo apt-get update
sudo apt-get install -y wget xvfb \
libgl1 libglu1-mesa libglib2.0-0 libgomp1 libfontconfig1 \
libxkbcommon0 libdbus-1-3 libx11-6 libx11-xcb1 libxcb1 \
libxext6 libxrender1 libxtst6 libxi6 libxss1 libqt5core5a \
libqt5gui5 libqt5widgets5 libqt5network5 libqt5svg5 \
libqt5webengine5 libqt5webenginecore5 libqt5webenginewidgets5 \
libqt5multimedia5 libqt5printsupport5 libqt5concurrent5 \
libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 \
libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxkbcommon-x11-0
sudo apt-get install -y libsndio7.0 2>/dev/null || sudo apt-get install -y libsndio-dev 2>/dev/null || true
python -m pip install --upgrade pip
python -m pip install -r "$PROFILE/bridge/requirements.txt"
python "$PROFILE/bridge/download_vendor_assets.py"
wget -q https://github.com/cyberbotics/webots/releases/download/R2025a/webots-R2025a-x86-64.tar.bz2
sudo tar xjf webots-R2025a-x86-64.tar.bz2 -C /usr/local
- name: Run the same course and official model variant in both simulators
env:
PYTHONPATH: ${{ github.workspace }}/${{ env.PROFILE }}/bridge
WEBOTS_EXE: /usr/local/webots/webots
QT_QPA_PLATFORM: offscreen
run: xvfb-run -a -s "-screen 0 1280x1024x24" python "$PROFILE/bridge/run_sim2sim_validation.py"
- name: Upload Sim-to-Sim evidence
if: always()
uses: actions/upload-artifact@v4
with:
name: limx-tron2-sim2sim-evidence
path: ${{ env.PROFILE }}/artifacts/
retention-days: 90
if-no-files-found: error
tron2-base-sepolia-e2e:
name: TRON 2 Base Sepolia settlement evidence
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
concurrency:
# One live Tunnel may own this robot identity at a time, including
# workflow_dispatch runs from different refs.
group: limx-tron2-base-sepolia-limx-tron2-wf-sim-01
cancel-in-progress: false
runs-on: ubuntu-latest
timeout-minutes: 25
needs: tunnel-and-contract
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.25"
- uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Install dependencies and real Tunnel
run: |
python -m pip install --upgrade pip
python -m pip install -r "$PROFILE/bridge/requirements.txt"
python "$PROFILE/bridge/download_vendor_assets.py"
make build
- name: Start local Zenoh router
run: |
wget -q https://github.com/eclipse-zenoh/zenoh/releases/download/1.9.0/zenoh-1.9.0-x86_64-unknown-linux-gnu-standalone.zip
unzip -q zenoh-1.9.0-x86_64-unknown-linux-gnu-standalone.zip -d .zenoh-router
.zenoh-router/zenohd > zenohd.log 2>&1 &
sleep 2
grep -q "zenohd" zenohd.log
- name: Run first-action Base Sepolia proof
env:
PRIVATE_KEY: ${{ secrets.BASE_SEPOLIA_PRIVATE_KEY }}
ROBO_PAYEE_ADDRESS: ${{ secrets.ROBO_PAYEE_ADDRESS }}
TUNNEL_BIN: ${{ github.workspace }}/bin/tunnel
LD_LIBRARY_PATH: ${{ github.workspace }}/.zenoh-c/lib
PROXY_WS_URL: wss://api.fabric.foundation/api/core/ws/robot
PYTHONPATH: ${{ github.workspace }}/${{ env.PROFILE }}/bridge
run: python "$PROFILE/bridge/run_live_base_sepolia_e2e.py" --ci
- name: Upload generated Base Sepolia evidence
if: always()
uses: actions/upload-artifact@v4
with:
name: limx-tron2-base-sepolia-evidence
path: ${{ env.PROFILE }}/artifacts/base_sepolia_result_*.json
retention-days: 90
if-no-files-found: error