@r1z4x/tezgah 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (582) hide show
  1. package/CHANGELOG.md +738 -0
  2. package/LICENSE +21 -0
  3. package/MANIFEST +753 -0
  4. package/README.de.md +169 -0
  5. package/README.es.md +168 -0
  6. package/README.fr.md +166 -0
  7. package/README.md +161 -0
  8. package/README.tr.md +163 -0
  9. package/agents/tezgah-reviewer.md +70 -0
  10. package/bin/codegen +337 -0
  11. package/bin/consult +797 -0
  12. package/bin/tezgah-adhd +50 -0
  13. package/bin/tezgah-agents +45 -0
  14. package/bin/tezgah-capture +66 -0
  15. package/bin/tezgah-context +96 -0
  16. package/bin/tezgah-decisions +213 -0
  17. package/bin/tezgah-design +953 -0
  18. package/bin/tezgah-docs +1199 -0
  19. package/bin/tezgah-doctor +497 -0
  20. package/bin/tezgah-dsh +37 -0
  21. package/bin/tezgah-dsh.cmd +70 -0
  22. package/bin/tezgah-gate +75 -0
  23. package/bin/tezgah-import-ai-research +439 -0
  24. package/bin/tezgah-index +32 -0
  25. package/bin/tezgah-lessons +148 -0
  26. package/bin/tezgah-mcp +322 -0
  27. package/bin/tezgah-migrate +324 -0
  28. package/bin/tezgah-pony +50 -0
  29. package/bin/tezgah-research +772 -0
  30. package/bin/tezgah-rollback +93 -0
  31. package/bin/tezgah-route +124 -0
  32. package/bin/tezgah-setup +5798 -0
  33. package/bin/tezgah-status +383 -0
  34. package/bin/tezgah-task +607 -0
  35. package/bin/tezgah-taste +423 -0
  36. package/bin/tezgah-triage +485 -0
  37. package/bin/tezgah.js +36 -0
  38. package/commands/adhd.md +21 -0
  39. package/commands/ponytail.md +21 -0
  40. package/docs/README.md +112 -0
  41. package/docs/architecture.md +226 -0
  42. package/docs/citations-baseline.json +59 -0
  43. package/docs/clarity-baseline.json +116 -0
  44. package/docs/contract.md +416 -0
  45. package/docs/environment.md +141 -0
  46. package/docs/evidence.md +831 -0
  47. package/docs/feature-audit.md +139 -0
  48. package/docs/gate.md +407 -0
  49. package/docs/glossary.md +201 -0
  50. package/docs/hosts.md +400 -0
  51. package/docs/index.json +471 -0
  52. package/docs/judge.md +193 -0
  53. package/docs/layers.md +189 -0
  54. package/docs/models.md +160 -0
  55. package/docs/operations.md +666 -0
  56. package/docs/research.md +809 -0
  57. package/docs/results/paired-outcome-2026-10.jsonl +254 -0
  58. package/docs/results/paired-outcome-2026-10.md +204 -0
  59. package/docs/skills.md +236 -0
  60. package/docs/status-line.md +315 -0
  61. package/docs/testing.md +287 -0
  62. package/docs/vision.md +117 -0
  63. package/hooks/hooks.json +33 -0
  64. package/hooks/projects-auto-init.py +98 -0
  65. package/hooks/projects-posttooluse.py +149 -0
  66. package/hooks/projects-pretooluse.py +40 -0
  67. package/hooks/projects-stop.py +60 -0
  68. package/hooks/tezgah_agents.py +817 -0
  69. package/hooks/tezgah_apps.py +266 -0
  70. package/hooks/tezgah_attest.py +255 -0
  71. package/hooks/tezgah_clarity.py +171 -0
  72. package/hooks/tezgah_components.py +140 -0
  73. package/hooks/tezgah_context.py +2953 -0
  74. package/hooks/tezgah_embed.py +765 -0
  75. package/hooks/tezgah_gate.py +2736 -0
  76. package/hooks/tezgah_guard.py +177 -0
  77. package/hooks/tezgah_index.py +124 -0
  78. package/hooks/tezgah_integrity.py +5141 -0
  79. package/hooks/tezgah_judge.py +487 -0
  80. package/hooks/tezgah_lang.py +230 -0
  81. package/hooks/tezgah_lessons.py +210 -0
  82. package/hooks/tezgah_models.py +855 -0
  83. package/hooks/tezgah_paths.py +1132 -0
  84. package/hooks/tezgah_policy.py +1039 -0
  85. package/hooks/tezgah_rank.py +77 -0
  86. package/hooks/tezgah_replay.py +1109 -0
  87. package/hooks/tezgah_research.py +5176 -0
  88. package/hooks/tezgah_shapes.py +305 -0
  89. package/hooks/tezgah_skill_pick.py +227 -0
  90. package/hooks/tezgah_snapshot.py +490 -0
  91. package/hooks/tezgah_stopspec.py +320 -0
  92. package/hooks/tezgah_task.py +458 -0
  93. package/hooks/tezgah_taste.py +201 -0
  94. package/hooks/tezgah_untrusted.py +112 -0
  95. package/hooks/tezgah_update.py +430 -0
  96. package/hosts/codex/hook.py +268 -0
  97. package/hosts/codex/hooks.json +26 -0
  98. package/hosts/cursor/hook.py +461 -0
  99. package/hosts/cursor/hooks.json +44 -0
  100. package/hosts/dsh/hooks.json +21 -0
  101. package/hosts/dsh/statusline/lib/client.js +138 -0
  102. package/hosts/dsh/statusline/lib/index.js +104 -0
  103. package/hosts/dsh/statusline/package.json +28 -0
  104. package/hosts/omp/hook.py +277 -0
  105. package/hosts/omp/tezgah-hook.ts.in +701 -0
  106. package/hosts/opencode/plugins/tezgah.js +2742 -0
  107. package/hosts/opencode/tui/tezgah-tui.tsx +151 -0
  108. package/output-styles/tezgah.md +142 -0
  109. package/package.json +32 -0
  110. package/packaging/build.sh +342 -0
  111. package/packaging/install.ps1 +166 -0
  112. package/packaging/install.sh +56 -0
  113. package/packaging/upgrade.sh +142 -0
  114. package/skills/ai-research/0-autoresearch-skill/SKILL.md +411 -0
  115. package/skills/ai-research/0-autoresearch-skill/references/agent-continuity.md +95 -0
  116. package/skills/ai-research/0-autoresearch-skill/references/progress-reporting.md +166 -0
  117. package/skills/ai-research/0-autoresearch-skill/references/skill-routing.md +219 -0
  118. package/skills/ai-research/0-autoresearch-skill/templates/findings.md +44 -0
  119. package/skills/ai-research/0-autoresearch-skill/templates/research-log.md +41 -0
  120. package/skills/ai-research/01-model-architecture/litgpt/SKILL.md +469 -0
  121. package/skills/ai-research/01-model-architecture/litgpt/references/custom-models.md +569 -0
  122. package/skills/ai-research/01-model-architecture/litgpt/references/distributed-training.md +452 -0
  123. package/skills/ai-research/01-model-architecture/litgpt/references/supported-models.md +337 -0
  124. package/skills/ai-research/01-model-architecture/litgpt/references/training-recipes.md +620 -0
  125. package/skills/ai-research/01-model-architecture/mamba/SKILL.md +260 -0
  126. package/skills/ai-research/01-model-architecture/mamba/references/architecture-details.md +207 -0
  127. package/skills/ai-research/01-model-architecture/mamba/references/benchmarks.md +256 -0
  128. package/skills/ai-research/01-model-architecture/mamba/references/training-guide.md +389 -0
  129. package/skills/ai-research/01-model-architecture/nanogpt/SKILL.md +290 -0
  130. package/skills/ai-research/01-model-architecture/nanogpt/references/architecture.md +383 -0
  131. package/skills/ai-research/01-model-architecture/nanogpt/references/data.md +477 -0
  132. package/skills/ai-research/01-model-architecture/nanogpt/references/training.md +565 -0
  133. package/skills/ai-research/01-model-architecture/rwkv/SKILL.md +260 -0
  134. package/skills/ai-research/01-model-architecture/rwkv/references/architecture-details.md +345 -0
  135. package/skills/ai-research/01-model-architecture/rwkv/references/rwkv7.md +387 -0
  136. package/skills/ai-research/01-model-architecture/rwkv/references/state-management.md +370 -0
  137. package/skills/ai-research/01-model-architecture/torchtitan/SKILL.md +358 -0
  138. package/skills/ai-research/01-model-architecture/torchtitan/references/checkpoint.md +182 -0
  139. package/skills/ai-research/01-model-architecture/torchtitan/references/custom-models.md +259 -0
  140. package/skills/ai-research/01-model-architecture/torchtitan/references/float8.md +134 -0
  141. package/skills/ai-research/01-model-architecture/torchtitan/references/fsdp.md +127 -0
  142. package/skills/ai-research/02-tokenization/huggingface-tokenizers/SKILL.md +516 -0
  143. package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/algorithms.md +654 -0
  144. package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/integration.md +638 -0
  145. package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/pipeline.md +724 -0
  146. package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/training.md +566 -0
  147. package/skills/ai-research/02-tokenization/sentencepiece/SKILL.md +235 -0
  148. package/skills/ai-research/02-tokenization/sentencepiece/references/algorithms.md +201 -0
  149. package/skills/ai-research/02-tokenization/sentencepiece/references/training.md +305 -0
  150. package/skills/ai-research/03-fine-tuning/axolotl/SKILL.md +158 -0
  151. package/skills/ai-research/03-fine-tuning/axolotl/references/api.md +5549 -0
  152. package/skills/ai-research/03-fine-tuning/axolotl/references/dataset-formats.md +1030 -0
  153. package/skills/ai-research/03-fine-tuning/axolotl/references/index.md +16 -0
  154. package/skills/ai-research/03-fine-tuning/axolotl/references/other.md +3564 -0
  155. package/skills/ai-research/03-fine-tuning/llama-factory/SKILL.md +80 -0
  156. package/skills/ai-research/03-fine-tuning/llama-factory/references/_images.md +24 -0
  157. package/skills/ai-research/03-fine-tuning/llama-factory/references/advanced.md +1056 -0
  158. package/skills/ai-research/03-fine-tuning/llama-factory/references/getting_started.md +350 -0
  159. package/skills/ai-research/03-fine-tuning/llama-factory/references/index.md +20 -0
  160. package/skills/ai-research/03-fine-tuning/llama-factory/references/other.md +32 -0
  161. package/skills/ai-research/03-fine-tuning/peft/SKILL.md +431 -0
  162. package/skills/ai-research/03-fine-tuning/peft/references/advanced-usage.md +515 -0
  163. package/skills/ai-research/03-fine-tuning/peft/references/troubleshooting.md +481 -0
  164. package/skills/ai-research/03-fine-tuning/unsloth/SKILL.md +80 -0
  165. package/skills/ai-research/03-fine-tuning/unsloth/references/index.md +8 -0
  166. package/skills/ai-research/03-fine-tuning/unsloth/references/llms.md +83 -0
  167. package/skills/ai-research/04-mechanistic-interpretability/nnsight/SKILL.md +436 -0
  168. package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/README.md +79 -0
  169. package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/api.md +345 -0
  170. package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/tutorials.md +301 -0
  171. package/skills/ai-research/04-mechanistic-interpretability/pyvene/SKILL.md +473 -0
  172. package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/README.md +74 -0
  173. package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/api.md +384 -0
  174. package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/tutorials.md +377 -0
  175. package/skills/ai-research/04-mechanistic-interpretability/saelens/SKILL.md +386 -0
  176. package/skills/ai-research/04-mechanistic-interpretability/saelens/references/README.md +71 -0
  177. package/skills/ai-research/04-mechanistic-interpretability/saelens/references/api.md +334 -0
  178. package/skills/ai-research/04-mechanistic-interpretability/saelens/references/tutorials.md +319 -0
  179. package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/SKILL.md +346 -0
  180. package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/README.md +55 -0
  181. package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/api.md +363 -0
  182. package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/tutorials.md +340 -0
  183. package/skills/ai-research/05-data-processing/nemo-curator/SKILL.md +383 -0
  184. package/skills/ai-research/05-data-processing/nemo-curator/references/deduplication.md +88 -0
  185. package/skills/ai-research/05-data-processing/nemo-curator/references/filtering.md +103 -0
  186. package/skills/ai-research/05-data-processing/ray-data/SKILL.md +326 -0
  187. package/skills/ai-research/05-data-processing/ray-data/references/integration.md +83 -0
  188. package/skills/ai-research/05-data-processing/ray-data/references/transformations.md +84 -0
  189. package/skills/ai-research/06-post-training/grpo-rl-training/README.md +98 -0
  190. package/skills/ai-research/06-post-training/grpo-rl-training/SKILL.md +572 -0
  191. package/skills/ai-research/06-post-training/miles/SKILL.md +315 -0
  192. package/skills/ai-research/06-post-training/miles/references/api-reference.md +142 -0
  193. package/skills/ai-research/06-post-training/miles/references/troubleshooting.md +353 -0
  194. package/skills/ai-research/06-post-training/openrlhf/SKILL.md +249 -0
  195. package/skills/ai-research/06-post-training/openrlhf/references/algorithm-comparison.md +405 -0
  196. package/skills/ai-research/06-post-training/openrlhf/references/custom-rewards.md +531 -0
  197. package/skills/ai-research/06-post-training/openrlhf/references/hybrid-engine.md +288 -0
  198. package/skills/ai-research/06-post-training/openrlhf/references/multi-node-training.md +455 -0
  199. package/skills/ai-research/06-post-training/simpo/SKILL.md +219 -0
  200. package/skills/ai-research/06-post-training/simpo/references/datasets.md +479 -0
  201. package/skills/ai-research/06-post-training/simpo/references/hyperparameters.md +453 -0
  202. package/skills/ai-research/06-post-training/simpo/references/loss-functions.md +351 -0
  203. package/skills/ai-research/06-post-training/slime/SKILL.md +464 -0
  204. package/skills/ai-research/06-post-training/slime/references/api-reference.md +393 -0
  205. package/skills/ai-research/06-post-training/slime/references/troubleshooting.md +387 -0
  206. package/skills/ai-research/06-post-training/torchforge/SKILL.md +433 -0
  207. package/skills/ai-research/06-post-training/torchforge/references/api-reference.md +328 -0
  208. package/skills/ai-research/06-post-training/torchforge/references/troubleshooting.md +410 -0
  209. package/skills/ai-research/06-post-training/trl-fine-tuning/SKILL.md +455 -0
  210. package/skills/ai-research/06-post-training/trl-fine-tuning/references/dpo-variants.md +228 -0
  211. package/skills/ai-research/06-post-training/trl-fine-tuning/references/online-rl.md +83 -0
  212. package/skills/ai-research/06-post-training/trl-fine-tuning/references/reward-modeling.md +123 -0
  213. package/skills/ai-research/06-post-training/trl-fine-tuning/references/sft-training.md +169 -0
  214. package/skills/ai-research/06-post-training/verl/SKILL.md +391 -0
  215. package/skills/ai-research/06-post-training/verl/references/api-reference.md +302 -0
  216. package/skills/ai-research/06-post-training/verl/references/troubleshooting.md +392 -0
  217. package/skills/ai-research/07-safety-alignment/constitutional-ai/SKILL.md +290 -0
  218. package/skills/ai-research/07-safety-alignment/llamaguard/SKILL.md +337 -0
  219. package/skills/ai-research/07-safety-alignment/nemo-guardrails/SKILL.md +297 -0
  220. package/skills/ai-research/07-safety-alignment/prompt-guard/SKILL.md +312 -0
  221. package/skills/ai-research/08-distributed-training/accelerate/SKILL.md +332 -0
  222. package/skills/ai-research/08-distributed-training/accelerate/references/custom-plugins.md +454 -0
  223. package/skills/ai-research/08-distributed-training/accelerate/references/megatron-integration.md +490 -0
  224. package/skills/ai-research/08-distributed-training/accelerate/references/performance.md +526 -0
  225. package/skills/ai-research/08-distributed-training/deepspeed/SKILL.md +141 -0
  226. package/skills/ai-research/08-distributed-training/deepspeed/references/08.md +18 -0
  227. package/skills/ai-research/08-distributed-training/deepspeed/references/09.md +174 -0
  228. package/skills/ai-research/08-distributed-training/deepspeed/references/2020.md +379 -0
  229. package/skills/ai-research/08-distributed-training/deepspeed/references/2023.md +280 -0
  230. package/skills/ai-research/08-distributed-training/deepspeed/references/assets.md +180 -0
  231. package/skills/ai-research/08-distributed-training/deepspeed/references/index.md +36 -0
  232. package/skills/ai-research/08-distributed-training/deepspeed/references/mii.md +119 -0
  233. package/skills/ai-research/08-distributed-training/deepspeed/references/other.md +1192 -0
  234. package/skills/ai-research/08-distributed-training/megatron-core/SKILL.md +366 -0
  235. package/skills/ai-research/08-distributed-training/megatron-core/references/benchmarks.md +250 -0
  236. package/skills/ai-research/08-distributed-training/megatron-core/references/parallelism-guide.md +405 -0
  237. package/skills/ai-research/08-distributed-training/megatron-core/references/production-examples.md +474 -0
  238. package/skills/ai-research/08-distributed-training/megatron-core/references/training-recipes.md +548 -0
  239. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/SKILL.md +231 -0
  240. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_async_recipe.md +14 -0
  241. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_overview.md +19 -0
  242. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_recipe.md +18 -0
  243. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_ddp_notes.md +10 -0
  244. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_device_mesh_tutorial.md +22 -0
  245. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_examples_fsdp2.md +15 -0
  246. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fsdp1_api.md +9 -0
  247. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fsdp2_tutorial.md +45 -0
  248. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fully_shard_api.md +49 -0
  249. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_tp_tutorial.md +22 -0
  250. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/ray_train_fsdp2_example.md +13 -0
  251. package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/torchtitan_fsdp_notes.md +14 -0
  252. package/skills/ai-research/08-distributed-training/pytorch-lightning/SKILL.md +346 -0
  253. package/skills/ai-research/08-distributed-training/pytorch-lightning/references/callbacks.md +437 -0
  254. package/skills/ai-research/08-distributed-training/pytorch-lightning/references/distributed.md +491 -0
  255. package/skills/ai-research/08-distributed-training/pytorch-lightning/references/hyperparameter-tuning.md +557 -0
  256. package/skills/ai-research/08-distributed-training/ray-train/SKILL.md +406 -0
  257. package/skills/ai-research/08-distributed-training/ray-train/references/multi-node.md +629 -0
  258. package/skills/ai-research/09-infrastructure/lambda-labs/SKILL.md +545 -0
  259. package/skills/ai-research/09-infrastructure/lambda-labs/references/advanced-usage.md +612 -0
  260. package/skills/ai-research/09-infrastructure/lambda-labs/references/troubleshooting.md +531 -0
  261. package/skills/ai-research/09-infrastructure/modal/SKILL.md +341 -0
  262. package/skills/ai-research/09-infrastructure/modal/references/advanced-usage.md +504 -0
  263. package/skills/ai-research/09-infrastructure/modal/references/troubleshooting.md +495 -0
  264. package/skills/ai-research/09-infrastructure/skypilot/SKILL.md +509 -0
  265. package/skills/ai-research/09-infrastructure/skypilot/references/advanced-usage.md +492 -0
  266. package/skills/ai-research/09-infrastructure/skypilot/references/troubleshooting.md +571 -0
  267. package/skills/ai-research/10-optimization/awq/SKILL.md +310 -0
  268. package/skills/ai-research/10-optimization/awq/references/advanced-usage.md +325 -0
  269. package/skills/ai-research/10-optimization/awq/references/troubleshooting.md +345 -0
  270. package/skills/ai-research/10-optimization/bitsandbytes/SKILL.md +411 -0
  271. package/skills/ai-research/10-optimization/bitsandbytes/references/memory-optimization.md +522 -0
  272. package/skills/ai-research/10-optimization/bitsandbytes/references/qlora-training.md +522 -0
  273. package/skills/ai-research/10-optimization/bitsandbytes/references/quantization-formats.md +448 -0
  274. package/skills/ai-research/10-optimization/flash-attention/SKILL.md +367 -0
  275. package/skills/ai-research/10-optimization/flash-attention/references/benchmarks.md +216 -0
  276. package/skills/ai-research/10-optimization/flash-attention/references/transformers-integration.md +294 -0
  277. package/skills/ai-research/10-optimization/gguf/SKILL.md +427 -0
  278. package/skills/ai-research/10-optimization/gguf/references/advanced-usage.md +505 -0
  279. package/skills/ai-research/10-optimization/gguf/references/troubleshooting.md +443 -0
  280. package/skills/ai-research/10-optimization/gptq/SKILL.md +450 -0
  281. package/skills/ai-research/10-optimization/gptq/references/calibration.md +338 -0
  282. package/skills/ai-research/10-optimization/gptq/references/integration.md +130 -0
  283. package/skills/ai-research/10-optimization/gptq/references/troubleshooting.md +96 -0
  284. package/skills/ai-research/10-optimization/hqq/SKILL.md +445 -0
  285. package/skills/ai-research/10-optimization/hqq/references/advanced-usage.md +529 -0
  286. package/skills/ai-research/10-optimization/hqq/references/troubleshooting.md +504 -0
  287. package/skills/ai-research/10-optimization/ml-training-recipes/SKILL.md +319 -0
  288. package/skills/ai-research/10-optimization/ml-training-recipes/references/architecture.md +320 -0
  289. package/skills/ai-research/10-optimization/ml-training-recipes/references/biomedical.md +498 -0
  290. package/skills/ai-research/10-optimization/ml-training-recipes/references/domain-specific.md +626 -0
  291. package/skills/ai-research/10-optimization/ml-training-recipes/references/experiment-loop.md +129 -0
  292. package/skills/ai-research/10-optimization/ml-training-recipes/references/optimizers.md +330 -0
  293. package/skills/ai-research/10-optimization/ml-training-recipes/references/scaling-and-selection.md +428 -0
  294. package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/SKILL.md +405 -0
  295. package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/benchmarks.md +394 -0
  296. package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/custom-tasks.md +425 -0
  297. package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/issues.md +395 -0
  298. package/skills/ai-research/11-evaluation/lm-evaluation-harness/SKILL.md +490 -0
  299. package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/api-evaluation.md +491 -0
  300. package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/benchmark-guide.md +489 -0
  301. package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/custom-tasks.md +603 -0
  302. package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/distributed-eval.md +520 -0
  303. package/skills/ai-research/11-evaluation/nemo-evaluator/SKILL.md +494 -0
  304. package/skills/ai-research/11-evaluation/nemo-evaluator/references/adapter-system.md +341 -0
  305. package/skills/ai-research/11-evaluation/nemo-evaluator/references/configuration.md +448 -0
  306. package/skills/ai-research/11-evaluation/nemo-evaluator/references/custom-benchmarks.md +316 -0
  307. package/skills/ai-research/11-evaluation/nemo-evaluator/references/execution-backends.md +362 -0
  308. package/skills/ai-research/12-inference-serving/llama-cpp/SKILL.md +258 -0
  309. package/skills/ai-research/12-inference-serving/llama-cpp/references/optimization.md +90 -0
  310. package/skills/ai-research/12-inference-serving/llama-cpp/references/quantization.md +214 -0
  311. package/skills/ai-research/12-inference-serving/llama-cpp/references/server.md +126 -0
  312. package/skills/ai-research/12-inference-serving/sglang/SKILL.md +442 -0
  313. package/skills/ai-research/12-inference-serving/sglang/references/deployment.md +491 -0
  314. package/skills/ai-research/12-inference-serving/sglang/references/radix-attention.md +414 -0
  315. package/skills/ai-research/12-inference-serving/sglang/references/structured-generation.md +542 -0
  316. package/skills/ai-research/12-inference-serving/tensorrt-llm/SKILL.md +187 -0
  317. package/skills/ai-research/12-inference-serving/tensorrt-llm/references/multi-gpu.md +299 -0
  318. package/skills/ai-research/12-inference-serving/tensorrt-llm/references/optimization.md +243 -0
  319. package/skills/ai-research/12-inference-serving/tensorrt-llm/references/serving.md +471 -0
  320. package/skills/ai-research/12-inference-serving/vllm/SKILL.md +364 -0
  321. package/skills/ai-research/12-inference-serving/vllm/references/optimization.md +227 -0
  322. package/skills/ai-research/12-inference-serving/vllm/references/quantization.md +285 -0
  323. package/skills/ai-research/12-inference-serving/vllm/references/server-deployment.md +256 -0
  324. package/skills/ai-research/12-inference-serving/vllm/references/troubleshooting.md +448 -0
  325. package/skills/ai-research/13-mlops/mlflow/SKILL.md +704 -0
  326. package/skills/ai-research/13-mlops/mlflow/references/deployment.md +745 -0
  327. package/skills/ai-research/13-mlops/mlflow/references/model-registry.md +771 -0
  328. package/skills/ai-research/13-mlops/mlflow/references/tracking.md +681 -0
  329. package/skills/ai-research/13-mlops/swanlab/SKILL.md +406 -0
  330. package/skills/ai-research/13-mlops/swanlab/references/integrations.md +305 -0
  331. package/skills/ai-research/13-mlops/swanlab/references/visualization.md +234 -0
  332. package/skills/ai-research/13-mlops/tensorboard/SKILL.md +629 -0
  333. package/skills/ai-research/13-mlops/tensorboard/references/integrations.md +639 -0
  334. package/skills/ai-research/13-mlops/tensorboard/references/profiling.md +546 -0
  335. package/skills/ai-research/13-mlops/tensorboard/references/visualization.md +621 -0
  336. package/skills/ai-research/13-mlops/weights-and-biases/SKILL.md +590 -0
  337. package/skills/ai-research/13-mlops/weights-and-biases/references/artifacts.md +585 -0
  338. package/skills/ai-research/13-mlops/weights-and-biases/references/integrations.md +701 -0
  339. package/skills/ai-research/13-mlops/weights-and-biases/references/sweeps.md +848 -0
  340. package/skills/ai-research/14-agents/a-evolve/SKILL.md +383 -0
  341. package/skills/ai-research/14-agents/a-evolve/references/README.md +831 -0
  342. package/skills/ai-research/14-agents/a-evolve/references/api.md +594 -0
  343. package/skills/ai-research/14-agents/a-evolve/references/architecture.md +417 -0
  344. package/skills/ai-research/14-agents/a-evolve/references/design-patterns.md +462 -0
  345. package/skills/ai-research/14-agents/a-evolve/references/examples.md +352 -0
  346. package/skills/ai-research/14-agents/a-evolve/references/issues.md +591 -0
  347. package/skills/ai-research/14-agents/a-evolve/references/releases.md +112 -0
  348. package/skills/ai-research/14-agents/a-evolve/references/tutorials.md +819 -0
  349. package/skills/ai-research/14-agents/autogpt/SKILL.md +403 -0
  350. package/skills/ai-research/14-agents/autogpt/references/advanced-usage.md +536 -0
  351. package/skills/ai-research/14-agents/autogpt/references/troubleshooting.md +421 -0
  352. package/skills/ai-research/14-agents/crewai/SKILL.md +498 -0
  353. package/skills/ai-research/14-agents/crewai/references/flows.md +439 -0
  354. package/skills/ai-research/14-agents/crewai/references/tools.md +430 -0
  355. package/skills/ai-research/14-agents/crewai/references/troubleshooting.md +481 -0
  356. package/skills/ai-research/14-agents/langchain/SKILL.md +480 -0
  357. package/skills/ai-research/14-agents/langchain/references/agents.md +500 -0
  358. package/skills/ai-research/14-agents/langchain/references/integration.md +563 -0
  359. package/skills/ai-research/14-agents/langchain/references/rag.md +601 -0
  360. package/skills/ai-research/14-agents/llamaindex/SKILL.md +569 -0
  361. package/skills/ai-research/14-agents/llamaindex/references/agents.md +84 -0
  362. package/skills/ai-research/14-agents/llamaindex/references/data_connectors.md +109 -0
  363. package/skills/ai-research/14-agents/llamaindex/references/query_engines.md +407 -0
  364. package/skills/ai-research/15-rag/chroma/SKILL.md +406 -0
  365. package/skills/ai-research/15-rag/chroma/references/integration.md +39 -0
  366. package/skills/ai-research/15-rag/faiss/SKILL.md +221 -0
  367. package/skills/ai-research/15-rag/faiss/references/index_types.md +281 -0
  368. package/skills/ai-research/15-rag/pinecone/SKILL.md +358 -0
  369. package/skills/ai-research/15-rag/pinecone/references/deployment.md +182 -0
  370. package/skills/ai-research/15-rag/qdrant/SKILL.md +493 -0
  371. package/skills/ai-research/15-rag/qdrant/references/advanced-usage.md +649 -0
  372. package/skills/ai-research/15-rag/qdrant/references/troubleshooting.md +632 -0
  373. package/skills/ai-research/15-rag/sentence-transformers/SKILL.md +255 -0
  374. package/skills/ai-research/15-rag/sentence-transformers/references/models.md +124 -0
  375. package/skills/ai-research/16-prompt-engineering/dspy/SKILL.md +590 -0
  376. package/skills/ai-research/16-prompt-engineering/dspy/references/examples.md +664 -0
  377. package/skills/ai-research/16-prompt-engineering/dspy/references/modules.md +476 -0
  378. package/skills/ai-research/16-prompt-engineering/dspy/references/optimizers.md +567 -0
  379. package/skills/ai-research/16-prompt-engineering/guidance/SKILL.md +572 -0
  380. package/skills/ai-research/16-prompt-engineering/guidance/references/backends.md +555 -0
  381. package/skills/ai-research/16-prompt-engineering/guidance/references/constraints.md +675 -0
  382. package/skills/ai-research/16-prompt-engineering/guidance/references/examples.md +768 -0
  383. package/skills/ai-research/16-prompt-engineering/instructor/SKILL.md +740 -0
  384. package/skills/ai-research/16-prompt-engineering/instructor/references/examples.md +108 -0
  385. package/skills/ai-research/16-prompt-engineering/instructor/references/providers.md +71 -0
  386. package/skills/ai-research/16-prompt-engineering/instructor/references/validation.md +607 -0
  387. package/skills/ai-research/16-prompt-engineering/outlines/SKILL.md +652 -0
  388. package/skills/ai-research/16-prompt-engineering/outlines/references/backends.md +616 -0
  389. package/skills/ai-research/16-prompt-engineering/outlines/references/examples.md +774 -0
  390. package/skills/ai-research/16-prompt-engineering/outlines/references/json_generation.md +653 -0
  391. package/skills/ai-research/17-observability/langsmith/SKILL.md +422 -0
  392. package/skills/ai-research/17-observability/langsmith/references/advanced-usage.md +549 -0
  393. package/skills/ai-research/17-observability/langsmith/references/troubleshooting.md +538 -0
  394. package/skills/ai-research/17-observability/phoenix/SKILL.md +475 -0
  395. package/skills/ai-research/17-observability/phoenix/references/advanced-usage.md +620 -0
  396. package/skills/ai-research/17-observability/phoenix/references/troubleshooting.md +539 -0
  397. package/skills/ai-research/18-multimodal/audiocraft/SKILL.md +564 -0
  398. package/skills/ai-research/18-multimodal/audiocraft/references/advanced-usage.md +667 -0
  399. package/skills/ai-research/18-multimodal/audiocraft/references/troubleshooting.md +505 -0
  400. package/skills/ai-research/18-multimodal/blip-2/SKILL.md +564 -0
  401. package/skills/ai-research/18-multimodal/blip-2/references/advanced-usage.md +681 -0
  402. package/skills/ai-research/18-multimodal/blip-2/references/troubleshooting.md +527 -0
  403. package/skills/ai-research/18-multimodal/clip/SKILL.md +253 -0
  404. package/skills/ai-research/18-multimodal/clip/references/applications.md +208 -0
  405. package/skills/ai-research/18-multimodal/cosmos-policy/SKILL.md +402 -0
  406. package/skills/ai-research/18-multimodal/cosmos-policy/references/libero-commands.md +175 -0
  407. package/skills/ai-research/18-multimodal/cosmos-policy/references/robocasa-commands.md +147 -0
  408. package/skills/ai-research/18-multimodal/llava/SKILL.md +304 -0
  409. package/skills/ai-research/18-multimodal/llava/references/training.md +198 -0
  410. package/skills/ai-research/18-multimodal/openpi/SKILL.md +480 -0
  411. package/skills/ai-research/18-multimodal/openpi/references/checkpoints-and-env-map.md +86 -0
  412. package/skills/ai-research/18-multimodal/openpi/references/config-recipes.md +50 -0
  413. package/skills/ai-research/18-multimodal/openpi/references/pytorch-gotchas.md +49 -0
  414. package/skills/ai-research/18-multimodal/openpi/references/remote-client-pattern.md +48 -0
  415. package/skills/ai-research/18-multimodal/openpi/references/training-debugging.md +46 -0
  416. package/skills/ai-research/18-multimodal/openvla-oft/SKILL.md +441 -0
  417. package/skills/ai-research/18-multimodal/openvla-oft/references/aloha-workflow.md +141 -0
  418. package/skills/ai-research/18-multimodal/openvla-oft/references/config-troubleshooting.md +97 -0
  419. package/skills/ai-research/18-multimodal/openvla-oft/references/libero-workflow.md +115 -0
  420. package/skills/ai-research/18-multimodal/openvla-oft/references/paper-and-checkpoints.md +84 -0
  421. package/skills/ai-research/18-multimodal/segment-anything/SKILL.md +500 -0
  422. package/skills/ai-research/18-multimodal/segment-anything/references/advanced-usage.md +590 -0
  423. package/skills/ai-research/18-multimodal/segment-anything/references/troubleshooting.md +485 -0
  424. package/skills/ai-research/18-multimodal/stable-diffusion/SKILL.md +519 -0
  425. package/skills/ai-research/18-multimodal/stable-diffusion/references/advanced-usage.md +717 -0
  426. package/skills/ai-research/18-multimodal/stable-diffusion/references/troubleshooting.md +556 -0
  427. package/skills/ai-research/18-multimodal/whisper/SKILL.md +317 -0
  428. package/skills/ai-research/18-multimodal/whisper/references/languages.md +190 -0
  429. package/skills/ai-research/19-emerging-techniques/knowledge-distillation/SKILL.md +458 -0
  430. package/skills/ai-research/19-emerging-techniques/knowledge-distillation/references/minillm.md +335 -0
  431. package/skills/ai-research/19-emerging-techniques/long-context/SKILL.md +536 -0
  432. package/skills/ai-research/19-emerging-techniques/long-context/references/extension_methods.md +469 -0
  433. package/skills/ai-research/19-emerging-techniques/long-context/references/fine_tuning.md +612 -0
  434. package/skills/ai-research/19-emerging-techniques/long-context/references/rope.md +403 -0
  435. package/skills/ai-research/19-emerging-techniques/model-merging/SKILL.md +497 -0
  436. package/skills/ai-research/19-emerging-techniques/model-merging/references/coefficient-tuning.md +415 -0
  437. package/skills/ai-research/19-emerging-techniques/model-merging/references/evaluation.md +463 -0
  438. package/skills/ai-research/19-emerging-techniques/model-merging/references/examples.md +429 -0
  439. package/skills/ai-research/19-emerging-techniques/model-merging/references/methods.md +353 -0
  440. package/skills/ai-research/19-emerging-techniques/model-pruning/SKILL.md +495 -0
  441. package/skills/ai-research/19-emerging-techniques/model-pruning/references/wanda.md +348 -0
  442. package/skills/ai-research/19-emerging-techniques/moe-training/SKILL.md +526 -0
  443. package/skills/ai-research/19-emerging-techniques/moe-training/references/architectures.md +433 -0
  444. package/skills/ai-research/19-emerging-techniques/moe-training/references/inference.md +349 -0
  445. package/skills/ai-research/19-emerging-techniques/moe-training/references/training.md +426 -0
  446. package/skills/ai-research/19-emerging-techniques/speculative-decoding/SKILL.md +467 -0
  447. package/skills/ai-research/19-emerging-techniques/speculative-decoding/references/lookahead.md +310 -0
  448. package/skills/ai-research/19-emerging-techniques/speculative-decoding/references/medusa.md +351 -0
  449. package/skills/ai-research/20-ml-paper-writing/academic-plotting/SKILL.md +479 -0
  450. package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/data-visualization.md +509 -0
  451. package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/diagram-generation.md +395 -0
  452. package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/style-guide.md +305 -0
  453. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/SKILL.md +982 -0
  454. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/checklists.md +348 -0
  455. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/citation-workflow.md +563 -0
  456. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/reviewer-guidelines.md +349 -0
  457. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/sources.md +165 -0
  458. package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/writing-guide.md +477 -0
  459. package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/SKILL.md +298 -0
  460. package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/references/slide-templates.md +505 -0
  461. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/SKILL.md +270 -0
  462. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/checklist.md +279 -0
  463. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/reviewer-guidelines.md +116 -0
  464. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/section-blueprints.md +400 -0
  465. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/systems-conferences.md +261 -0
  466. package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/writing-patterns.md +231 -0
  467. package/skills/ai-research/21-research-ideation/brainstorming-research-ideas/SKILL.md +384 -0
  468. package/skills/ai-research/21-research-ideation/creative-thinking-for-research/SKILL.md +366 -0
  469. package/skills/ai-research/22-agent-native-research-artifact/compiler/SKILL.md +245 -0
  470. package/skills/ai-research/22-agent-native-research-artifact/compiler/references/ara-schema.md +439 -0
  471. package/skills/ai-research/22-agent-native-research-artifact/compiler/references/exploration-tree-spec.md +125 -0
  472. package/skills/ai-research/22-agent-native-research-artifact/compiler/references/validation-checklist.md +149 -0
  473. package/skills/ai-research/22-agent-native-research-artifact/research-manager/SKILL.md +324 -0
  474. package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/event-taxonomy.md +124 -0
  475. package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/provenance-tags.md +190 -0
  476. package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/session-protocol.md +162 -0
  477. package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/SKILL.md +322 -0
  478. package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/references/review-dimensions.md +182 -0
  479. package/skills/ai-research/SKILL.md +101 -0
  480. package/skills/ai-research/SOURCE +38 -0
  481. package/skills/ai-research/index/1-frame.md +18 -0
  482. package/skills/ai-research/index/2-data.md +21 -0
  483. package/skills/ai-research/index/3-train.md +48 -0
  484. package/skills/ai-research/index/4-measure.md +25 -0
  485. package/skills/ai-research/index/5-run.md +23 -0
  486. package/skills/ai-research/index/6-write.md +35 -0
  487. package/skills/ai-research/library.json +3456 -0
  488. package/skills/analyze-app/EVALS.md +82 -0
  489. package/skills/analyze-app/SKILL.md +188 -0
  490. package/skills/design-contract/EVALS.md +80 -0
  491. package/skills/design-contract/SKILL.md +171 -0
  492. package/skills/design-library/EVALS.md +85 -0
  493. package/skills/design-library/INDEX.md +59 -0
  494. package/skills/design-library/SKILL.md +58 -0
  495. package/skills/design-library/SOURCE +131 -0
  496. package/skills/design-library/adaptive-interfaces/skills/colour-independence/SKILL.md +90 -0
  497. package/skills/design-library/adaptive-interfaces/skills/flexible-typography/SKILL.md +83 -0
  498. package/skills/design-library/adaptive-interfaces/skills/information-density/SKILL.md +87 -0
  499. package/skills/design-library/adaptive-interfaces/skills/preference-audit/SKILL.md +70 -0
  500. package/skills/design-library/adaptive-interfaces/skills/responsive-accessibility/SKILL.md +86 -0
  501. package/skills/design-library/adaptive-interfaces/skills/responsive-review/SKILL.md +76 -0
  502. package/skills/design-library/adaptive-interfaces/skills/simplified-views/SKILL.md +97 -0
  503. package/skills/design-library/adaptive-interfaces/skills/specify/SKILL.md +63 -0
  504. package/skills/design-library/adaptive-interfaces/skills/user-preference-respect/SKILL.md +100 -0
  505. package/skills/design-library/cognitive-accessibility/skills/adaptive-personalisation/SKILL.md +61 -0
  506. package/skills/design-library/cognitive-accessibility/skills/assess-load/SKILL.md +48 -0
  507. package/skills/design-library/cognitive-accessibility/skills/cognitive-load-assessment/SKILL.md +60 -0
  508. package/skills/design-library/cognitive-accessibility/skills/contextual-help-design/SKILL.md +61 -0
  509. package/skills/design-library/cognitive-accessibility/skills/error-prevention-recovery/SKILL.md +71 -0
  510. package/skills/design-library/cognitive-accessibility/skills/focus-attention-design/SKILL.md +67 -0
  511. package/skills/design-library/cognitive-accessibility/skills/memory-load-reduction/SKILL.md +60 -0
  512. package/skills/design-library/cognitive-accessibility/skills/plain-language-design/SKILL.md +78 -0
  513. package/skills/design-library/cognitive-accessibility/skills/review/SKILL.md +56 -0
  514. package/skills/design-library/cognitive-accessibility/skills/simplify/SKILL.md +39 -0
  515. package/skills/design-library/cognitive-accessibility/skills/wayfinding-navigation/SKILL.md +64 -0
  516. package/skills/design-library/design-research/skills/behavioural-analytics/SKILL.md +33 -0
  517. package/skills/design-library/design-research/skills/qual-quant-triangulation/SKILL.md +33 -0
  518. package/skills/design-library/inclusive-interaction/skills/audit/SKILL.md +50 -0
  519. package/skills/design-library/inclusive-interaction/skills/design-flow/SKILL.md +58 -0
  520. package/skills/design-library/inclusive-interaction/skills/feedback-and-status/SKILL.md +76 -0
  521. package/skills/design-library/inclusive-interaction/skills/gesture-alternatives/SKILL.md +70 -0
  522. package/skills/design-library/inclusive-interaction/skills/keyboard-navigation/SKILL.md +99 -0
  523. package/skills/design-library/inclusive-interaction/skills/keyboard-review/SKILL.md +54 -0
  524. package/skills/design-library/inclusive-interaction/skills/motion-sensitivity/SKILL.md +79 -0
  525. package/skills/design-library/inclusive-interaction/skills/multi-modal-input/SKILL.md +70 -0
  526. package/skills/design-library/inclusive-interaction/skills/touch-target-design/SKILL.md +71 -0
  527. package/skills/design-library/inclusive-interaction/skills/voice-interaction/SKILL.md +68 -0
  528. package/skills/design-library/visual-critique/skills/critique-affordance/SKILL.md +45 -0
  529. package/skills/design-library/visual-critique/skills/critique-brand-consistency/SKILL.md +42 -0
  530. package/skills/design-library/visual-critique/skills/critique-color/SKILL.md +44 -0
  531. package/skills/design-library/visual-critique/skills/critique-composition/SKILL.md +46 -0
  532. package/skills/design-library/visual-critique/skills/critique-information-density/SKILL.md +45 -0
  533. package/skills/design-library/visual-critique/skills/critique-typography/SKILL.md +45 -0
  534. package/skills/design-library/visual-critique/skills/critique-visual-hierarchy/SKILL.md +40 -0
  535. package/skills/feature-audit/EVALS.md +83 -0
  536. package/skills/feature-audit/SKILL.md +326 -0
  537. package/skills/harness/EVALS.md +81 -0
  538. package/skills/harness/SKILL.md +88 -0
  539. package/skills/i-have-adhd/EVALS.md +80 -0
  540. package/skills/i-have-adhd/SKILL.md +183 -0
  541. package/skills/no-ai-slop/EVALS.md +89 -0
  542. package/skills/no-ai-slop/SKILL.md +209 -0
  543. package/skills/no-ai-slop/eval.md +52 -0
  544. package/skills/plan-add/EVALS.md +79 -0
  545. package/skills/plan-add/SKILL.md +179 -0
  546. package/skills/plan-add/render_table.py +72 -0
  547. package/skills/plan-status/EVALS.md +78 -0
  548. package/skills/plan-status/SKILL.md +52 -0
  549. package/skills/plan-sync/EVALS.md +80 -0
  550. package/skills/plan-sync/SKILL.md +69 -0
  551. package/skills/pm-frameworks/SKILL.md +33 -0
  552. package/skills/pm-frameworks/SOURCE +39 -0
  553. package/skills/pm-frameworks/intended-vs-implemented/SKILL.md +42 -0
  554. package/skills/pm-frameworks/opportunity-solution-tree/SKILL.md +64 -0
  555. package/skills/ponytail/EVALS.md +80 -0
  556. package/skills/ponytail/SKILL.md +124 -0
  557. package/skills/product-analysis/EVALS.md +103 -0
  558. package/skills/product-analysis/SKILL.md +361 -0
  559. package/skills/research/EVALS.md +104 -0
  560. package/skills/research/SKILL.md +570 -0
  561. package/skills/rl-env/SKILL.md +53 -0
  562. package/skills/rl-env/SOURCE +41 -0
  563. package/skills/rl-env/generate-nemo-gym-env/SKILL.md +169 -0
  564. package/skills/rl-env/generate-nemo-gym-env/references/architecture.md +114 -0
  565. package/skills/rl-env/generate-openenv-env/SKILL.md +183 -0
  566. package/skills/rl-env/generate-openenv-env/references/architecture.md +82 -0
  567. package/skills/rl-env/generate-ors-env/SKILL.md +209 -0
  568. package/skills/rl-env/generate-ors-env/references/architecture.md +113 -0
  569. package/skills/rl-env/generate-verifiers-env/SKILL.md +188 -0
  570. package/skills/rl-env/generate-verifiers-env/references/architecture.md +119 -0
  571. package/skills/rl-env/rl-env-from-description/SKILL.md +124 -0
  572. package/skills/rl-env/rl-env-from-description/references/interview.md +75 -0
  573. package/skills/rl-env/rl-env-from-description/references/nemo_gym.md +41 -0
  574. package/skills/rl-env/rl-env-from-description/references/openenv.md +35 -0
  575. package/skills/rl-env/rl-env-from-description/references/ors.md +50 -0
  576. package/skills/rl-env/rl-env-from-description/references/verifiers.md +39 -0
  577. package/skills/tezgah-contract/EVALS.md +78 -0
  578. package/skills/tezgah-contract/SKILL.md +792 -0
  579. package/statusline.py +129 -0
  580. package/workflows/graph-impact.js +153 -0
  581. package/workflows/graph-map.js +158 -0
  582. package/workflows/graph-review.js +170 -0
