[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GBCPERCK3GZG9F38ZAXERK":3,"skill-same:01M6GBCPERCK3GZG9F38ZAXERK":69},{"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":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":6,"ownerHtmlUrl":52,"ownerBlogUrl":6,"ownerDescription":53,"updatedAt":54,"install":55,"resources":68},"01M6GBCPERCK3GZG9F38ZAXERK","colab-cloud-gpu-training",null,"Run multi-hour GPU jobs on Google Colab that survive drops.","zapabob\u002FSkills","zapabob","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F130830376?v=4","01M6DBMYZAGRTFQDSQYW3W764P","峯岸 亮","01M6DBMZ3GKDSJ01NZ9XTZD7JD",2,"MIT","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002F98\u002F98b2550d40b486c28c7d17056ed25e1fc08927fc31f81d6a20f43d7bf5c9cac4\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31],"training","gpu","cloud","colab cloud gpu training","google","run","QLoRA","recovery","hermes","hermes agent","session","jobs","multi","2026-11-10 10:12:30",false,"---\r\nname: colab-cloud-gpu-training\r\ndescription: Run multi-hour GPU jobs on Google Colab that survive drops.\r\nversion: 1.0.0\r\nauthor: Hermes Agent\r\nlicense: MIT\r\nmetadata:\r\n  hermes:\r\n    tags: [Colab, Cloud-GPU, Training, QLoRA, Durability, Session-Recovery]\r\n---\r\n\r\n# Colab Cloud GPU Training\r\n\r\nDrive multi-hour GPU work (fine-tuning, big downloads, batch inference) on Colab\r\nfrom the Hermes desktop app on Windows, so the run survives session drops and the\r\noperator can hand it to a normal web browser when authorization is required.\r\n\r\nUse when a task involves: Colab \u002F `colab` CLI, rented A100\u002FT4\u002FH100 GPUs,\r\nfine-tuning that will not fit locally, multi-gigabyte downloads on a rented VM,\r\nor an operator who wants to drive the run themselves from a browser.\r\n\r\n## When to Use\r\n\r\nReach for this when **any** of these hold:\r\n\r\n- A GPU job will not fit the local box (27B+ fine-tuning, or VRAM \u003C the model)\r\n- The job runs longer than a Colab session, so a drop would cost real work\r\n- Tens of gigabytes must be downloaded on a rented VM\r\n- The operator wants to drive or authorise the run themselves from a browser\r\n- You are writing a handoff zip so someone else can execute the pipeline\r\n\r\nDo **not** use it for a quick inference check or a fine-tune that already fits\r\nthe local GPU — those belong to `peft-fine-tuning` and the local serving skills.\r\n\r\n## The one fact that decides the whole design\r\n\r\n**`\u002Fcontent` is ephemeral.** A Colab session that idles out and drops (404\u002F401)\r\nloses everything in it. Measured on this workstation: an idle drop destroyed all\r\n**50.98 GiB** of downloaded safetensors — every shard gone, nothing recoverable.\r\n\r\nTherefore:\r\n\r\n> **Anything multi-GB must live on `\u002Fcontent\u002Fdrive\u002FMyDrive`.** Use `\u002Fcontent`\r\n> only as scratch.\r\n\r\nDo not design a \"skip Drive to save a step\" pipeline. It looks fine until the\r\nfirst drop, and then every attempt re-downloads tens of gigabytes.\r\n\r\n## Workflow\r\n\r\n### 1. Create the session\r\n\r\n```bash\r\ncolab new --gpu A100 --session \u003Cname>     # T4 | L4 | G4 | H100 | A100\r\n```\r\n\r\nReturns `Session READY.` in ~5s. Note the backend id (`gpu-a100-s-kkb-...`).\r\nIt appears in `colab sessions`; a `[?]` prefix means the session is already lost.\r\n\r\n### 2. Mount Drive BEFORE downloading anything\r\n\r\n```bash\r\ncolab drivemount -s \u003Cname>\r\n```\r\n\r\nThis **blocks until the operator grants access in a browser** — it prints a\r\n`https:\u002F\u002Faccounts.google.com\u002Fo\u002Foauth2\u002Fv2\u002Fauth?...` URL and waits. Do not\r\nCtrl+C it. Surface the URL to the user; they paste it into a normal browser,\r\nsign in, and approve.\r\n\r\nConfirm with `scripts\u002Fdrivecheck.py` (see Support files) — it prints `DRIVE_OK`\r\nplus per-directory sizes.\r\n\r\n### 3. Stage scripts, then exec them\r\n\r\n`colab exec -f` reads a **local** path and streams it as a cell. It does *not*\r\nread a path that exists only inside the session.\r\n\r\n```bash\r\ncp scripts\u002Fstage1_....py ~\u002Fstage1.py      # stage into the local home first\r\ncolab exec -s \u003Cname> -f ~\u002Fstage1.py --timeout 10800\r\n```\r\n\r\nPassing `-f \u002Fcontent\u002Fstage1.py` fails with `FileNotFoundError` — that path is\r\nresolved locally, not remotely. `colab upload` exists for files you genuinely\r\nneed on the VM, but exec wants the local copy.\r\n\r\n### 4. Make every stage resumable\r\n\r\nLong stages get killed by the Colab Pro session ceiling. Write a sentinel and\r\nbranch on it so a re-run continues instead of restarting:\r\n\r\n```python\r\nmarker = f\"{DRIVE}\u002Fbase\u002F.materialised\"\r\nif os.path.exists(marker):\r\n    log(\"already present; skipping download\")\r\nelse:\r\n    ...download...\r\n    open(marker, \"w\").write(rev)\r\n```\r\n\r\nResolve HF cache symlinks into real bytes when materialising\r\n(`hf download` without `--local-dir` leaves symlinks into `..\u002F..\u002Fblobs`):\r\n\r\n```python\r\nreal = os.path.realpath(s)\r\nif os.path.islink(s) or os.path.abspath(real) != os.path.abspath(s):\r\n    shutil.copyfile(real, d)      # copy the blob, not the link\r\n```\r\n\r\n### 5. Ship a handoff package when the operator wants to drive it themselves\r\n\r\nLong operator-in-the-loop runs should end as a **zip**: a `README_手順書.md`\r\nwith numbered steps plus a `scripts\u002F` dir, each stage guarded by a Drive check.\r\nVerify before shipping — see *Verification before delivery*.\r\n\r\n## Pitfalls\r\n\r\n### `--auth=adc` is the wrong path when OAuth is already working\r\n\r\nThe CLI's default auth is `oauth2`, backed by `~\u002F.config\u002Fcolab-cli\u002Ftoken.json`.\r\nPassing `--auth=adc` forces Application Default Credentials, which needs\r\n`gcloud auth application-default login` and otherwise dies with\r\n`DefaultCredentialsError`. If tokens already exist, **do not pass `--auth`**:\r\n\r\n```bash\r\nls -l ~\u002F.config\u002Fcolab-cli\u002Ftoken.json     # present -> omit --auth entirely\r\n```\r\n\r\n### Session drops are not failures — check before re-downloading\r\n\r\n`colab exec` may return `Session '\u003Cname>' appears to be lost (404\u002F401). Cleaning\r\nup.` That is an idle timeout, not an auth failure. Recreate the session and\r\nre-run the stage; with Drive already holding the weights, the `.materialised`\r\nmarker skips the download.\r\n\r\n### A dropped session invalidates in-flight Drive auth URLs\r\n\r\nEach `drivemount` URL embeds the session endpoint and a one-shot token. If the\r\nsession died between issuing the URL and the user clicking it, the grant lands\r\nnowhere. Check `colab sessions` first, then re-issue.\r\n\r\n### Detached jobs need output on a shared mount\r\n\r\n`execute_code` is capped (~300s), so a multi-hour stage must run detached.\r\nRedirect into the `\u002Fmnt\u002Fc` shared mount so output survives the WSL process:\r\n\r\n```python\r\nwith open(LOG_L, \"wb\") as fh:\r\n    p = subprocess.Popen(\r\n        [\"wsl.exe\", \"-e\", \"bash\", \"-lc\",\r\n         f'colab exec -s {name} -f ~\u002Fstage.py --timeout 14000 > \"{LOG_W}\" 2>&1'],\r\n        stdout=fh, stderr=subprocess.STDOUT)\r\n```\r\n\r\nA bare `nohup ... &` inside the WSL command dies with the calling shell and\r\nleaves no log at all.\r\n\r\n### Verify an upstream tool against the version you will actually install\r\n\r\nReading a GitHub repo and then writing against its API is how you end up with\r\ncode that imports a module the published package does not ship.\r\n`happyscienceiscult\u002Fheretic` is the worked example: the git `master` branch has\r\n`heretic\u002Fplugin.py` and `heretic\u002Fscorer.py`, but the PyPI release\r\n`heretic-llm==1.4.0` does **not** — so every\r\n`from heretic.plugin import Plugin, Context` fails at import time on the installed\r\npackage.\r\n\r\nInstall it and check what actually imports before building on it:\r\n\r\n```python\r\nfor mod in (\"heretic\", \"heretic.plugin\", \"heretic.scorer\", \"heretic.config\"):\r\n    try:\r\n        __import__(mod); print(f\"{mod}: OK\")\r\n    except ImportError as e:\r\n        print(f\"{mod}: MISSING ({e})\")\r\n```\r\n\r\nWhat 1.4.0 *does* ship is more useful than the plugin API: `Settings.benchmarks`\r\nlists eleven lm-evaluation-harness benchmarks (agieval, bbh, commonsense_qa,\r\neq_bench, gsm8k, hellaswag, ifeval, mmlu, mmlu_pro, piqa, winogrande), and\r\n`main.objective` is an Optuna search over `direction_scope`, `direction_index`,\r\n`max_weight`, `max_weight_position`, `min_weight`, `min_weight_distance`. Reuse\r\nthose instead of inventing an evaluation surface. Keep any plugin-API shim behind\r\na function that raises a clear ImportError on builds that lack it — never\r\nmodule-level subclassing that breaks the whole import.\r\n\r\nInstall with `--no-deps` when the dependency closure is large and you only need to\r\ninspect the API surface; a full install can exceed a foreground timeout on its own.\r\n\r\n### Multi-file pipelines need a real orchestrator, not a README\r\n\r\nOnce a job has three or more stages, numbered steps in markdown become the failure\r\npoint: after a drop, neither the operator nor the agent can tell which stages\r\ncompleted. Ship a `run_pipeline.py` with `--list`, `--from N`, and `--only N`,\r\nwhere every stage checks its own marker file and the orchestrator stops at the\r\nfirst failure and prints status. Drive the Drive mount through it too, so a\r\nmissing mount is one refusal at the top rather than a silently ephemeral write in\r\nstage 4.\r\n\r\n### When the terminal tool refuses `wsl.exe`\r\n\r\nSome hosts block direct `wsl.exe` invocations from the terminal tool\r\n(`Security Center blocked a unverified execution candidate (SCAN_ERROR)`).\r\nRoute through `execute_code` + `subprocess` instead of retrying the terminal\r\nform — that is the working path, not a dead end. On this workstation that is the\r\nnormal route for every `colab` call.\r\n\r\n### A full-model plan over every tensor exceeds a 300s foreground budget\r\n\r\nScanning a 6.7 GiB GGUF, or planning edits across every tensor of a 27B model,\r\nroutinely runs past several minutes — and `execute_code` is capped at ~300s, so\r\nthe run dies and you learn nothing. Two fixes, in order of preference:\r\n\r\n- **Cut the work with a debug flag first.** A per-tensor block cap\r\n  (`--max-blocks-per-tensor 40`) turns an all-tense minutes pass into a ~5s one\r\n  and exercises the identical code path, so validate the logic before spending\r\n  the long run.\r\n- **Then launch the full pass detached** and poll the log file, rather than\r\n  re-issuing the foreground call and losing the result again each time.\r\n\r\n```python\r\nlog = r\"H:\\work\\plan.log\"\r\nwith open(log, \"w\", encoding=\"utf-8\") as fh:\r\n    p = subprocess.Popen([py, script, \"--full\"], stdout=fh,\r\n                         stderr=subprocess.STDOUT)\r\n# poll: read the log until a sentinel line appears\r\n```\r\n\r\nPicking a timeout budget up front is not enough — a genuinely long pass also\r\noutlives a `time.sleep` poll loop, so poll the LOG and check for the sentinel,\r\nnot the wall clock.\r\n\r\n### Long-lived binaries may not exist on the remote platform\r\n\r\nA Windows-only runtime build cannot be used on a Linux VM, and its absence\r\nusually surfaces only at stage 5. Detect it in the notebook before the expensive\r\nstages by asserting the capability you need, and make the failure name the fix:\r\n\r\n```python\r\nout = subprocess.run([quant, \"--help\"], capture_output=True, text=True)\r\nout = (out.stdout or \"\") + (out.stderr or \"\")\r\nassert \"PQ2_0\" in out, \"this build does not support PQ2_0; aborting\"\r\n```\r\n\r\nRefusing early with the exact required capability beats downloading 50 GiB and\r\ndiscovering at hour six that the quantizer cannot do the job.\r\n\r\n\r\nFor a handoff package, prove the artifact works rather than assuming:\r\n\r\n```python\r\nfor f in glob.glob(f\"{PKG}\u002Fscripts\u002F*.py\"):\r\n    py_compile.compile(f, doraise=True)     # every script parses\r\n# then: zip it, extract to a clean temp dir, recompile from the extract\r\n```\r\n\r\nAlso check the markdown you ship: a broken code fence or a reference to a file\r\nyou never created makes the procedure unusable. Cheap assertions that catch it:\r\n\r\n- `txt.count(\"```\") % 2 == 0` (fences balanced)\r\n- every `foo.py` mentioned in the README exists in `scripts\u002F`\r\n\r\nFix the package, not just the local copy — the operator only ever sees the zip.\r\n\r\n## Support files\r\n\r\n- `scripts\u002Fdrivecheck.py` — reusable probe: prints `DRIVE_OK` \u002F `DRIVE_MISSING`,\r\n  per-directory sizes, shard count + GiB, config arch summary, adapter presence.\r\n  Run it after mounting and again after any long download.\r\n- `references\u002Fsingle-token-classifier-lora.md` — training a model to answer by\r\n  scoring allowed candidate tokens (CE over the candidate logits only, no\r\n  generation), plus the two evaluator keying\u002Frounding traps that silently zero\r\n  your score.\r\n- `references\u002Fternary-bonsai-nimble.md` — worked end-to-end case: Ternary-Bonsai\r\n  27B × Nimble LoRA, including the 324-example holdout numbers, the model-family\r\n  provenance facts, and the PQ2_0 lattice-ablation method.\r\n\r\n## Related\r\n\r\n- `peft-fine-tuning` — LoRA\u002FQLoRA mechanics, rank and target-module selection\r\n- `gguf-quantization` \u002F `llama-cpp` — re-quantising a merged adapter back to GGUF\r\n- `verification-gated-probes` — building auditable probes with explicit gates\r\n","# Colab Cloud GPU Training\r\n\r\nDrive multi-hour GPU work (fine-tuning, big downloads, batch inference) on Colab\r\nfrom the Hermes desktop app on Windows, so the run survives session drops and the\r\noperator can hand it to a normal web browser when authorization is required.\r\n\r\nUse when a task involves: Colab \u002F `colab` CLI, rented A100\u002FT4\u002FH100 GPUs,\r\nfine-tuning that will not fit locally, multi-gigabyte downloads on a rented VM,\r\nor an operator who wants to drive the run themselves from a browser.\r\n\r\n## When to Use\r\n\r\nReach for this when **any** of these hold:\r\n\r\n- A GPU job will not fit the local box (27B+ fine-tuning, or VRAM \u003C the model)\r\n- The job runs longer than a Colab session, so a drop would cost real work\r\n- Tens of gigabytes must be downloaded on a rented VM\r\n- The operator wants to drive or authorise the run themselves from a browser\r\n- You are writing a handoff zip so someone else can execute the pipeline\r\n\r\nDo **not** use it for a quick inference check or a fine-tune that already fits\r\nthe local GPU — those belong to `peft-fine-tuning` and the local serving skills.\r\n\r\n## The one fact that decides the whole design\r\n\r\n**`\u002Fcontent` is ephemeral.** A Colab session that idles out and drops (404\u002F401)\r\nloses everything in it. Measured on this workstation: an idle drop destroyed all\r\n**50.98 GiB** of downloaded safetensors — every shard gone, nothing recoverable.\r\n\r\nTherefore:\r\n\r\n> **Anything multi-GB must live on `\u002Fcontent\u002Fdrive\u002FMyDrive`.** Use `\u002Fcontent`\r\n> only as scratch.\r\n\r\nDo not design a \"skip Drive to save a step\" pipeline. It looks fine until the\r\nfirst drop, and then every attempt re-downloads tens of gigabytes.\r\n\r\n## Workflow\r\n\r\n### 1. Create the session\r\n\r\n```bash\r\ncolab new --gpu A100 --session \u003Cname>     # T4 | L4 | G4 | H100 | A100\r\n```\r\n\r\nReturns `Session READY.` in ~5s. Note the backend id (`gpu-a100-s-kkb-...`).\r\nIt appears in `colab sessions`; a `[?]` prefix means the session is already lost.\r\n\r\n### 2. Mount Drive BEFORE downloading anything\r\n\r\n```bash\r\ncolab drivemount -s \u003Cname>\r\n```\r\n\r\nThis **blocks until the operator grants access in a browser** — it prints a\r\n`https:\u002F\u002Faccounts.google.com\u002Fo\u002Foauth2\u002Fv2\u002Fauth?...` URL and waits. Do not\r\nCtrl+C it. Surface the URL to the user; they paste it into a normal browser,\r\nsign in, and approve.\r\n\r\nConfirm with `scripts\u002Fdrivecheck.py` (see Support files) — it prints `DRIVE_OK`\r\nplus per-directory sizes.\r\n\r\n### 3. Stage scripts, then exec them\r\n\r\n`colab exec -f` reads a **local** path and streams it as a cell. It does *not*\r\nread a path that exists only inside the session.\r\n\r\n```bash\r\ncp scripts\u002Fstage1_....py ~\u002Fstage1.py      # stage into the local home first\r\ncolab exec -s \u003Cname> -f ~\u002Fstage1.py --timeout 10800\r\n```\r\n\r\nPassing `-f \u002Fcontent\u002Fstage1.py` fails with `FileNotFoundError` — that path is\r\nresolved locally, not remotely. `colab upload` exists for files you genuinely\r\nneed on the VM, but exec wants the local copy.\r\n\r\n### 4. Make every stage resumable\r\n\r\nLong stages get killed by the Colab Pro session ceiling. Write a sentinel and\r\nbranch on it so a re-run continues instead of restarting:\r\n\r\n```python\r\nmarker = f\"{DRIVE}\u002Fbase\u002F.materialised\"\r\nif os.path.exists(marker):\r\n    log(\"already present; skipping download\")\r\nelse:\r\n    ...download...\r\n    open(marker, \"w\").write(rev)\r\n```\r\n\r\nResolve HF cache symlinks into real bytes when materialising\r\n(`hf download` without `--local-dir` leaves symlinks into `..\u002F..\u002Fblobs`):\r\n\r\n```python\r\nreal = os.path.realpath(s)\r\nif os.path.islink(s) or os.path.abspath(real) != os.path.abspath(s):\r\n    shutil.copyfile(real, d)      # copy the blob, not the link\r\n```\r\n\r\n### 5. Ship a handoff package when the operator wants to drive it themselves\r\n\r\nLong operator-in-the-loop runs should end as a **zip**: a `README_手順書.md`\r\nwith numbered steps plus a `scripts\u002F` dir, each stage guarded by a Drive check.\r\nVerify before shipping — see *Verification before delivery*.\r\n\r\n## Pitfalls\r\n\r\n### `--auth=adc` is the wrong path when OAuth is already working\r\n\r\nThe CLI's default auth is `oauth2`, backed by `~\u002F.config\u002Fcolab-cli\u002Ftoken.json`.\r\nPassing `--auth=adc` forces Application Default Credentials, which needs\r\n`gcloud auth application-default login` and otherwise dies with\r\n`DefaultCredentialsError`. If tokens already exist, **do not pass `--auth`**:\r\n\r\n```bash\r\nls -l ~\u002F.config\u002Fcolab-cli\u002Ftoken.json     # present -> omit --auth entirely\r\n```\r\n\r\n### Session drops are not failures — check before re-downloading\r\n\r\n`colab exec` may return `Session '\u003Cname>' appears to be lost (404\u002F401). Cleaning\r\nup.` That is an idle timeout, not an auth failure. Recreate the session and\r\nre-run the stage; with Drive already holding the weights, the `.materialised`\r\nmarker skips the download.\r\n\r\n### A dropped session invalidates in-flight Drive auth URLs\r\n\r\nEach `drivemount` URL embeds the session endpoint and a one-shot token. If the\r\nsession died between issuing the URL and the user clicking it, the grant lands\r\nnowhere. Check `colab sessions` first, then re-issue.\r\n\r\n### Detached jobs need output on a shared mount\r\n\r\n`execute_code` is capped (~300s), so a multi-hour stage must run detached.\r\nRedirect into the `\u002Fmnt\u002Fc` shared mount so output survives the WSL process:\r\n\r\n```python\r\nwith open(LOG_L, \"wb\") as fh:\r\n    p = subprocess.Popen(\r\n        [\"wsl.exe\", \"-e\", \"bash\", \"-lc\",\r\n         f'colab exec -s {name} -f ~\u002Fstage.py --timeout 14000 > \"{LOG_W}\" 2>&1'],\r\n        stdout=fh, stderr=subprocess.STDOUT)\r\n```\r\n\r\nA bare `nohup ... &` inside the WSL command dies with the calling shell and\r\nleaves no log at all.\r\n\r\n### Verify an upstream tool against the version you will actually install\r\n\r\nReading a GitHub repo and then writing against its API is how you end up with\r\ncode that imports a module the published package does not ship.\r\n`happyscienceiscult\u002Fheretic` is the worked example: the git `master` branch has\r\n`heretic\u002Fplugin.py` and `heretic\u002Fscorer.py`, but the PyPI release\r\n`heretic-llm==1.4.0` does **not** — so every\r\n`from heretic.plugin import Plugin, Context` fails at import time on the installed\r\npackage.\r\n\r\nInstall it and check what actually imports before building on it:\r\n\r\n```python\r\nfor mod in (\"heretic\", \"heretic.plugin\", \"heretic.scorer\", \"heretic.config\"):\r\n    try:\r\n        __import__(mod); print(f\"{mod}: OK\")\r\n    except ImportError as e:\r\n        print(f\"{mod}: MISSING ({e})\")\r\n```\r\n\r\nWhat 1.4.0 *does* ship is more useful than the plugin API: `Settings.benchmarks`\r\nlists eleven lm-evaluation-harness benchmarks (agieval, bbh, commonsense_qa,\r\neq_bench, gsm8k, hellaswag, ifeval, mmlu, mmlu_pro, piqa, winogrande), and\r\n`main.objective` is an Optuna search over `direction_scope`, `direction_index`,\r\n`max_weight`, `max_weight_position`, `min_weight`, `min_weight_distance`. Reuse\r\nthose instead of inventing an evaluation surface. Keep any plugin-API shim behind\r\na function that raises a clear ImportError on builds that lack it — never\r\nmodule-level subclassing that breaks the whole import.\r\n\r\nInstall with `--no-deps` when the dependency closure is large and you only need to\r\ninspect the API surface; a full install can exceed a foreground timeout on its own.\r\n\r\n### Multi-file pipelines need a real orchestrator, not a README\r\n\r\nOnce a job has three or more stages, numbered steps in markdown become the failure\r\npoint: after a drop, neither the operator nor the agent can tell which stages\r\ncompleted. Ship a `run_pipeline.py` with `--list`, `--from N`, and `--only N`,\r\nwhere every stage checks its own marker file and the orchestrator stops at the\r\nfirst failure and prints status. Drive the Drive mount through it too, so a\r\nmissing mount is one refusal at the top rather than a silently ephemeral write in\r\nstage 4.\r\n\r\n### When the terminal tool refuses `wsl.exe`\r\n\r\nSome hosts block direct `wsl.exe` invocations from the terminal tool\r\n(`Security Center blocked a unverified execution candidate (SCAN_ERROR)`).\r\nRoute through `execute_code` + `subprocess` instead of retrying the terminal\r\nform — that is the working path, not a dead end. On this workstation that is the\r\nnormal route for every `colab` call.\r\n\r\n### A full-model plan over every tensor exceeds a 300s foreground budget\r\n\r\nScanning a 6.7 GiB GGUF, or planning edits across every tensor of a 27B model,\r\nroutinely runs past several minutes — and `execute_code` is capped at ~300s, so\r\nthe run dies and you learn nothing. Two fixes, in order of preference:\r\n\r\n- **Cut the work with a debug flag first.** A per-tensor block cap\r\n  (`--max-blocks-per-tensor 40`) turns an all-tense minutes pass into a ~5s one\r\n  and exercises the identical code path, so validate the logic before spending\r\n  the long run.\r\n- **Then launch the full pass detached** and poll the log file, rather than\r\n  re-issuing the foreground call and losing the result again each time.\r\n\r\n```python\r\nlog = r\"H:\\work\\plan.log\"\r\nwith open(log, \"w\", encoding=\"utf-8\") as fh:\r\n    p = subprocess.Popen([py, script, \"--full\"], stdout=fh,\r\n                         stderr=subprocess.STDOUT)\r\n# poll: read the log until a sentinel line appears\r\n```\r\n\r\nPicking a timeout budget up front is not enough — a genuinely long pass also\r\noutlives a `time.sleep` poll loop, so poll the LOG and check for the sentinel,\r\nnot the wall clock.\r\n\r\n### Long-lived binaries may not exist on the remote platform\r\n\r\nA Windows-only runtime build cannot be used on a Linux VM, and its absence\r\nusually surfaces only at stage 5. Detect it in the notebook before the expensive\r\nstages by asserting the capability you need, and make the failure name the fix:\r\n\r\n```python\r\nout = subprocess.run([quant, \"--help\"], capture_output=True, text=True)\r\nout = (out.stdout or \"\") + (out.stderr or \"\")\r\nassert \"PQ2_0\" in out, \"this build does not support PQ2_0; aborting\"\r\n```\r\n\r\nRefusing early with the exact required capability beats downloading 50 GiB and\r\ndiscovering at hour six that the quantizer cannot do the job.\r\n\r\n\r\nFor a handoff package, prove the artifact works rather than assuming:\r\n\r\n```python\r\nfor f in glob.glob(f\"{PKG}\u002Fscripts\u002F*.py\"):\r\n    py_compile.compile(f, doraise=True)     # every script parses\r\n# then: zip it, extract to a clean temp dir, recompile from the extract\r\n```\r\n\r\nAlso check the markdown you ship: a broken code fence or a reference to a file\r\nyou never created makes the procedure unusable. Cheap assertions that catch it:\r\n\r\n- `txt.count(\"```\") % 2 == 0` (fences balanced)\r\n- every `foo.py` mentioned in the README exists in `scripts\u002F`\r\n\r\nFix the package, not just the local copy — the operator only ever sees the zip.\r\n\r\n## Support files\r\n\r\n- `scripts\u002Fdrivecheck.py` — reusable probe: prints `DRIVE_OK` \u002F `DRIVE_MISSING`,\r\n  per-directory sizes, shard count + GiB, config arch summary, adapter presence.\r\n  Run it after mounting and again after any long download.\r\n- `references\u002Fsingle-token-classifier-lora.md` — training a model to answer by\r\n  scoring allowed candidate tokens (CE over the candidate logits only, no\r\n  generation), plus the two evaluator keying\u002Frounding traps that silently zero\r\n  your score.\r\n- `references\u002Fternary-bonsai-nimble.md` — worked end-to-end case: Ternary-Bonsai\r\n  27B × Nimble LoRA, including the 324-example holdout numbers, the model-family\r\n  provenance facts, and the PQ2_0 lattice-ablation method.\r\n\r\n## Related\r\n\r\n- `peft-fine-tuning` — LoRA\u002FQLoRA mechanics, rank and target-module selection\r\n- `gguf-quantization` \u002F `llama-cpp` — re-quantising a merged adapter back to GGUF\r\n- `verification-gated-probes` — building auditable probes with explicit gates\r\n",{"name":5,"author":37,"license":15,"version":38,"metadata":39,"description":7},"Hermes Agent","1.0.0",{"hermes":40},{"tags":41},[42,43,44,25,45,46],"Colab","Cloud-GPU","Training","Durability","Session-Recovery","main","0d1434f89f4bc6b07e9d272accd8c1013768820f","archive\u002Fskill-md-reviewed\u002Fsha256\u002F98\u002F98b2550d40b486c28c7d17056ed25e1fc08927fc31f81d6a20f43d7bf5c9cac4",0,"https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills","https:\u002F\u002Fgithub.com\u002Fzapabob","The Open University of JAPAN　2019-now\r\n\r\nTokyo University of Science　2007-2010","2026-10-26 16:29:01",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add zapabob\u002FSkills --skill colab-cloud-gpu-training",{"tool":61,"command":62},"bunx","bunx skills add zapabob\u002FSkills --skill colab-cloud-gpu-training",{"tool":64,"command":65},"pnpm","pnpm dlx skills add zapabob\u002FSkills --skill colab-cloud-gpu-training","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002F98\u002F98b2550d40b486c28c7d17056ed25e1fc08927fc31f81d6a20f43d7bf5c9cac4\u002FSKILL.md",true,[],[70,106,141,168,195,212],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":89,"publishedAt":32},"01M6GJTE1GESGGF9K028Y7753E","xurl","X\u002FTwitter via xurl CLI: post, search, DM, media, v2 API.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fxurl\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[76,81,84],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":82,"categoryName":83,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[72,90,91,92,93,94,95,96,97,98,99,100,101,27,28,102,47,103,104,105],"openclaw","macos","cli","github","linux","windows","official","search","https","social-media","api","Media","twitter","social","via","post",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":123,"publishedAt":32},"01M6GJT8S1PXQ8WPXT1HSNBWH2","writing-plans","Write implementation plans: bite-sized tasks, paths, code.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwriting-plans\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[112,115,118,119,120],{"categoryNo":113,"categoryName":114,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":116,"categoryName":117,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":82,"categoryName":83,"taxonomyType":79,"taxonomyTypeDesc":80},{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},{"categoryNo":121,"categoryName":122,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000036","内容创作者",[124,125,126,127,91,128,94,129,95,130,131,132,133,134,135,136,137,138,139,140],"writing","writing plans","plans","design","review","workflow","documentation","tasks","development","code","planning","code-review","subagent","write","superpowers","paths","test-driven-development",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":150,"publishedAt":32},"01M6GJST0H5X7WHBJ3BZK0DVKH","whisper","OpenAI's general-purpose speech recognition model. Supports 99 languages, transcription, translation to English, and language identification. Six model sizes from tiny (39M params) to large (1550M params). Use for speech-to-text, podcast transcription, or multilingual audio processing. Best for robust, multilingual ASR.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwhisper\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[147],{"categoryNo":148,"categoryName":149,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000016","图像与多媒体",[143,91,94,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167],"openai","speech","multimodal","Transformers","ASR","Audio","text","model","speech recognition","use","general","multilingual","translation","english","identification","processing","Audio Processing",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":177,"publishedAt":32},"01M6GJSMRQ8EETZTYMG72P70EA","weights-and-biases","W&B: log ML experiments, sweeps, model registry, dashboards.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fweights-and-biases\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[174],{"categoryNo":175,"categoryName":176,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000013","分析与可视化",[178,91,179,180,95,181,182,183,184,185,186,158,187,188,189,190,191,192,193,194],"weights and biases","tensorflow","experiments","pytorch","visualization","registry","real-time","tuning","dashboards","experiment","log","time","Experiment Tracking","Model Registry","Hyperparameter Tuning","WandB","Real-Time Visualization",{"skillNo":196,"name":197,"nameZh":6,"description":198,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":202,"publishedAt":32},"01M6GJS19KDPRY112JTR326S06","watchers","Poll RSS, JSON APIs, and GitHub with watermark dedup.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[201],{"categoryNo":82,"categoryName":83,"taxonomyType":79,"taxonomyTypeDesc":80},[197,91,203,93,94,204,205,206,207,208,209,27,28,210,211],"terminal","automation","http","monitoring","cron","json","rss","devops","with",{"skillNo":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":216,"categories":217,"keywords":220,"publishedAt":32},"01M6GJRHJD2A6Q830SWF9W48BC","serving-llms-vllm","vLLM: high-throughput LLM serving, OpenAI API, quantization.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fvllm\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[218,219],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},[221,222,223,94,224,151,225,226,227,154,228,100,229,230,231,232,233,234,235,236],"llms","vLLM","serving llms vllm","research","openai api","tensor","Inference Serving","Production","llm serving","High Throughput","PagedAttention","Continuous Batching","Quantization","Tensor Parallelism","high-throughput","throughput"]