{"id":44778926,"url":"https://github.com/maruyamakoju/deltatau-audit","last_synced_at":"2026-02-22T21:01:14.292Z","repository":{"id":338739186,"uuid":"1158929268","full_name":"maruyamakoju/deltatau-audit","owner":"maruyamakoju","description":"Time Robustness Audit for RL agents — measures timing reliance, deployment robustness, and stress resilience","archived":false,"fork":false,"pushed_at":"2026-02-19T18:57:28.000Z","size":1380,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-19T19:49:28.978Z","etag":null,"topics":["ci-cd","deployment","gymnasium","mujoco","reinforcement-learning","rl-agents","robustness","stable-baselines3","testing","timing"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maruyamakoju.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-16T05:06:28.000Z","updated_at":"2026-02-19T18:57:31.000Z","dependencies_parsed_at":"2026-02-19T18:00:36.217Z","dependency_job_id":null,"html_url":"https://github.com/maruyamakoju/deltatau-audit","commit_stats":null,"previous_names":["maruyamakoju/deltatau-audit"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/maruyamakoju/deltatau-audit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maruyamakoju%2Fdeltatau-audit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maruyamakoju%2Fdeltatau-audit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maruyamakoju%2Fdeltatau-audit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maruyamakoju%2Fdeltatau-audit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maruyamakoju","download_url":"https://codeload.github.com/maruyamakoju/deltatau-audit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maruyamakoju%2Fdeltatau-audit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29661585,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T16:33:43.953Z","status":"ssl_error","status_checked_at":"2026-02-20T16:33:43.598Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ci-cd","deployment","gymnasium","mujoco","reinforcement-learning","rl-agents","robustness","stable-baselines3","testing","timing"],"created_at":"2026-02-16T07:19:15.566Z","updated_at":"2026-02-21T20:00:54.728Z","avatar_url":"https://github.com/maruyamakoju.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# deltatau-audit\n\n[![PyPI version](https://img.shields.io/pypi/v/deltatau-audit)](https://pypi.org/project/deltatau-audit/)\n[![CI](https://github.com/maruyamakoju/deltatau-audit/actions/workflows/audit-smoke.yml/badge.svg)](https://github.com/maruyamakoju/deltatau-audit/actions/workflows/audit-smoke.yml)\n[![Python 3.9+](https://img.shields.io/pypi/pyversions/deltatau-audit)](https://pypi.org/project/deltatau-audit/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/maruyamakoju/deltatau-audit/blob/main/notebooks/quickstart.ipynb)\n\n**Audited by deltatau-audit** (CartPole speed-randomized GRU):\n\n![deployment](https://raw.githubusercontent.com/maruyamakoju/deltatau-audit/main/badges/badge-deployment.svg)\n![stress](https://raw.githubusercontent.com/maruyamakoju/deltatau-audit/main/badges/badge-stress.svg)\n![status](https://raw.githubusercontent.com/maruyamakoju/deltatau-audit/main/badges/badge-status.svg)\n\n**Find and fix timing failures in RL agents.**\n\nRL agents silently break when deployment timing differs from training — frame drops, variable inference latency, sensor rate changes. `deltatau-audit` finds these failures **and fixes them in one command**.\n\n## Try it in 30 seconds\n\n```bash\npip install \"deltatau-audit[demo]\"\npython -m deltatau_audit demo cartpole\n# Faster: python -m deltatau_audit demo cartpole --workers auto\n```\n\nNo GPU. No MuJoCo. Just `pip install` and run. You'll see a Before/After comparison:\n\n| Scenario | Before (Baseline) | After (Speed-Randomized) | Change |\n|----------|:-----------------:|:------------------------:|:------:|\n| 5x speed | **12%** | **49%** | +37pp |\n| Speed jitter | **66%** | **115%** | +49pp |\n| Observation delay | **82%** | **95%** | +13pp |\n| Mid-episode spike | **23%** | **62%** | +39pp |\n| **Deployment** | **FAIL** (0.23) | **DEGRADED** (0.62) | +0.39 |\n\nThe standard agent collapses under timing perturbations. Speed-randomized training dramatically improves robustness. Full HTML reports with charts are generated in `demo_report/`.\n\n## The same pattern at MuJoCo scale: HalfCheetah PPO\n\nA PPO agent trained to reward ~990 on HalfCheetah-v5 shows even more catastrophic timing failures — **all 4 scenarios statistically significant (95% bootstrap CI)**:\n\n| Scenario | Return (% of nominal) | 95% CI | Drop |\n|----------|:--------------------:|:------:|:----:|\n| Observation delay (1 step) | **3.8%** | [2.4%, 5.2%] | -96% |\n| Speed jitter (2 +/- 1) | **25.4%** | [23.5%, 27.8%] | -75% |\n| 5x speed (unseen) | **-9.3%** | [-10.6%, -8.4%] | -109% |\n| Mid-episode spike (1-\u003e5-\u003e1) | **90.9%** | [86.3%, 97.8%] | -9% |\n\nA single step of observation delay destroys 96% of performance. The agent goes *negative* at 5x speed.\n\n![HalfCheetah robustness audit results](https://raw.githubusercontent.com/maruyamakoju/deltatau-audit/main/assets/halfcheetah_robustness.png)\n\n[View interactive report](https://maruyamakoju.github.io/deltatau-audit/sample/halfcheetah/) | [Download report ZIP](https://github.com/maruyamakoju/deltatau-audit/releases/download/assets/halfcheetah_audit_report.zip)\n\n### Speed-randomized training fixes the problem\n\n| Scenario | Before (Standard) | After (Speed-Randomized) | Change |\n|----------|:-----------------:|:------------------------:|:------:|\n| Observation delay | **2%** | **148%** | +146pp |\n| Speed jitter | **28%** | **121%** | +93pp |\n| 5x speed (unseen) | **-12%** | **38%** | +50pp |\n| Mid-episode spike | **100%** | **113%** | +13pp |\n| **Deployment** | **FAIL** (0.02) | **PASS** (1.00) | |\n| **Quadrant** | deployment_fragile | deployment_ready | |\n\n![Robust agent audit results](https://raw.githubusercontent.com/maruyamakoju/deltatau-audit/main/assets/halfcheetah_robust_robustness.png)\n\n[View Before report](https://maruyamakoju.github.io/deltatau-audit/sample/halfcheetah_before/) | [View After report](https://maruyamakoju.github.io/deltatau-audit/sample/halfcheetah_after/)\n\n\u003cdetails\u003e\n\u003csummary\u003eReproduce HalfCheetah results\u003c/summary\u003e\n\n```bash\npip install \"deltatau-audit[sb3,mujoco]\"\ngit clone https://github.com/maruyamakoju/deltatau-audit.git\ncd deltatau-audit\npython examples/audit_halfcheetah.py              # standard PPO audit (~30 min)\npython examples/train_robust_halfcheetah.py        # train robust PPO (~30 min)\npython examples/audit_before_after.py              # Before/After comparison\n```\n\nOr download pre-trained models from [Releases](https://github.com/maruyamakoju/deltatau-audit/releases/tag/assets).\n\n\u003c/details\u003e\n\n## Install\n\n```bash\npip install deltatau-audit            # core\npip install \"deltatau-audit[demo]\"    # + CartPole demo (recommended start)\npip install \"deltatau-audit[sb3,mujoco]\"  # + SB3 + MuJoCo environments\n```\n\n## Find and Fix in One Command\n\n```bash\npip install \"deltatau-audit[sb3]\"\ndeltatau-audit fix-sb3 --algo ppo --model my_model.zip --env HalfCheetah-v5\n```\n\nThis single command:\n1. **Audits** your model (finds timing failures)\n2. **Retrains** with speed randomization (the fix)\n3. **Re-audits** the fixed model (verifies the fix)\n4. **Generates** Before/After comparison report\n\n```\nBEFORE vs AFTER\n\n  Scenario        Before       After      Change\n  ------------  ----------  ----------  ----------\n  speed_5x           12.7%       76.6%  +    63.9pp\n  jitter             43.7%      100.0%  +    56.3pp\n  delay             100.0%      100.0%  +     0.0pp\n  spike              26.7%       91.9%  +    65.2pp\n\n  Deployment: FAIL (0.27) -\u003e MILD (0.92)\n  Quadrant:   deployment_fragile -\u003e deployment_ready\n```\n\nOutput: fixed model (`.zip`) + HTML reports + `comparison.html` (+ `comparison.md`).\n\nOptions: `--timesteps` (training budget), `--speed-min`/`--speed-max` (speed range), `--workers` (parallel episodes), `--seed` (reproducible), `--ci` (pipeline gate).\n\n## Audit Your Own SB3 Model\n\nJust want the diagnosis? Use `audit-sb3`:\n\n```bash\ndeltatau-audit audit-sb3 --algo ppo --model my_model.zip --env HalfCheetah-v5 --out my_report/\n\n# Faster — use all CPU cores:\ndeltatau-audit audit-sb3 --algo ppo --model my_model.zip --env HalfCheetah-v5 --workers auto\n\n# Reproducible:\ndeltatau-audit audit-sb3 --algo ppo --model my_model.zip --env HalfCheetah-v5 --seed 42\n```\n\nNo model handy? Try with a sample:\n\n```bash\ngh release download assets -R maruyamakoju/deltatau-audit -p cartpole_ppo_sb3.zip\ndeltatau-audit audit-sb3 --algo ppo --model cartpole_ppo_sb3.zip --env CartPole-v1\n```\n\nSupported algorithms: `ppo`, `sac`, `td3`, `a2c`. Any Gymnasium environment ID works.\n\n\u003cdetails\u003e\n\u003csummary\u003ePython API (for custom workflows)\u003c/summary\u003e\n\n```python\n# Audit only\nfrom deltatau_audit.adapters.sb3 import SB3Adapter\nfrom deltatau_audit.auditor import run_full_audit\nfrom deltatau_audit.report import generate_report\nfrom stable_baselines3 import PPO\nimport gymnasium as gym\n\nmodel = PPO.load(\"my_model.zip\")\nadapter = SB3Adapter(model)\nresult = run_full_audit(\n    adapter,\n    lambda: gym.make(\"HalfCheetah-v5\"),\n    speeds=[1, 2, 3, 5, 8],\n    n_episodes=30,\n    n_workers=4,   # parallel episode collection\n    seed=42,       # reproducible results\n)\ngenerate_report(result, \"my_audit/\", title=\"My Agent Audit\")\n\n# Full fix pipeline\nfrom deltatau_audit.fixer import fix_sb3_model\nresult = fix_sb3_model(\"my_model.zip\", \"ppo\", \"HalfCheetah-v5\",\n                       output_dir=\"fix_output/\")\n# result[\"fixed_model_path\"] -\u003e \"fix_output/ppo_fixed.zip\"\n```\n\n\u003c/details\u003e\n\n## What It Measures\n\n| Badge | What it tests | How |\n|-------|--------------|-----|\n| **Reliance** | Does the agent *use* internal timing? | Tampers with internal Δτ, measures value prediction error |\n| **Deployment** | Does the agent *survive* realistic timing changes? | Speed jitter, observation delay, mid-episode spikes, sensor noise |\n| **Stress** | Does the agent *survive* extreme timing changes? | 5× speed (unseen during training) |\n\n**Deployment scenarios (4):** `jitter` (speed 2±1), `delay` (1-step obs lag), `spike` (1→5→1), `obs_noise` (Gaussian σ=0.1 on observations). All four run automatically.\n\nAgents without internal timing (standard PPO, SAC, etc.) get **Reliance: N/A** — only Deployment and Stress are tested.\n\n## Rating Scale\n\n| Rating | Return Ratio | Meaning |\n|--------|-------------|---------|\n| PASS | \u003e 95% | Production ready |\n| MILD | \u003e 80% | Minor degradation |\n| DEGRADED | \u003e 50% | Significant loss |\n| FAIL | \u003c= 50% | Agent breaks |\n\nAll return ratios include bootstrap 95% confidence intervals with significance testing.\n\n## Performance\n\nBy default all episodes run serially. Use `--workers` to parallelize:\n\n```bash\n# Auto-detect CPU core count (recommended for local runs)\ndeltatau-audit audit-sb3 --algo ppo --model model.zip --env HalfCheetah-v5 --workers auto\n\n# Explicit count\ndeltatau-audit demo cartpole --workers 4\n```\n\n| Workers | 30 episodes × 5 scenarios | Speedup |\n|---------|--------------------------|---------|\n| 1 (default) | ~3 min (CartPole) | — |\n| 4 | ~50 sec | ~3.5× |\n| auto (8 cores) | ~30 sec | ~6× |\n\n`--workers auto` maps to `os.cpu_count()`. Works with all `audit-*` and `demo` subcommands. For reproducibility, pair with `--seed 42` (parallel order is non-deterministic but per-episode seeds are fixed).\n\n## CI / Pipeline Integration\n\n```bash\npython -m deltatau_audit demo cartpole --ci --out ci_report/\n# exit 0 = pass, exit 1 = warn (stress), exit 2 = fail (deployment)\n```\n\nOutputs `ci_summary.json` and `ci_summary.md` for pipeline gates and PR comments.\n\n### Output formats\n\n```bash\n# PR-ready markdown table (appends to $GITHUB_STEP_SUMMARY in GitHub Actions)\ndeltatau-audit audit-sb3 --algo ppo --model model.zip --env CartPole-v1 \\\n  --format markdown\n\n# Structured JSON to stdout (pipe to jq, scripts, or downstream tools)\ndeltatau-audit audit-sb3 --algo ppo --model model.zip --env CartPole-v1 \\\n  --format json | jq '.summary'\n\n# Combine JSON + CI exit codes\ndeltatau-audit audit-sb3 ... --format json --ci \u003e result.json\n```\n\nJSON mode redirects all progress output to stderr so stdout contains only valid, parseable JSON. Reports are still generated in `--out`.\n\n### Markdown PR comment example\n\n```markdown\n## Time Robustness Audit: PASS\n\n| Badge | Rating | Score |\n|-------|--------|-------|\n| **Deployment** | **PASS** | 0.92 |\n| **Stress** | **MILD** | 0.81 |\n\n| Scenario | Category | Return | Significant |\n|----------|----------|--------|-------------|\n| jitter | Deployment | 95% | — |\n...\n```\n\n### GitHub Action (one line)\n\n```yaml\n- uses: maruyamakoju/deltatau-audit@main\n  with:\n    command: audit-sb3\n    model: model.zip\n    algo: ppo\n    env: CartPole-v1\n    extras: sb3\n```\n\nOutputs `status`, `deployment-score`, `stress-score` for downstream steps. Exit code 0/1/2 for pass/warn/fail.\n\n\u003cdetails\u003e\n\u003csummary\u003eFull workflow examples\u003c/summary\u003e\n\n**CartPole demo gate (zero config):**\n\n```yaml\n- uses: maruyamakoju/deltatau-audit@main\n\n- uses: actions/upload-artifact@v4\n  if: always()\n  with:\n    name: timing-audit\n    path: audit_report/\n```\n\n**Audit your own SB3 model:**\n\n```yaml\n- uses: maruyamakoju/deltatau-audit@main\n  id: audit\n  with:\n    command: audit-sb3\n    model: model.zip\n    algo: ppo\n    env: HalfCheetah-v5\n    extras: \"sb3,mujoco\"\n\n- run: echo \"Deployment score: ${{ steps.audit.outputs.deployment-score }}\"\n```\n\n**Manual install (if you prefer):**\n\n```yaml\n- run: pip install \"deltatau-audit[sb3]\"\n- run: deltatau-audit audit-sb3 --algo ppo --model model.zip --env CartPole-v1 --ci\n```\n\n\u003c/details\u003e\n\n## Speed-Randomized Training (the fix)\n\nThe fix for timing failures is simple: train with variable speed. Use `JitterWrapper` during SB3 training:\n\n```python\nimport gymnasium as gym\nfrom stable_baselines3 import PPO\nfrom deltatau_audit.wrappers import JitterWrapper\n\n# Wrap env with speed randomization (speed 1-5)\nenv = JitterWrapper(gym.make(\"CartPole-v1\"), base_speed=3, jitter=2)\n\nmodel = PPO(\"MlpPolicy\", env)\nmodel.learn(total_timesteps=100_000)\nmodel.save(\"robust_model\")\n```\n\nThis is exactly what `fix-sb3` does under the hood. Use the wrapper directly when you want more control over training.\n\nAvailable wrappers: `JitterWrapper` (random speed), `FixedSpeedWrapper` (constant speed), `PiecewiseSwitchWrapper` (scheduled speed changes), `ObservationDelayWrapper` (sensor delay), `ObsNoiseWrapper` (Gaussian observation noise).\n\n## Audit CleanRL Agents\n\n[CleanRL](https://github.com/vwxyzjn/cleanrl) agents are plain `nn.Module` subclasses — no framework wrapper needed.\n\n```bash\ndeltatau-audit audit-cleanrl \\\n  --checkpoint runs/CartPole-v1/agent.pt \\\n  --agent-module ppo_cartpole.py \\\n  --agent-class Agent \\\n  --agent-kwargs obs_dim=4,act_dim=2 \\\n  --env CartPole-v1\n```\n\nOr via Python API:\n\n```python\nfrom deltatau_audit.adapters.cleanrl import CleanRLAdapter\n\n# Agent class must implement get_action_and_value(obs)\nadapter = CleanRLAdapter(agent, lstm=False)\nresult = run_full_audit(adapter, env_factory, speeds=[1, 2, 3, 5, 8])\n```\n\nLSTM agents: pass `--lstm` (CLI) or `CleanRLAdapter(agent, lstm=True)` (API).\n\nSee `examples/audit_cleanrl.py` for a complete runnable example.\n\n## Sim-to-Real Transfer\n\nTiming failures are one of the main causes of sim-to-real gaps. A policy that runs at 50 Hz in simulation may be deployed at 30 Hz or with variable latency in the real world — and collapse.\n\n```\nSimulation → Reality\n  50 Hz → 30 Hz (0.6x speed)\n  Fixed dt → Variable dt (jitter)\n  Instant obs → Observation delay (network/sensor lag)\n  Stable → Mid-episode spikes (system load)\n```\n\n`deltatau-audit` measures exactly these failure modes. **If your agent passes Deployment ≥ MILD, it is likely to survive real-world timing variation.**\n\n### IsaacLab / RSL-RL\n\nFor policies trained with IsaacLab (RSL-RL format):\n\n```python\nfrom deltatau_audit.adapters.torch_policy import TorchPolicyAdapter\n\n# Define your actor/critic architectures (same as training)\nactor = MyActorNet(obs_dim=48, act_dim=12)\ncritic = MyCriticNet(obs_dim=48)\n\n# Loads RSL-RL checkpoint format automatically\nadapter = TorchPolicyAdapter.from_checkpoint(\n    \"model.pt\",\n    actor=actor,\n    critic=critic,\n    is_discrete=False,  # continuous actions\n)\n\nresult = run_full_audit(adapter, env_factory, speeds=[1, 2, 3, 5])\n```\n\nSupported checkpoint formats:\n- `{\"model_state_dict\": {\"actor.*\": ..., \"critic.*\": ...}}` (RSL-RL)\n- `{\"actor\": state_dict, \"critic\": state_dict}` (explicit split)\n- Raw `state_dict` (actor-only)\n\nOr use a callable — no checkpoint loading needed:\n\n```python\n# Works with any framework's inference API\ndef my_act(obs):\n    action = runner.alg.actor_critic.act(obs)\n    value  = runner.alg.actor_critic.evaluate(obs)\n    return action, value\n\nadapter = TorchPolicyAdapter(my_act)\n```\n\nSee `examples/isaaclab_skeleton.py` for a complete IsaacLab skeleton.\n\n## Custom Adapters\n\nImplement `AgentAdapter` (see `deltatau_audit/adapters/base.py`):\n\n```python\nfrom deltatau_audit.adapters.base import AgentAdapter\n\nclass MyAdapter(AgentAdapter):\n    def reset_hidden(self, batch=1, device=\"cpu\"):\n        return torch.zeros(batch, hidden_dim)\n\n    def act(self, obs, hidden):\n        # Returns: (action, value, hidden_new, dt_or_None)\n        ...\n        return action, value, hidden_new, None\n```\n\nBuilt-in adapters: `SB3Adapter` (PPO/SAC/TD3/A2C), `SB3RecurrentAdapter` (RecurrentPPO), `CleanRLAdapter` (CleanRL MLP/LSTM), `TorchPolicyAdapter` (IsaacLab/RSL-RL/custom), `InternalTimeAdapter` (Dt-GRU models).\n\n## Compare Two Audits\n\nAfter auditing a fixed model, compare to a previous result in one command:\n\n```bash\n# Generate comparison.html alongside the new audit\ndeltatau-audit audit-sb3 --algo ppo --model fixed.zip --env HalfCheetah-v5 \\\n  --compare before_audit/summary.json --out after_audit/\n```\n\nOr use the `diff` subcommand directly (writes both `.md` and `.html`):\n\n```bash\npython -m deltatau_audit diff before/summary.json after/summary.json --out comparison.md\n```\n\n## Experiment Tracking\n\nPush audit metrics to Weights \u0026 Biases or MLflow after any audit:\n\n```bash\npip install \"deltatau-audit[wandb]\"\ndeltatau-audit audit-sb3 --model m.zip --algo ppo --env CartPole-v1 \\\n    --wandb --wandb-project my-project --wandb-run baseline\n\npip install \"deltatau-audit[mlflow]\"\ndeltatau-audit audit-sb3 --model m.zip --algo ppo --env CartPole-v1 \\\n    --mlflow --mlflow-experiment my-experiment\n```\n\nOr from Python:\n\n```python\nfrom deltatau_audit.tracker import log_to_wandb, log_to_mlflow\n\nresult = run_full_audit(adapter, env_factory)\nlog_to_wandb(result, project=\"my-project\")\nlog_to_mlflow(result, experiment_name=\"my-experiment\")\n```\n\nLogged scalars: `deployment_score`, `stress_score`, `reliance_score`, per-scenario `return_ratio`. Logged params: `deployment_rating`, `stress_rating`, `quadrant`. Missing tracker packages print a warning instead of crashing.\n\n## Adaptive Sampling\n\nFor high-confidence results, use adaptive episode sampling:\n\n```bash\ndeltatau-audit audit-sb3 --model m.zip --algo ppo --env HalfCheetah-v5 \\\n    --adaptive --target-ci-width 0.05 --max-episodes 300\n```\n\nInstead of a fixed episode count, this keeps sampling until every scenario's 95% bootstrap CI width on the return ratio drops below `--target-ci-width` (default: 0.10), or until `--max-episodes` is reached (default: 500).\n\n## Failure Diagnostics\n\nWhen scenarios fail, the audit automatically diagnoses the root cause:\n\n```\nFailure Analysis\n  FAIL  jitter — Speed Jitter Sensitivity\n        The agent cannot handle variable-frequency control.\n        Root cause: Policy overfits to fixed dt → breaks when step timing varies.\n        Fix: Train with JitterWrapper(base_speed=3, jitter=2).\n```\n\nThe HTML report includes a dedicated diagnostics card with per-scenario pattern matching, root cause analysis, and actionable fix recommendations.\n\n## Feature Summary\n\n| Feature | CLI | Python API | Since |\n|---------|-----|-----------|-------|\n| SB3 model audit | `audit-sb3` | `SB3Adapter` | v0.3.0 |\n| CleanRL audit | `audit-cleanrl` | `CleanRLAdapter` | v0.4.0 |\n| HuggingFace Hub audit | `audit-hf` | `SB3Adapter.from_hub()` | v0.5.0 |\n| IsaacLab / custom PyTorch | — | `TorchPolicyAdapter` | v0.4.5 |\n| One-command fix | `fix-sb3`, `fix-cleanrl` | `fix_sb3_model()` | v0.3.8 |\n| Before/After comparison | `--compare`, `diff` | `generate_comparison()` | v0.4.0 |\n| CI pipeline gates | `--ci` | exit codes 0/1/2 | v0.3.0 |\n| Markdown PR comments | `--format markdown` | `_print_markdown_summary()` | v0.3.9 |\n| JSON output | `--format json` | `json.dumps(result)` | v0.5.7 |\n| Failure diagnostics | automatic | `generate_diagnosis()` | v0.5.2 |\n| Adaptive sampling | `--adaptive` | `adaptive=True` | v0.5.3 |\n| Type annotations (PEP 561) | — | `py.typed` | v0.5.4 |\n| WandB / MLflow tracking | `--wandb`, `--mlflow` | `log_to_wandb()` | v0.5.5 |\n| Parallel episodes | `--workers auto` | `n_workers=` | v0.4.2 |\n| Reproducible seeds | `--seed 42` | `seed=` | v0.4.3 |\n| HTML + JSON reports | `--out dir/` | `generate_report()` | v0.3.0 |\n| GitHub Actions | `uses: maruyamakoju/deltatau-audit@main` | — | v0.5.10 |\n| Colab notebook | `notebooks/quickstart.ipynb` | — | v0.6.0 |\n| SB3 training callback | — | `TimingAuditCallback` | v0.6.1 |\n| Badge SVG generation | `badge summary.json` | `generate_badges()` | v0.6.1 |\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaruyamakoju%2Fdeltatau-audit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaruyamakoju%2Fdeltatau-audit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaruyamakoju%2Fdeltatau-audit/lists"}