@@ -0,0 +1,266 @@
1
+ """The browser and mobile app-analysis MCP servers tezgah wires into each host.
2
+
3
+ One source of truth: one row per feature in `REGISTRY`. tezgah-setup renders the
4
+ rows a selection enables into opencode.json, Codex config.toml, Cursor mcp.json,
5
+ omp's mcp.json and the dsh patch, so the per-host configs cannot drift; Claude
6
+ reads the `.mcp.json` at the plugin root, which the installer renders from the
7
+ same rows. A row carries the vendor command and env of its server, the `default`
8
+ state a config without a `features` key means, and the `dep` it cannot start
9
+ without - so what is wired, what is installed and what is reported all answer
10
+ from one key.
11
+
12
+ Both servers drive the app from its accessibility / DOM / native view tree, so
13
+ an analysis run does not need a screenshot per step; a screenshot is an
14
+ explicit, on-demand action. The browser profile is isolated by default - the
15
+ user's real Chrome is only reached by a deliberate attach, never automatically.
16
+
17
+ Nothing here is installed by tezgah: the commands run through `npx`, which is
18
+ present wherever node is (the dsh host and its status line already need it).
19
+ """
20
+ import os
21
+ import sys
22
+
23
+ HOME = os.path.expanduser("~")
24
+
25
+ # Where screenshots, traces and tree dumps land. The agent gets a path back;
26
+ # image bytes are never inlined into the prompt.
27
+ ARTIFACTS = os.environ.get("TEZGAH_ARTIFACTS") or os.path.join(
28
+ os.environ.get("XDG_CACHE_HOME") or os.path.join(HOME, ".cache"),
29
+ "tezgah", "apps")
30
+
31
+ # Pinned on purpose. A floating tag (`@latest`) makes every session start fetch
32
+ # whatever is current on the registry and run it with the agent's privileges -
33
+ # a supply-chain defect a 2,660-harness study found in 9.8% of committed agent
34
+ # configurations ("Scanning the Harness", arXiv 2609.07360). Bump these
35
+ # deliberately, not implicitly.
36
+ # Playwright MCP exposes core tools only unless capabilities are named, and the
37
+ # caps are exactly what a product audit needs: `testing` turns a UX claim into a
38
+ # re-runnable assertion (browser_verify_*), `storage` reaches a logged-in surface
39
+ # by saving and restoring a state file instead of attaching to the user's real
40
+ # Chrome, and `network` sets the offline state and mocks a failure - the two
41
+ # states a mobile-first product is judged on. `devtools` (traces, video) stays
42
+ # off: the opt-in chrome-devtools sidecar owns perf and deep network, and a
43
+ # second copy of it would only widen the tool list.
44
+ _PLAYWRIGHT = ["npx", "-y", "@playwright/mcp@0.0.81", "--isolated",
45
+ "--caps=testing,storage,network"]
46
+ _CHROME_DEVTOOLS = ["npx", "-y", "chrome-devtools-mcp@1.9.0", "--isolated",
47
+ "--no-usage-statistics"]
48
+ _MOBILE = ["npx", "-y", "@mobilenext/mobile-mcp@1.0.4"]
49
+
50
+ # The browser build the playwright row launches, installed by the same Playwright
51
+ # version that server ships: `@playwright/mcp@0.0.81` declares
52
+ # `playwright@1.64.0-alpha-2026-09-14` as its own dependency (read from its
53
+ # published package.json), and a browser cache written by another version can be
54
+ # the wrong revision for it. Bumping `_PLAYWRIGHT` means bumping this with it.
55
+ _PW_BROWSERS = ["npx", "-y", "playwright@1.64.0-alpha-2026-09-14",
56
+ "install", "chromium"]
57
+
58
+
59
+ # ------------------------------------------------------------------- probes ---
60
+ # Each probe answers "can this feature start?", not "is it wired": the wiring is
61
+ # tezgah's own file and the report reads that separately. They are called only
62
+ # when a feature's state is asked for, so `shutil` and `tezgah_paths` are
63
+ # imported here rather than at module level - this module is a leaf the
64
+ # installer imports on every host.
65
+
66
+ def _which(name):
67
+ import shutil
68
+ return shutil.which(name)
69
+
70
+
71
+ def _tp(attr):
72
+ import tezgah_paths
73
+ return getattr(tezgah_paths, attr)
74
+
75
+
76
+ def _browser_caches():
77
+ """Every directory Playwright itself would look in, in its own order.
78
+
79
+ `PLAYWRIGHT_BROWSERS_PATH=0` means "beside the package", which for an
80
+ npx-fetched server is inside the npx cache; the probe treats it as any other
81
+ miss instead of guessing a path there."""
82
+ local = os.environ.get("LOCALAPPDATA")
83
+ return tuple(p for p in (
84
+ os.environ.get("PLAYWRIGHT_BROWSERS_PATH"),
85
+ os.path.join(HOME, "Library", "Caches", "ms-playwright"),
86
+ os.path.join(HOME, ".cache", "ms-playwright"),
87
+ os.path.join(local, "ms-playwright") if local else None,
88
+ ) if p)
89
+
90
+
91
+ def _playwright_browsers():
92
+ """A browser cache holding a build, or None.
93
+
94
+ The server launches a browser on its first tool call, so one wired without a
95
+ build fails there instead of at install time - which is what the probe is
96
+ for. Any build counts: the row's own pin decides which one."""
97
+ for d in _browser_caches():
98
+ try:
99
+ found = sorted(e for e in os.listdir(d)
100
+ if e.startswith(("chromium", "firefox", "webkit")))
101
+ except OSError:
102
+ continue
103
+ if found:
104
+ return os.path.join(d, found[0])
105
+ return None
106
+
107
+
108
+ def _probe_playwright():
109
+ """`npx` to start the server, and a browser build for it to launch."""
110
+ if not _which("npx"):
111
+ return None
112
+ return _playwright_browsers()
113
+
114
+
115
+ def _probe_device_toolchain():
116
+ """`adb` (Android platform tools) or `xcrun` (macOS, whose simulator
117
+ services arrive with Xcode). Either one drives a device the native tree is
118
+ read from; no server here can start a device itself."""
119
+ return _which("adb") or _which("xcrun")
120
+
121
+
122
+ def _probe_npx():
123
+ return _which("npx")
124
+
125
+
126
+ def _probe_orx():
127
+ return _tp("orx_bin")()
128
+
129
+
130
+ # The fetch-and-convert step of an embedding row, run by the installer as its
131
+ # `cmd`, and the probe that answers whether the pinned file is in place.
132
+ _EMBED = os.path.join(os.path.dirname(os.path.abspath(__file__)), "tezgah_embed.py")
133
+
134
+
135
+ def _embed():
136
+ import tezgah_embed
137
+ return tezgah_embed
138
+
139
+
140
+ def _embed_row(ident, name, model):
141
+ return {"id": ident, "name": name,
142
+ "why": "lessons and docs ranked by meaning as well as words (%s)" % model,
143
+ "command": None, "env": None, "default": False,
144
+ # removed by --disable: the file is tezgah's own, not a tool the
145
+ # user may want for something else
146
+ "remove": lambda: _embed().remove(ident),
147
+ "dep": {"name": ident, "probe": lambda: _embed().valid(ident),
148
+ "needs": (sys.executable,),
149
+ "cmd": [sys.executable, _EMBED, "fetch", ident],
150
+ "why": "the converted model file under ~/.cache/tezgah/embed "
151
+ "(missing, or not the pinned sha256)"}}
152
+
153
+
154
+ # ----------------------------------------------------------------- registry ---
155
+ # One row per feature id. `command`/`env` are the server spec, so a row without
156
+ # a `command` is a feature with no host file to write (nothing iterates those
157
+ # into a host config - `servers()` is the accessor that filters them). `dep` is
158
+ # the runtime the feature cannot start without, in the shape the installer's own
159
+ # `DEPS` table uses: `probe` answers whether it is there, `needs` names the
160
+ # tools its `cmd` requires on PATH, `cmd` is the vendor's own installer, and a
161
+ # `cmd` of None is a dependency with no unattended installer to name - the
162
+ # probe still fails honestly instead of wiring a server whose runtime is absent.
163
+ REGISTRY = (
164
+ {"id": "mcp-playwright",
165
+ "name": "playwright",
166
+ "why": "web app analysis from the accessibility tree",
167
+ "command": _PLAYWRIGHT,
168
+ "env": {"PLAYWRIGHT_MCP_OUTPUT_DIR": ARTIFACTS},
169
+ "default": True,
170
+ "dep": {"name": "playwright-browsers", "probe": _probe_playwright,
171
+ "needs": ("npx",), "cmd": _PW_BROWSERS,
172
+ "why": "the browser it launches on its first tool call"}},
173
+ {"id": "mcp-mobile-mcp",
174
+ "name": "mobile-mcp",
175
+ "why": "iOS Simulator / Android emulator from the native tree",
176
+ "command": _MOBILE,
177
+ "env": {"MOBILEMCP_DISABLE_TELEMETRY": "1"},
178
+ "default": True,
179
+ "dep": {"name": "device-toolchain", "probe": _probe_device_toolchain,
180
+ "needs": (),
181
+ # Neither channel is an unattended vendor installer: Xcode comes
182
+ # from the App Store, the Android SDK from its own manager.
183
+ "cmd": None,
184
+ "why": "adb or Xcode's simulator services, for the device it drives"}},
185
+ # Opt-in (`--enable mcp-chrome-devtools`, or `--devtools`): perf traces, deep
186
+ # network and source-mapped console. Playwright's tree snapshot is the
187
+ # analysis default; this is the diagnostic sidecar the second opinion
188
+ # recommended keeping separate.
189
+ {"id": "mcp-chrome-devtools",
190
+ "name": "chrome-devtools",
191
+ "why": "web perf traces, deep network and source-mapped console",
192
+ "command": _CHROME_DEVTOOLS,
193
+ "env": {},
194
+ "default": False,
195
+ "dep": {"name": "npx", "probe": _probe_npx, "needs": (),
196
+ # The package itself is fetched by npx on demand, and node has no
197
+ # unattended vendor installer to name here.
198
+ "cmd": None,
199
+ "why": "node, which npx runs the server through"}},
200
+ # Not a server: the OpenResearch CLI the research routing shells out to.
201
+ # Same dep record the installer's DEPS table carries for it.
202
+ {"id": "orx",
203
+ "name": "orx",
204
+ "why": "research routing (OpenResearch)",
205
+ "command": None,
206
+ "env": None,
207
+ "default": True,
208
+ "dep": {"name": "orx", "probe": _probe_orx, "needs": ("curl", "sh"),
209
+ "cmd": ["sh", "-c",
210
+ "curl -LsSf https://openresearch.sh/install.sh | sh"],
211
+ "why": "research routing (OpenResearch)"}},
212
+ # Opt-in, not servers: a static embedding model fused with BM25 for the
213
+ # per-turn lessons and the docs fallback (hooks/tezgah_embed.py). Enabling
214
+ # one fetches and converts its pinned file; the first selected one is used.
215
+ _embed_row("embed-mrl", "embed-mrl",
216
+ "static-similarity-mrl-multilingual-v1, 128 dims, "
217
+ "~436 MB download, 15 MB file"),
218
+ _embed_row("embed-m2v", "embed-m2v",
219
+ "potion-multilingual-128M, PCA-128, ~531 MB download, 42 MB file"),
220
+ )
221
+
222
+ IDS = tuple(r["id"] for r in REGISTRY)
223
+ # Every id that carries a server, i.e. every name tezgah may have written into a
224
+ # host file. Uninstall reads this (`names(MCP_IDS)`), never a disable: a feature
225
+ # that is off today still has to be swept from a file an older release wrote.
226
+ MCP_IDS = tuple(r["id"] for r in REGISTRY if r["command"])
227
+
228
+
229
+ def defaults():
230
+ """The ids a config with no `features` key means.
231
+
232
+ Declared per row, never inferred from what is installed or from how the
233
+ registry is ordered, so a config.json written before that key existed keeps
234
+ exactly the wiring it had."""
235
+ return tuple(r["id"] for r in REGISTRY if r["default"])
236
+
237
+
238
+ def selected_ids(selected=None):
239
+ """`selected` normalised to registry order.
240
+
241
+ `None` means the declared defaults - an absent key is not "none". An id this
242
+ registry does not know is dropped rather than raising, so a selection an
243
+ older release wrote cannot break a host writer; `--features` is where an
244
+ unknown id is reported."""
245
+ if selected is None:
246
+ return defaults()
247
+ if isinstance(selected, (bool, str)):
248
+ # A bool is the `devtools` argument this signature replaced and a string
249
+ # is iterable, so either one left at a call site would answer with the
250
+ # wrong set - or, for the bool, with an unreadable "not iterable" from
251
+ # `set()`. Name the argument the caller has to give instead.
252
+ raise TypeError("selected is a list of feature ids, not %s"
253
+ % type(selected).__name__)
254
+ wanted = set(selected)
255
+ return tuple(r["id"] for r in REGISTRY if r["id"] in wanted)
256
+
257
+
258
+ def servers(selected=None):
259
+ """The enabled rows that carry a server, in registry order."""
260
+ on = set(selected_ids(selected))
261
+ return tuple(r for r in REGISTRY if r["id"] in on and r["command"])
262
+
263
+
264
+ def names(selected=None):
265
+ """The server names of `servers(selected)`."""
266
+ return [r["name"] for r in servers(selected)]
@@ -0,0 +1,255 @@
1
+ #!/usr/bin/env python3
2
+ """Runtime attestation: are tezgah's own hook entries armed and unchanged?
3
+
4
+ `tezgah-setup --report` reads what an install WROTE, and `--report --live` proves
5
+ the hooks EXECUTE, but both run only when someone asks. This is the per-session
6
+ half: every host's session start compares the hook entries tezgah owns with what
7
+ the install recorded, writes one `attest` row, and keeps a drift mark the status
8
+ line and the Stop rule's claim row read.
9
+
10
+ One store, not two: the install record is the per-artifact sha file the contract
11
+ artifacts already use (`contract.sha256`, `bin/tezgah-setup::record_contract`),
12
+ one line per entry under a `hook:<host>:<entry>` key. An entry is one hook event's
13
+ tezgah-owned groups (Claude, dsh, Codex, Cursor - so a removed PreToolUse is named
14
+ while PostToolUse stays), opencode's plugin links, and nothing for omp: its bridge
15
+ is compared to a fresh render, the way `rules_current` compares a rules file. The
16
+ code an entry runs is hashed only on a packaged install (a tree with no `.git`):
17
+ a checkout install points into a tree its owner edits on purpose. A hook file
18
+ any user can write (0666) is drift too; group write is left alone, because a
19
+ umask of 002 (user-private groups) gives every file that.
20
+
21
+ Drift is evidence, never integrity: the same uid that could edit a hook can edit
22
+ the record. It is never a Stop block, and its text never tells the model what to
23
+ run - the user reads it and decides.
24
+ """
25
+ import hashlib
26
+ import json
27
+ import os
28
+
29
+ import tezgah_paths as tp
30
+
31
+ ROOT = tp.PLUGIN_ROOT
32
+ CONTRACT_SHA = os.path.join(tp.CONFIG_DIR, "contract.sha256")
33
+ KEY = "hook:%s:%s"
34
+ # The scripts a host's registration runs, relative to the tree: one file each,
35
+ # so a session start never hashes the plugin tree (about 710 files).
36
+ CLAUDE_SCRIPTS = tuple(os.path.join("hooks", n) for n in (
37
+ "projects-auto-init.py", "projects-pretooluse.py", "projects-posttooluse.py",
38
+ "projects-stop.py"))
39
+ CODE_TARGETS = {
40
+ "claude": CLAUDE_SCRIPTS, "dsh": CLAUDE_SCRIPTS,
41
+ "codex": (os.path.join("hosts", "codex", "hook.py"),),
42
+ "cursor": (os.path.join("hosts", "cursor", "hook.py"),),
43
+ "opencode": (os.path.join("hosts", "opencode", "plugins", "tezgah.js"),),
44
+ "omp": (os.path.join("hosts", "omp", "hook.py"),),
45
+ }
46
+ OPENCODE_DIRS = ("plugins", "plugin")
47
+ OMP_BRIDGE = os.path.join(tp.HOST_DIRS["omp"], "agent", "hooks", "pre",
48
+ "tezgah-hook.ts")
49
+
50
+
51
+ def sha(text):
52
+ return hashlib.sha256(text.encode("utf-8")).hexdigest()
53
+
54
+
55
+ def recorded_shas(path=CONTRACT_SHA):
56
+ """{key: sha} from the install record, in sha256sum's `<sha> <key>` shape."""
57
+ out = {}
58
+ try:
59
+ with open(path, encoding="utf-8") as fh:
60
+ for line in fh:
61
+ digest, _, key = line.rstrip("\n").partition(" ")
62
+ if key:
63
+ out[key] = digest
64
+ except OSError:
65
+ pass
66
+ return out
67
+
68
+
69
+ def own_groups(data, own=False):
70
+ """{event: canonical JSON of its tezgah-owned groups} for a `{"hooks": ...}`
71
+ manifest. In a shared file (Codex, Cursor) only a group naming tezgah is
72
+ tezgah's - the filter `install_codex`/`install_cursor` replace by; in
73
+ tezgah's own manifest (`own`) every group is."""
74
+ hooks = data.get("hooks") if isinstance(data, dict) else None
75
+ out = {}
76
+ for event, groups in (hooks if isinstance(hooks, dict) else {}).items():
77
+ mine = [g for g in groups if own or "tezgah" in json.dumps(g)] \
78
+ if isinstance(groups, list) else []
79
+ if mine:
80
+ out[event] = json.dumps(mine, sort_keys=True)
81
+ return out
82
+
83
+
84
+ def _manifest(path, own):
85
+ try:
86
+ with open(path, encoding="utf-8") as fh:
87
+ return own_groups(json.load(fh), own)
88
+ except (OSError, ValueError):
89
+ return None
90
+
91
+
92
+ def omp_bridge(root=ROOT):
93
+ """The omp extension as an install writes it: the template with this tree's
94
+ hook path, or "" when the template is unreadable."""
95
+ try:
96
+ with open(os.path.join(root, "hosts", "omp", "tezgah-hook.ts.in"),
97
+ encoding="utf-8") as fh:
98
+ return fh.read().replace(
99
+ "@HOOK@", os.path.join(root, "hosts", "omp", "hook.py"))
100
+ except OSError:
101
+ return ""
102
+
103
+
104
+ def registration(host, root=ROOT):
105
+ """({entry: text}, [files]) for the tezgah-owned hook entries this host has
106
+ on disk; the dict is None when the host's file cannot be read."""
107
+ if host in ("claude", "dsh"):
108
+ path = os.path.join(root, *(("hooks",) if host == "claude"
109
+ else ("hosts", "dsh")), "hooks.json")
110
+ return _manifest(path, own=True), [path]
111
+ if host in ("codex", "cursor"):
112
+ path = os.path.join(tp.HOST_DIRS[host], "hooks.json")
113
+ return _manifest(path, own=False), [path]
114
+ if host == "opencode":
115
+ links = (os.path.join(tp.HOST_DIRS["opencode"], d, "tezgah.js")
116
+ for d in OPENCODE_DIRS)
117
+ # a keg path is read through opt/, so a `brew upgrade` is no change
118
+ return {os.path.basename(os.path.dirname(p)): tp.stable_root(os.path.realpath(p))
119
+ for p in links if os.path.lexists(p)}, []
120
+ if host == "omp":
121
+ try:
122
+ with open(OMP_BRIDGE, encoding="utf-8") as fh:
123
+ return {"bridge": fh.read()}, [OMP_BRIDGE]
124
+ except OSError:
125
+ return None, [OMP_BRIDGE]
126
+ return None, []
127
+
128
+
129
+ def packaged(root=ROOT):
130
+ """A release tree (tarball, npm, brew) carries no `.git`."""
131
+ return not os.path.exists(os.path.join(root, ".git"))
132
+
133
+
134
+ def code_text(host, root=ROOT):
135
+ """`<relpath> <sha>` per script the host's entries run, or None."""
136
+ lines = []
137
+ for rel in CODE_TARGETS.get(host, ()):
138
+ try:
139
+ with open(os.path.join(root, rel), "rb") as fh:
140
+ lines.append("%s %s" % (rel, hashlib.sha256(fh.read()).hexdigest()))
141
+ except OSError:
142
+ return None
143
+ return "\n".join(lines)
144
+
145
+
146
+ def record_texts(host, root=ROOT):
147
+ """{key: text} an install records for one host (`bin/tezgah-setup::record_hooks`)."""
148
+ entries, _files = registration(host, root)
149
+ out = {}
150
+ if host != "omp":
151
+ out.update((KEY % (host, name), text)
152
+ for name, text in (entries or {}).items())
153
+ code = code_text(host, root) if packaged(root) else None
154
+ if code is not None:
155
+ out[KEY % (host, "code")] = code
156
+ return out
157
+
158
+
159
+ def drift(host, root=ROOT, shas=None):
160
+ """(drifted, unverified): what differs from the install, and what cannot be
161
+ judged because the install recorded nothing for it."""
162
+ shas = recorded_shas() if shas is None else shas
163
+ prefix = KEY % (host, "")
164
+ recorded = {k[len(prefix):]: v for k, v in shas.items() if k.startswith(prefix)}
165
+ entries, files = registration(host, root)
166
+ found, unknown = [], []
167
+ for path in files:
168
+ try:
169
+ mode = os.stat(path).st_mode & 0o777
170
+ except OSError:
171
+ continue
172
+ if mode & 0o002:
173
+ found.append("%s mode %04o" % (path, mode))
174
+ if entries is None:
175
+ found.append("%s unreadable or missing" % files[0])
176
+ elif host == "omp":
177
+ if entries["bridge"] != omp_bridge(root):
178
+ found.append("omp bridge %s differs from a fresh render" % OMP_BRIDGE)
179
+ else:
180
+ names = set(recorded) - {"code"}
181
+ if not names:
182
+ unknown.append("no install record for %s hook entries" % host)
183
+ for name in sorted(names | set(entries)) if names else ():
184
+ if name not in entries:
185
+ found.append("%s %s entry removed" % (host, name))
186
+ elif name not in recorded:
187
+ found.append("%s %s entry added" % (host, name))
188
+ elif recorded[name] != sha(entries[name]):
189
+ found.append("%s %s entry changed" % (host, name))
190
+ if "code" in recorded:
191
+ code = code_text(host, root)
192
+ if code is None or sha(code) != recorded["code"]:
193
+ found.append("%s hook code changed since install" % host)
194
+ return found, unknown
195
+
196
+
197
+ def drift_mark(session_id, host):
198
+ """The mark one host's drifted session start leaves; its text is the drift
199
+ list. Keyed by session AND host: two hosts can share a session id (a
200
+ `tezgah-context attest` run by hand, a host whose ids collide), and a clean
201
+ start on one must not clear the other's mark."""
202
+ return os.path.join(tp.cache_dir(), "harness-drift", "%s.%s" % (
203
+ hashlib.sha256(str(session_id).encode()).hexdigest()[:16], host))
204
+
205
+
206
+ def mark_text(session_id):
207
+ """The drift lists this session's starts recorded, every host's, or ""."""
208
+ if not session_id:
209
+ return ""
210
+ texts = []
211
+ for host in CODE_TARGETS:
212
+ try:
213
+ with open(drift_mark(session_id, host), encoding="utf-8") as fh:
214
+ text = fh.read().strip()
215
+ except OSError:
216
+ continue
217
+ if text and text not in texts:
218
+ texts.append(text)
219
+ return "; ".join(texts)
220
+
221
+
222
+ def switches():
223
+ """The kill switches present, by name. Before the latching plan (051) lands
224
+ this is all the row can say about them."""
225
+ names = set()
226
+ for d in tp.OFF_DIRS:
227
+ try:
228
+ names.update(n for n in os.listdir(d) if n.endswith((".off", "-off")))
229
+ except OSError:
230
+ pass
231
+ return sorted(names)
232
+
233
+
234
+ def run(host, session_id, cwd=None):
235
+ """One `attest` row for this session start, and the drift mark set or
236
+ cleared to match; the drift list. Outside a root it does nothing."""
237
+ if not session_id or not tp.root_for(cwd or os.getcwd()):
238
+ return None
239
+ found, unknown = drift(host)
240
+ detail = ("drifted: " + "; ".join(found) if found
241
+ else "unverified: " + "; ".join(unknown) if unknown else "ok")
242
+ import tezgah_integrity
243
+ tezgah_integrity.note(session_id, "attest", detail, host=host,
244
+ switches=",".join(switches()) or None)
245
+ mark = drift_mark(session_id, host)
246
+ try:
247
+ if found:
248
+ os.makedirs(os.path.dirname(mark), exist_ok=True)
249
+ with open(mark, "w", encoding="utf-8") as fh:
250
+ fh.write("; ".join(found) + "\n")
251
+ elif os.path.exists(mark):
252
+ os.remove(mark)
253
+ except OSError:
254
+ pass
255
+ return found