[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DB50AHRKJV4RNJK1263EVR":3,"skill-same:01M6DB50AHRKJV4RNJK1263EVR":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":14,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M6DB50AHRKJV4RNJK1263EVR","claude-science-local",null,"Use to bring up, diagnose, or recover Anthropic's Claude Science local compchem \u002F life-science workbench - a WSL2 daemon on 127.0.0.1:8000. Triggers - claude science, compchem or life-science workbench, :8000 down or unreachable, \u002Fclaude-science, cs open, start claude science, open the science UI, science daemon wedged or off. Teaches the cs verbs (open, ensure, status, fix, doctor, backup, restore), why HTTP 401 means alive, the host-RAM SQLite wedge and that cs fix recovers it, and that NOT-CHECKED is not PASS. NOT for hosted or cloud compchem - scope is LOCAL only.","Prekzursil\u002Fagent-skills-toolchain","Prekzursil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54636077?v=4","01M6DACZ1PCQHD99SCR1YXG28B","Andrei Mihai Visalon","01M6DACZ670WZF535V3WYYSS4Z",0,"MIT","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclaude-science-local\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"claude science local","local","science","fix","host","triggers","life","restore","up","only","use","status","why","open","sqlite","backup","start","doctor","http","diagnose","2026-11-10 10:12:30",false,"---\nname: claude-science-local\ndescription: Use to bring up, diagnose, or recover Anthropic's Claude Science local compchem \u002F life-science workbench - a WSL2 daemon on 127.0.0.1:8000. Triggers - claude science, compchem or life-science workbench, :8000 down or unreachable, \u002Fclaude-science, cs open, start claude science, open the science UI, science daemon wedged or off. Teaches the cs verbs (open, ensure, status, fix, doctor, backup, restore), why HTTP 401 means alive, the host-RAM SQLite wedge and that cs fix recovers it, and that NOT-CHECKED is not PASS. NOT for hosted or cloud compchem - scope is LOCAL only.\nlicense: MIT\n---\n\n# Claude Science (local) — one-command control\n\n> Anthropic's **Claude Science** compchem \u002F life-science workbench has **no\n> Windows build**. It runs as a **WSL2 Ubuntu daemon** serving a web UI on\n> **`http:\u002F\u002F127.0.0.1:8000\u002F`**. The `cs` dispatcher makes it always-on and\n> one-command from any Windows shell. **LOCAL only** — no remote\u002FTailscale.\n\n## When to use\n\n- \"Start \u002F open Claude Science\", \"the science UI is down\", \"`:8000` won't load\".\n- Before another tool or agent calls `:8000` — run `cs ensure` first.\n- The daemon is **wedged** (up but slow\u002Ftiming out) or **off when needed**.\n- You need a health readout, a recover, or a backup\u002Frestore of the science DB.\n\n## Two facts that flip every diagnosis\n\n1. **HTTP 401 on `\u002F` = ALIVE.** `:8000` is behind an auth gate; a 401 (even a\n   403) means the daemon is answering. Do **not** read 401 as \"down\".\n2. **Slow \u002F timeout = WEDGED, not down.** The daemon accepts the socket but\n   answers slowly or never. Root cause: the WSL VM is frozen under **host-RAM\n   pressure**, which stalls the SQLite `operon-cli.db` (lock contention — seen up\n   to a 164 s `TxMutex` hold). A naive \"any HTTP response = healthy\" probe is\n   blind to this. `cs` is **latency-aware**: a response `>= 4 s` reads as\n   **WEDGED**, and `cs fix` recovers it.\n\n## The `cs` verbs (run from PowerShell)\n\n```\ncs \u003Cverb>                                  # the shim on PATH\npwsh -File ~\u002F.local\u002Fbin\u002Fcs.ps1 \u003Cverb>      # the same installed dispatcher, explicitly\n```\n\nSlash command: **`\u002Fclaude-science \u003Cverb>`** (see `commands\u002Fclaude-science.md`).\n\n**Always the INSTALLED copy, never a source checkout.** Both slash commands used to name\n`~\u002Fsource\u002Fagent-skills-toolchain\u002Fscripts\u002Fclaude-science\u002Fcs.ps1`, and that tree had drifted to a\ndetached HEAD holding the pre-fix tool — so `\u002Fclaude-science doctor` ran an 11-row report with no\nfail-closed states while `cs doctor` ran the 13-row one, on the same box, in the same minute.\n`cs doctor`'s **Slash-command route** row now hashes whatever dispatcher the command files name and\nfails unless it is byte-identical to the running code.\n\n| Verb | What it does |\n|---|---|\n| **`cs open`** | Ensure up (start-if-down \u002F recover-if-wedged), **wait for readiness** (not a blind sleep), then open the UI in the browser. The human one-click. |\n| **`cs ensure`** | Headless ensure-up for **tools\u002Fagents** — emits `SUCCESS:cs-up` \u002F `FAILED:cs-down` (exit 0\u002F1). **Call this before any `:8000` request.** |\n| **`cs status [-Json]`** | State + measured **latency** + a `wedged` flag (+ WSL daemon detail). `-Json` for machine parsing. |\n| **`cs fix`** | Graceful force-recover: stop → clear stale locks (`daemon.sock`\u002F`operon.lock`\u002F`sbx-*`) → restart pinned. The wedge cure. (alias: `cs recover`.) |\n| **`cs stop`** | Stop the daemon. |\n| **`cs backup`** | Online SQLite snapshot to `D:\\Backups\\claude-science` (key stored separately; keeps last 7). Safe while the daemon is up. |\n| **`cs restore \u003Cts\\|latest>`** | Roll back to a snapshot (keeps a pre-restore safety copy, drops stale WAL\u002FSHM, restarts, verifies). |\n| **`cs doctor`** | Full-stack **PASS\u002FWARN\u002FFAIL** report — the go-to when something is off. |\n\n## Standard flow\n\n- **Human wants the UI:** `cs open`. Done.\n- **A tool\u002Fagent needs `:8000`:** `cs ensure`; proceed only on `SUCCESS:cs-up`.\n- **\"It's off \u002F slow when I need it\":** `cs status`. If `*** WEDGED ***` or DOWN →\n  `cs fix` → re-`cs status`. If it won't come back → `cs doctor`.\n\n## `cs doctor` — what it checks\n\nA read-only report that operationalizes the reliability audit. Rows (each\nPASS\u002FWARN\u002FFAIL\u002F**NOT-CHECKED**\u002FINFO): **WSL reachable** · **CS daemon** (state + latency,\nflags `*** WEDGED ***`) · **daemon detail** (pid\u002Fversion\u002Fuptime) · **DB** (integrity +\n`journal_mode` + size) · **WSL disk free** · **Host RAM free** + top consumers\n(the freeze root cause) · **Watchdog registered** · **Watchdog action path**\n(does the task launch a script that exists, is durable, and matches this deploy? it was\nlaunching out of a disposable git worktree) · **Watchdog re-launch trigger**\n(a logon-only trigger cannot restart a watchdog that exited — that is how it stayed\ndead for 3.3 days) · **Watchdog instances** (catches the duplicate-watchdog race) ·\n**Watchdog heartbeat** · **Backup freshness** · **Backup restorable** (copies the newest\nsnapshot to a temp dir and integrity-checks the **copy**, so the backup root is never written) ·\n**Slash-command route** (does `\u002Fclaude-science` actually run this code?) ·\n**PowerShell host** · **Tab-death regfix**. Ends with a `N FAIL, N WARN, N NOT-CHECKED, N PASS` summary and\n**exits non-zero on FAIL or NOT-CHECKED**, so other tooling can gate on it.\n\n### `NOT-CHECKED` is not `PASS` — read this row honestly\n\nA health check that cannot reach its input **fails closed**. It was not always so: the DB row\nused to print `WARN \"sqlite3 or operon-cli.db not found\"` when the real cause was a probe\ntimeout — a factual claim about a file it never looked at — while `Backup freshness` rendered\n`PASS` green over the same unreachable VM. Now a timed-out or empty probe renders\n`NOT-CHECKED` and says only that, a genuinely absent input renders `FAIL`, and the summary\ncounts NOT-CHECKED separately so `0 FAIL, 0 WARN` can no longer hide unmeasured rows.\n\nTwo heartbeat subtleties worth knowing, both measured:\n- **A stale heartbeat alone does not mean the watchdog hung.** Under host-RAM pressure the\n  watchdog *process* is descheduled and a single probe took 66 s against a nominal 8 s socket\n  cap, so a healthy watchdog measuring a wedge looked hung. The row now AND-gates the stale\n  beat against process liveness: stale + no process = FAIL, stale + live process = WARN.\n- **The instance count used to count the probe itself.** Anything whose command line contained\n  `cs-watchdog` matched, so asking the question could manufacture the \"DUPLICATE\" answer.\n\nTwo more, added 2026-08-12 after a verifier found the same defect class still live here:\n- **A registered task is not a working task.** `Watchdog registered`, `re-launch trigger` and\n  `instances` all read PASS while the action launched `cs-watchdog.ps1` out of a *linked git\n  worktree* that a `git worktree remove` deletes — and Task Scheduler reports a missing\n  `-File` target as a task that ran. If you ever register this by hand, point it at\n  `~\u002F.local\u002Fbin\u002Fcs-watchdog.ps1`, never at a checkout.\n- **Run the doctor under `pwsh`, not Windows PowerShell 5.1.** 5.1 mangles native arguments\n  containing embedded double quotes, so the quoted `sqlite3 -readonly \"file:…\"` inside the\n  DB and backup probes reaches bash truncated and those rows go NOT-CHECKED. Measured on one\n  box minutes apart: 5.1 `0 FAIL, 2 WARN, 4 NOT-CHECKED, 8 PASS` against pwsh `0 FAIL, 1 WARN,\n  0 NOT-CHECKED, 13 PASS`. The `.cmd` shims now prefer `pwsh`; the **PowerShell host** row\n  tells you when the 5.1 fallback fired. NOT-CHECKED here is the contract working, not a\n  broken box — but it is also not a measurement.\n\n### A run marked `[INJECTED]` is a SIMULATION, never health evidence\n\nThe harness below reaches the broken state through a `CS_FORCE_*` env seam. That seam once\nobeyed those variables unarmed and unmarked, so `CS_FORCE_WSL_DB='ok|wal|999M'` produced a\nfabricated `[+] DB PASS integrity=ok journal=wal size=999M`, `0 FAIL … 12 PASS`, exit 0 — a\nhealth tool that could be ordered to print a green. Now: the seam is inert unless\n`CS_FAULT_INJECTION=1` arms it; a `CS_FORCE_*` set without arming is **refused and reported**;\nand an armed run gets a `Fault injection` **FAIL** row plus an `[INJECTED]` tag on every affected\ndetail, so it can never read clean and never exits 0. **Never quote a `[SIMULATED …]` run.**\n\nVerify all of the above with the shipped both-states harness — it stubs every WSL probe, so it\nis hermetic and safe to run *while* the box is wedged:\n\n```\npwsh -NoProfile -File ~\u002F.local\u002Fbin\u002Ftest-cs-doctor-failclosed.ps1\n```\n\nOne property it deliberately does **not** cover, because it needs the real filesystem: that the\ndoctor does not write into the backup root. That has its own probe, which snapshots every entry\nin `D:\\Backups\\claude-science` around a doctor run —\n\n```\npython ~\u002F.local\u002Fbin\u002Ftest-cs-backup-readonly.py check ~\u002F.local\u002Fbin\u002Fcs-doctor.ps1\n```\n\nBoth of those measure **this box**. The third check measures the **wiring** — that the slash\ncommand still routes to the installed dispatcher, that everything the docs tell you to run is\nactually in `install.ps1`'s deploy list, that the config seam has no bypass, that `csmon` is still\nregistered. It is pure repo inspection (no WSL, no daemon, no scheduled task), so unlike the two\nabove it runs in **CI on every pull request** and is the only one of the three that cannot be\nforgotten:\n\n```\npython scripts\u002Fclaude-science\u002Fcs_wiring_check.py\n```\n\nTen invariants, each with a paired mutation in `ci\u002Ftests\u002Ftest_cs_wiring.py` that cuts exactly that\nwire and asserts the gate goes red — run `python -m pytest ci\u002Ftests\u002Ftest_cs_wiring.py -q` to watch\nboth directions. It exists because this toolset's recurring defect is not a bug in the code, it is\na reference left pointing at a stale, disposable or absent tree: the slash command ran a\ndetached-HEAD checkout, the watchdog was registered against a git worktree, `cs-deploy.sh`\ninstalled from that same stale tree, and the read-only probe two paragraphs above was documented\nfor weeks while `install.ps1` never deployed it.\n\n## Gotchas\n\n- **Wedge ≠ crash.** The daemon rarely crashes; the usual failure is the RAM\u002F\n  SQLite **wedge**. If `:8000` is slow, don't restart WSL blindly — `cs fix`\n  clears the locks and restarts cleanly.\n- **Host-RAM pressure is the trigger.** If `cs doctor` shows low host RAM, the\n  heavy neighbours (BOINC \u002F LM Studio \u002F Docker \u002F a Claude fleet) are starving the\n  VM. Free RAM, then `cs fix`.\n- **A backup you can't restore is false safety.** `cs backup` and `cs restore`\n  are matched — take a `cs backup` before risky changes; `cs restore latest`\n  rolls back. `cs backup` now integrity-checks the snapshot it just wrote and exits\n  non-zero if it does not open, and `cs doctor` has a **Backup restorable** row that opens\n  the newest one rather than merely confirming a file exists.\n- **One config file, env-overridable.** Port, distro, backup roots, wedge threshold, health\n  floors and the freshness thresholds all live in `scripts\u002Fclaude-science\u002Fcs.conf`. Both halves\n  read it — `cs-lib.ps1` for PowerShell, `cs-lib.sh` for the shell scripts — and an environment\n  variable of the same name overrides the file, so `$env:CS_PORT = 8123` needs no edit. The\n  backup root is stored once in WSL form (`\u002Fmnt\u002Fd\u002F...`); the Windows form is derived.\n- **Scope is LOCAL.** Remote access \u002F Tailscale (`cs-tailscale-serve.ps1`) is out\n  of scope here — `cs` targets `127.0.0.1:8000` only.\n\n## Adding data sources (brief)\n\nMCP connectors are added **in the web UI only** (Customize → Connectors),\n**URL\u002FHTTP transport only** — the WSL daemon can't reach Windows stdio MCPs\ndirectly. For the NVIDIA BioNeMo NIM compute connector and the full lifecycle\ndetails, see `scripts\u002Fclaude-science\u002FREADME.md`.\n","# Claude Science (local) — one-command control\n\n> Anthropic's **Claude Science** compchem \u002F life-science workbench has **no\n> Windows build**. It runs as a **WSL2 Ubuntu daemon** serving a web UI on\n> **`http:\u002F\u002F127.0.0.1:8000\u002F`**. The `cs` dispatcher makes it always-on and\n> one-command from any Windows shell. **LOCAL only** — no remote\u002FTailscale.\n\n## When to use\n\n- \"Start \u002F open Claude Science\", \"the science UI is down\", \"`:8000` won't load\".\n- Before another tool or agent calls `:8000` — run `cs ensure` first.\n- The daemon is **wedged** (up but slow\u002Ftiming out) or **off when needed**.\n- You need a health readout, a recover, or a backup\u002Frestore of the science DB.\n\n## Two facts that flip every diagnosis\n\n1. **HTTP 401 on `\u002F` = ALIVE.** `:8000` is behind an auth gate; a 401 (even a\n   403) means the daemon is answering. Do **not** read 401 as \"down\".\n2. **Slow \u002F timeout = WEDGED, not down.** The daemon accepts the socket but\n   answers slowly or never. Root cause: the WSL VM is frozen under **host-RAM\n   pressure**, which stalls the SQLite `operon-cli.db` (lock contention — seen up\n   to a 164 s `TxMutex` hold). A naive \"any HTTP response = healthy\" probe is\n   blind to this. `cs` is **latency-aware**: a response `>= 4 s` reads as\n   **WEDGED**, and `cs fix` recovers it.\n\n## The `cs` verbs (run from PowerShell)\n\n```\ncs \u003Cverb>                                  # the shim on PATH\npwsh -File ~\u002F.local\u002Fbin\u002Fcs.ps1 \u003Cverb>      # the same installed dispatcher, explicitly\n```\n\nSlash command: **`\u002Fclaude-science \u003Cverb>`** (see `commands\u002Fclaude-science.md`).\n\n**Always the INSTALLED copy, never a source checkout.** Both slash commands used to name\n`~\u002Fsource\u002Fagent-skills-toolchain\u002Fscripts\u002Fclaude-science\u002Fcs.ps1`, and that tree had drifted to a\ndetached HEAD holding the pre-fix tool — so `\u002Fclaude-science doctor` ran an 11-row report with no\nfail-closed states while `cs doctor` ran the 13-row one, on the same box, in the same minute.\n`cs doctor`'s **Slash-command route** row now hashes whatever dispatcher the command files name and\nfails unless it is byte-identical to the running code.\n\n| Verb | What it does |\n|---|---|\n| **`cs open`** | Ensure up (start-if-down \u002F recover-if-wedged), **wait for readiness** (not a blind sleep), then open the UI in the browser. The human one-click. |\n| **`cs ensure`** | Headless ensure-up for **tools\u002Fagents** — emits `SUCCESS:cs-up` \u002F `FAILED:cs-down` (exit 0\u002F1). **Call this before any `:8000` request.** |\n| **`cs status [-Json]`** | State + measured **latency** + a `wedged` flag (+ WSL daemon detail). `-Json` for machine parsing. |\n| **`cs fix`** | Graceful force-recover: stop → clear stale locks (`daemon.sock`\u002F`operon.lock`\u002F`sbx-*`) → restart pinned. The wedge cure. (alias: `cs recover`.) |\n| **`cs stop`** | Stop the daemon. |\n| **`cs backup`** | Online SQLite snapshot to `D:\\Backups\\claude-science` (key stored separately; keeps last 7). Safe while the daemon is up. |\n| **`cs restore \u003Cts\\|latest>`** | Roll back to a snapshot (keeps a pre-restore safety copy, drops stale WAL\u002FSHM, restarts, verifies). |\n| **`cs doctor`** | Full-stack **PASS\u002FWARN\u002FFAIL** report — the go-to when something is off. |\n\n## Standard flow\n\n- **Human wants the UI:** `cs open`. Done.\n- **A tool\u002Fagent needs `:8000`:** `cs ensure`; proceed only on `SUCCESS:cs-up`.\n- **\"It's off \u002F slow when I need it\":** `cs status`. If `*** WEDGED ***` or DOWN →\n  `cs fix` → re-`cs status`. If it won't come back → `cs doctor`.\n\n## `cs doctor` — what it checks\n\nA read-only report that operationalizes the reliability audit. Rows (each\nPASS\u002FWARN\u002FFAIL\u002F**NOT-CHECKED**\u002FINFO): **WSL reachable** · **CS daemon** (state + latency,\nflags `*** WEDGED ***`) · **daemon detail** (pid\u002Fversion\u002Fuptime) · **DB** (integrity +\n`journal_mode` + size) · **WSL disk free** · **Host RAM free** + top consumers\n(the freeze root cause) · **Watchdog registered** · **Watchdog action path**\n(does the task launch a script that exists, is durable, and matches this deploy? it was\nlaunching out of a disposable git worktree) · **Watchdog re-launch trigger**\n(a logon-only trigger cannot restart a watchdog that exited — that is how it stayed\ndead for 3.3 days) · **Watchdog instances** (catches the duplicate-watchdog race) ·\n**Watchdog heartbeat** · **Backup freshness** · **Backup restorable** (copies the newest\nsnapshot to a temp dir and integrity-checks the **copy**, so the backup root is never written) ·\n**Slash-command route** (does `\u002Fclaude-science` actually run this code?) ·\n**PowerShell host** · **Tab-death regfix**. Ends with a `N FAIL, N WARN, N NOT-CHECKED, N PASS` summary and\n**exits non-zero on FAIL or NOT-CHECKED**, so other tooling can gate on it.\n\n### `NOT-CHECKED` is not `PASS` — read this row honestly\n\nA health check that cannot reach its input **fails closed**. It was not always so: the DB row\nused to print `WARN \"sqlite3 or operon-cli.db not found\"` when the real cause was a probe\ntimeout — a factual claim about a file it never looked at — while `Backup freshness` rendered\n`PASS` green over the same unreachable VM. Now a timed-out or empty probe renders\n`NOT-CHECKED` and says only that, a genuinely absent input renders `FAIL`, and the summary\ncounts NOT-CHECKED separately so `0 FAIL, 0 WARN` can no longer hide unmeasured rows.\n\nTwo heartbeat subtleties worth knowing, both measured:\n- **A stale heartbeat alone does not mean the watchdog hung.** Under host-RAM pressure the\n  watchdog *process* is descheduled and a single probe took 66 s against a nominal 8 s socket\n  cap, so a healthy watchdog measuring a wedge looked hung. The row now AND-gates the stale\n  beat against process liveness: stale + no process = FAIL, stale + live process = WARN.\n- **The instance count used to count the probe itself.** Anything whose command line contained\n  `cs-watchdog` matched, so asking the question could manufacture the \"DUPLICATE\" answer.\n\nTwo more, added 2026-08-12 after a verifier found the same defect class still live here:\n- **A registered task is not a working task.** `Watchdog registered`, `re-launch trigger` and\n  `instances` all read PASS while the action launched `cs-watchdog.ps1` out of a *linked git\n  worktree* that a `git worktree remove` deletes — and Task Scheduler reports a missing\n  `-File` target as a task that ran. If you ever register this by hand, point it at\n  `~\u002F.local\u002Fbin\u002Fcs-watchdog.ps1`, never at a checkout.\n- **Run the doctor under `pwsh`, not Windows PowerShell 5.1.** 5.1 mangles native arguments\n  containing embedded double quotes, so the quoted `sqlite3 -readonly \"file:…\"` inside the\n  DB and backup probes reaches bash truncated and those rows go NOT-CHECKED. Measured on one\n  box minutes apart: 5.1 `0 FAIL, 2 WARN, 4 NOT-CHECKED, 8 PASS` against pwsh `0 FAIL, 1 WARN,\n  0 NOT-CHECKED, 13 PASS`. The `.cmd` shims now prefer `pwsh`; the **PowerShell host** row\n  tells you when the 5.1 fallback fired. NOT-CHECKED here is the contract working, not a\n  broken box — but it is also not a measurement.\n\n### A run marked `[INJECTED]` is a SIMULATION, never health evidence\n\nThe harness below reaches the broken state through a `CS_FORCE_*` env seam. That seam once\nobeyed those variables unarmed and unmarked, so `CS_FORCE_WSL_DB='ok|wal|999M'` produced a\nfabricated `[+] DB PASS integrity=ok journal=wal size=999M`, `0 FAIL … 12 PASS`, exit 0 — a\nhealth tool that could be ordered to print a green. Now: the seam is inert unless\n`CS_FAULT_INJECTION=1` arms it; a `CS_FORCE_*` set without arming is **refused and reported**;\nand an armed run gets a `Fault injection` **FAIL** row plus an `[INJECTED]` tag on every affected\ndetail, so it can never read clean and never exits 0. **Never quote a `[SIMULATED …]` run.**\n\nVerify all of the above with the shipped both-states harness — it stubs every WSL probe, so it\nis hermetic and safe to run *while* the box is wedged:\n\n```\npwsh -NoProfile -File ~\u002F.local\u002Fbin\u002Ftest-cs-doctor-failclosed.ps1\n```\n\nOne property it deliberately does **not** cover, because it needs the real filesystem: that the\ndoctor does not write into the backup root. That has its own probe, which snapshots every entry\nin `D:\\Backups\\claude-science` around a doctor run —\n\n```\npython ~\u002F.local\u002Fbin\u002Ftest-cs-backup-readonly.py check ~\u002F.local\u002Fbin\u002Fcs-doctor.ps1\n```\n\nBoth of those measure **this box**. The third check measures the **wiring** — that the slash\ncommand still routes to the installed dispatcher, that everything the docs tell you to run is\nactually in `install.ps1`'s deploy list, that the config seam has no bypass, that `csmon` is still\nregistered. It is pure repo inspection (no WSL, no daemon, no scheduled task), so unlike the two\nabove it runs in **CI on every pull request** and is the only one of the three that cannot be\nforgotten:\n\n```\npython scripts\u002Fclaude-science\u002Fcs_wiring_check.py\n```\n\nTen invariants, each with a paired mutation in `ci\u002Ftests\u002Ftest_cs_wiring.py` that cuts exactly that\nwire and asserts the gate goes red — run `python -m pytest ci\u002Ftests\u002Ftest_cs_wiring.py -q` to watch\nboth directions. It exists because this toolset's recurring defect is not a bug in the code, it is\na reference left pointing at a stale, disposable or absent tree: the slash command ran a\ndetached-HEAD checkout, the watchdog was registered against a git worktree, `cs-deploy.sh`\ninstalled from that same stale tree, and the read-only probe two paragraphs above was documented\nfor weeks while `install.ps1` never deployed it.\n\n## Gotchas\n\n- **Wedge ≠ crash.** The daemon rarely crashes; the usual failure is the RAM\u002F\n  SQLite **wedge**. If `:8000` is slow, don't restart WSL blindly — `cs fix`\n  clears the locks and restarts cleanly.\n- **Host-RAM pressure is the trigger.** If `cs doctor` shows low host RAM, the\n  heavy neighbours (BOINC \u002F LM Studio \u002F Docker \u002F a Claude fleet) are starving the\n  VM. Free RAM, then `cs fix`.\n- **A backup you can't restore is false safety.** `cs backup` and `cs restore`\n  are matched — take a `cs backup` before risky changes; `cs restore latest`\n  rolls back. `cs backup` now integrity-checks the snapshot it just wrote and exits\n  non-zero if it does not open, and `cs doctor` has a **Backup restorable** row that opens\n  the newest one rather than merely confirming a file exists.\n- **One config file, env-overridable.** Port, distro, backup roots, wedge threshold, health\n  floors and the freshness thresholds all live in `scripts\u002Fclaude-science\u002Fcs.conf`. Both halves\n  read it — `cs-lib.ps1` for PowerShell, `cs-lib.sh` for the shell scripts — and an environment\n  variable of the same name overrides the file, so `$env:CS_PORT = 8123` needs no edit. The\n  backup root is stored once in WSL form (`\u002Fmnt\u002Fd\u002F...`); the Windows form is derived.\n- **Scope is LOCAL.** Remote access \u002F Tailscale (`cs-tailscale-serve.ps1`) is out\n  of scope here — `cs` targets `127.0.0.1:8000` only.\n\n## Adding data sources (brief)\n\nMCP connectors are added **in the web UI only** (Customize → Connectors),\n**URL\u002FHTTP transport only** — the WSL daemon can't reach Windows stdio MCPs\ndirectly. For the NVIDIA BioNeMo NIM compute connector and the full lifecycle\ndetails, see `scripts\u002Fclaude-science\u002FREADME.md`.\n",{"name":5,"license":15,"description":7},"main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Fskills\u002Fclaude-science-local","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill claude-science-local",{"tool":56,"command":57},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill claude-science-local",{"tool":59,"command":60},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill claude-science-local","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclaude-science-local\u002FSKILL.md",true,[64],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"cs_monitor.py","SCRIPT","脚本",10751,"https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fclaude-science-local\u002Fcs_monitor.py",[71,92,121,148,161,176],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":39},"01M6DF7D7478R55P46REYH4QAC","clarify-requirements","Resolve genuine pre-execution ambiguity by scanning repo context, generating 1-6 grounded options, and asking 1-3 focused questions via AskUserQuestion. NOT for mid-task use (injection risk); NOT when the goal is already unambiguous; use to disambiguate vague prompts before any file edits.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fworkspace-hooks\u002Fskills\u002Fclarify-requirements\u002FSKILL.md",[],[78,79,80,81,82,83,84,85,86,29,87,88,89,90,91],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","context","repo","injection","execution","file",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":103,"publishedAt":39},"01M6DF79CA4BHJS66J8EZDBPWJ","openmm-md","Run FREE, open-source, Windows-native GPU molecular dynamics via the openmm-md MCP (OpenMM + CUDA on the local NVIDIA GPU). Use for protein \u002F protein-ligand MD when you want a free stack or are on Windows without a Schrodinger license. Covers the full workflow (prepare, solvate, minimize, equilibrate, production, analyze, mmgbsa) AND an honest decision guide vs Schrodinger Desmond, including how to run Desmond legitimately on Linux or a cloud GPU with a real license. This is a deliberately LESSER free alternative and does NOT replace the schrodinger MCP tools. Do NOT use it to pick a free tool when a validated FEP+, WaterMap, IFD-MD, or Prime MM-GBSA result is actually required.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fmcp\u002Fopenmm-md-mcp\u002Fskill\u002Fopenmm-md\u002FSKILL.md",[98],{"categoryNo":99,"categoryName":100,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[104,105,106,107,108,109,110,111,32,112,113,114,115,116,29,117,118,20,119,120],"openmm md","how","decision","pick","linux","analyze","tool","stack","NVIDIA","gpu","license","workflow","windows","free","molecular dynamics","do","MCP",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":133,"publishedAt":39},"01M6DF76C1MG85VEWP8VZCBNMN","visual-review","Take screenshots of web pages and UI using Playwright for visual review and iteration","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fvisual-review\u002FSKILL.md",[127,130],{"categoryNo":128,"categoryName":129,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":131,"categoryName":132,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000008","测试与质量",[134,135,136,137,138,139,140,141,142,143,105,144,145,146,147],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","playwright","screenshots",{"skillNo":149,"name":30,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":39},"01M6DF73AQVCBZKEN0YXEX9FXP","Diagnostic status report — shows metaswarm installation state, project setup, and potential issues","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstatus\u002FSKILL.md",[],[30,154,155,156,157,158,159,160],"setup","report","project","installation","project setup","issues","state",{"skillNo":162,"name":35,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":167,"publishedAt":39},"01M6DF6X6C2XB0P6GX76P7TTYV","Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstart\u002FSKILL.md",[166],{"categoryNo":99,"categoryName":100,"taxonomyType":101,"taxonomyTypeDesc":102},[35,168,83,169,170,171,29,172,173,174,175],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":177,"name":154,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":181,"publishedAt":39},"01M6DF6QMJ9AJKFKHHKRT005PQ","Interactive project setup — detects your project, configures metaswarm, writes project-local files","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fsetup\u002FSKILL.md",[],[154,156,20,182,158,183],"files","interactive"]