@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,305 @@
1
+ """The recurring refusal shapes the local ledgers hold, folded.
2
+
3
+ `failure_shapes()` reads every ledger on this machine - the same corpus walk
4
+ `tezgah_integrity.counters_all()` makes, through the same two readers
5
+ (`ledgers()` and `events_path()`) - and groups the `deny` rows by the rule label
6
+ its writer put before the first colon, which is the label `_counts` already
7
+ folds by. A shape is reported only when it recurs in at least
8
+ `RECURRING_SESSIONS` distinct sessions: one session's repeated refusal is an
9
+ anecdote about that session, and a report that could not tell the two apart
10
+ would recommend a change to a shape that met its rule once.
11
+
12
+ **It is a report, not a gate.** Nothing here refuses a call, no caller reads it
13
+ on the hot path, and the CLI that prints it always exits 0. The corpus size it
14
+ read is printed with the answer, because an empty report must not read as
15
+ "nothing recurs" when the fold read nothing at all.
16
+
17
+ **The precision proxy is not optional, and raw frequency must never rank this
18
+ list.** Every shape carries `fires_per_session` = its fires over the sessions it
19
+ fired in, so a count inflated by one long session repeating itself (a value well
20
+ above 1.0) is visible beside the count that inflated it. The trap the field
21
+ exists for is the highest-firing rule on this machine, `drift`: it fires on long
22
+ careful turns whether or not anything is drifting
23
+ (an internal hardening research line, C04/C11 - 181 fires in 143
24
+ sessions, and it fired three times while that experiment was written), so a
25
+ report ranked by fires would hand its reader the one rule whose count carries
26
+ the least signal about a real failure. The ledger stores no ground truth for
27
+ whether a refusal was a failure worth fixing - the detail is the reason text and
28
+ the row says nothing about what the turn was doing - so `fires_per_session` is a
29
+ proxy for how much of a shape's count is repetition, and never a precision
30
+ measurement.
31
+
32
+ `rule_yield()` is the other half of the same reading: the live gate rules that
33
+ stopped firing. A rule missing from `failure_shapes` may be dead or may be a day
34
+ old, and only its exposure - the real ledgers written since it shipped - tells
35
+ the two apart.
36
+ """
37
+ from collections import Counter, defaultdict
38
+ import ast
39
+ import os
40
+ import re
41
+ import subprocess
42
+
43
+ import tezgah_integrity as ti
44
+
45
+ # The floor a shape must clear to be reported at all: distinct sessions, not
46
+ # rows. Below it, a shape is one session's habit.
47
+ RECURRING_SESSIONS = 5
48
+
49
+ # How many of a shape's most common command shapes come with it.
50
+ MAX_COMMANDS = 3
51
+
52
+ # The one normalization a shape text gets: a digit run is a variant of one
53
+ # shape, not a shape of its own (`drift`'s `Long turn (25 work rows...)`,
54
+ # `(26 work rows...)` and `(27 ...)` are one shape, three fires).
55
+ DIGITS = re.compile(r"\d+")
56
+
57
+
58
+ def _label(detail):
59
+ """The rule label of a deny row's detail: the text before the first colon,
60
+ or `other` when there is none - the derivation `_counts` folds by, so a
61
+ shape's name and a counter's key are the same string."""
62
+ return str(detail or "").split(":", 1)[0].strip() or "other"
63
+
64
+
65
+ def _command(detail):
66
+ """One deny row's command shape: what its writer recorded after the label -
67
+ the refused call's own reason text, already credential-redacted by the one
68
+ append every row goes through (`tezgah_integrity.note_path`), which is why
69
+ no second redactor lives here - with digit runs collapsed and whitespace
70
+ folded, so the variants of one refusal read as one shape."""
71
+ text = str(detail or "")
72
+ tail = text.split(":", 1)[1] if ":" in text else ""
73
+ return DIGITS.sub("N", " ".join(ti.redact(tail).split()))
74
+
75
+
76
+ def _contract(value):
77
+ """A row's contract version as the report names it: `v1`, or `unversioned`
78
+ for a row written before the writer stamped one."""
79
+ return "unversioned" if value is None else "v%s" % value
80
+
81
+
82
+ def failure_shapes():
83
+ """Every shape recurring in at least `RECURRING_SESSIONS` distinct sessions.
84
+
85
+ Returns `ledgers` (how many files the fold read), `recurring_sessions` (the
86
+ floor it applied) and `shapes`: one object per shape with `rule`,
87
+ `sessions`, `fires`, `fires_per_session` and up to `MAX_COMMANDS` of its
88
+ most common command shapes, most common first, ties by text so two runs of
89
+ the report agree. Ranked by distinct sessions descending - the
90
+ cross-instance recurrence this exists to find - never by fires, and the
91
+ module docstring says why.
92
+
93
+ `row_versions` counts the rows the fold read by the contract that wrote them
94
+ (`unversioned` for a row predating the field): a shape can move because the
95
+ rule changed or because a row's meaning did, and a report that cannot tell
96
+ the two apart would attribute one to the other.
97
+
98
+ Bound: none, like `counters_all`, and for the same reason - a window would
99
+ make the report contradict the corpus it claims to be about."""
100
+ files = ti.ledgers()
101
+ sessions = defaultdict(set)
102
+ fires = Counter()
103
+ commands = defaultdict(Counter)
104
+ versions = Counter()
105
+ for path in files:
106
+ # every session's ledger, so one damaged file costs its own rows and
107
+ # not the report (audit GAP-02 / M-7: the same reader shape turned the
108
+ # cross-session write gate off machine-wide)
109
+ for row in ti._foreign_rows(path):
110
+ # A string label, not the raw value: a None key beside int keys makes
111
+ # `json.dumps(..., sort_keys=True)` raise, and the report is printed
112
+ # as JSON by the CLI.
113
+ versions[_contract(row.get("v"))] += 1
114
+ if row.get("kind") != "deny":
115
+ continue
116
+ label = _label(row.get("detail"))
117
+ fires[label] += 1
118
+ sessions[label].add(path)
119
+ commands[label][_command(row.get("detail"))] += 1
120
+ shapes = [{"rule": label, "sessions": len(paths), "fires": fires[label],
121
+ "fires_per_session": round(fires[label] / len(paths), 2),
122
+ "commands": [text for text, _ in sorted(
123
+ commands[label].items(),
124
+ key=lambda kv: (-kv[1], kv[0]))[:MAX_COMMANDS]]}
125
+ for label, paths in sessions.items()
126
+ if len(paths) >= RECURRING_SESSIONS]
127
+ shapes.sort(key=lambda s: (-s["sessions"], s["rule"]))
128
+ return {"ledgers": len(files), "recurring_sessions": RECURRING_SESSIONS,
129
+ "shapes": shapes,
130
+ # Which row contracts the fold actually read, for the same reason the
131
+ # ledger count is here: a shape can move because the rule changed or
132
+ # because the row's meaning did, and a reader that cannot tell the two
133
+ # apart would attribute one to the other. None is the pre-version rows.
134
+ "row_versions": dict(versions)}
135
+
136
+
137
+ # A live rule is marked `retire-candidate` only at or below this many fires over
138
+ # its exposure window. Zero, not "low": a rule whose design is to be rare (a
139
+ # credential on its way into a file) is working when it fires twice in a
140
+ # thousand sessions, and the ledger holds no ground truth that would tell a rare
141
+ # true refusal from a rule nobody needs.
142
+ RETIRE_FIRES = 0
143
+
144
+ # The exposure floor, in real ledgers written since the rule shipped. A rule
145
+ # firing in 1% of sessions leaves no fire in 300 of them with probability
146
+ # 0.99 ** 300 ~= 0.05, so below the floor zero fires is not evidence of a dead
147
+ # rule - it is a young one, and the report says `low-exposure` instead.
148
+ MIN_EXPOSURE = 300
149
+
150
+ GATE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "tezgah_gate.py")
151
+
152
+
153
+ def gate_rules(source):
154
+ """The rule labels one revision of the gate's source refuses under: the
155
+ string literal every `_deny(session_id, "<rule>", ...)` call passes. Read
156
+ from the code, so the list cannot drift from the rules that write rows."""
157
+ return {node.args[1].value for node in ast.walk(ast.parse(source))
158
+ if isinstance(node, ast.Call)
159
+ and getattr(node.func, "id", None) == "_deny"
160
+ and len(node.args) > 1 and isinstance(node.args[1], ast.Constant)
161
+ and isinstance(node.args[1].value, str)}
162
+
163
+
164
+ def continuous_since(revisions):
165
+ """{rule: the commit time it has been in the gate without a gap since}, over
166
+ `revisions` as (commit time, source) oldest first. A rule removed and brought
167
+ back dates from its return: it could not fire while it was gone."""
168
+ since = {}
169
+ for when, source in revisions:
170
+ try:
171
+ rules = gate_rules(source)
172
+ except SyntaxError:
173
+ continue
174
+ since = {rule: since.get(rule, when) for rule in rules}
175
+ return since
176
+
177
+
178
+ def rule_ship_times():
179
+ """{live rule: epoch it shipped, or None when that cannot be read}.
180
+
181
+ Git is the only honest source here, and that is why this shells out: no
182
+ ledger row carries the harness revision that wrote it, and the earliest row
183
+ carrying a rule does not exist for the rule this report is about - one that
184
+ never fired. A hand-kept table of ship dates would be the second list the
185
+ code already is. The history this checkout holds starts at its first commit,
186
+ so a rule older than that dates from it, which only shrinks its exposure -
187
+ the direction that keeps a rule, never the one that retires it. Without git
188
+ (a packaged install) every date is None and no rule is read as dead."""
189
+ here = os.path.dirname(GATE)
190
+ with open(GATE, encoding="utf-8") as fh:
191
+ live = gate_rules(fh.read())
192
+
193
+ def git(*args):
194
+ return subprocess.run(["git", "-C", here] + list(args),
195
+ capture_output=True, text=True, timeout=30,
196
+ check=True).stdout
197
+ try:
198
+ log = git("log", "--reverse", "--format=%H %ct", "--", "tezgah_gate.py")
199
+ revisions = [(int(ct), git("show", "%s:./tezgah_gate.py" % sha))
200
+ for sha, ct in (line.split() for line in log.splitlines())]
201
+ except (OSError, ValueError, subprocess.SubprocessError):
202
+ revisions = []
203
+ since = continuous_since(revisions)
204
+ # a rule only in the working tree has not shipped: None, never "old"
205
+ return {rule: since.get(rule) for rule in live}
206
+
207
+
208
+ def rule_yield(files=None, shipped=None):
209
+ """Every live gate rule's fires over its exposure window.
210
+
211
+ `files` defaults to every ledger (`ti.ledgers()`), `shipped` to
212
+ `rule_ship_times()`. Fixture ledgers are left out by `ti.fixture_ledger`, the
213
+ exclusion `counters_all` applies, because a probe run measures the harness
214
+ and not use. A rule's exposure is the real ledgers last written at or after
215
+ it shipped (the file's mtime), and its fires are the deny rows under its
216
+ label in those ledgers. `mark` is `retire-candidate` at or below
217
+ `RETIRE_FIRES` fires over at least `MIN_EXPOSURE` ledgers, `low-exposure` at
218
+ or below `RETIRE_FIRES` over fewer (or an unknown ship date), else None.
219
+
220
+ A report, not a gate, like `failure_shapes`: `ledgers`, `fixtures` and
221
+ `real` are returned with the answer so an empty window cannot read as a
222
+ quiet rule."""
223
+ files = ti.ledgers() if files is None else files
224
+ shipped = rule_ship_times() if shipped is None else shipped
225
+ real = []
226
+ for path in files:
227
+ rows = ti._foreign_rows(path)
228
+ if ti.fixture_ledger(rows):
229
+ continue
230
+ try:
231
+ when = os.path.getmtime(path)
232
+ except OSError:
233
+ continue
234
+ real.append((when, Counter(_label(row.get("detail")) for row in rows
235
+ if row.get("kind") == "deny")))
236
+ rules = []
237
+ for rule, since in shipped.items():
238
+ window = [] if since is None else [c for when, c in real if when >= since]
239
+ fires = sum(c[rule] for c in window)
240
+ exposure = None if since is None else len(window)
241
+ mark = None
242
+ if fires <= RETIRE_FIRES:
243
+ mark = ("retire-candidate" if (exposure or 0) >= MIN_EXPOSURE
244
+ else "low-exposure")
245
+ rules.append({"rule": rule, "shipped": since, "exposure": exposure,
246
+ "fires": fires, "mark": mark})
247
+ rules.sort(key=lambda r: (r["fires"], -(r["exposure"] or 0), r["rule"]))
248
+ return {"ledgers": len(files), "fixtures": len(files) - len(real),
249
+ "real": len(real), "retire_fires": RETIRE_FIRES,
250
+ "min_exposure": MIN_EXPOSURE, "rules": rules}
251
+
252
+
253
+ # Claude Code auto mode's escalation thresholds: a person is asked after 3
254
+ # consecutive or 20 total denials. They are example values for the denial-budget
255
+ # fold (plan 055 part 8a), not a tezgah measurement.
256
+ RUN_MIN = 3
257
+ SESSION_DENIES = 20
258
+
259
+ # The rows the gate writes beside a refusal (`drift_reason`'s mark, the nudge
260
+ # mark, and the call's `began`, written before any rule since plan 051): a
261
+ # refused call leaves them in front of its deny row, so they continue a run
262
+ # instead of ending it. Every other row - a call that ran, a turn marker, a
263
+ # reply - ends the run.
264
+ GATE_SIDE_KINDS = frozenset(("deny", "drift", "nudge", "began"))
265
+
266
+
267
+ def deny_runs(ledgers, run_min=RUN_MIN, session_min=SESSION_DENIES):
268
+ """The denial-budget fold over `ledgers`, an iterable of row lists, one per
269
+ session: per rule, the runs of at least `run_min` consecutive denies of that
270
+ rule inside one turn, the longest run, and how many sessions hold at least
271
+ `session_min` denies. A report only: nothing reads it on the hot path and no
272
+ gate rule changes on it (ADR 010).
273
+
274
+ A run is consecutive deny rows under one `_deny_rule` label; a deny of
275
+ another rule starts a new run, and any row outside `GATE_SIDE_KINDS` (a
276
+ step, a `turn` marker) ends it."""
277
+ runs, longest, sessions, read = Counter(), Counter(), 0, 0
278
+ for rows in ledgers:
279
+ read += 1
280
+ rule, length, denies = None, 0, 0
281
+
282
+ def close():
283
+ if rule is not None and length >= run_min:
284
+ runs[rule] += 1
285
+ if rule is not None:
286
+ longest[rule] = max(longest[rule], length)
287
+
288
+ for row in rows:
289
+ kind = row.get("kind")
290
+ if kind == "deny":
291
+ denies += 1
292
+ label = ti._deny_rule(str(row.get("detail") or ""))
293
+ if label == rule:
294
+ length += 1
295
+ else:
296
+ close()
297
+ rule, length = label, 1
298
+ elif kind not in GATE_SIDE_KINDS:
299
+ close()
300
+ rule, length = None, 0
301
+ close()
302
+ sessions += denies >= session_min
303
+ return {"ledgers": read, "run_min": run_min, "session_min": session_min,
304
+ "runs": dict(runs), "longest": dict(longest),
305
+ "sessions_over": sessions}
@@ -0,0 +1,227 @@
1
+ #!/usr/bin/env python3
2
+ """One cheap judgement in front of the skill choice: at most one skill, one line.
3
+
4
+ A session meets the roster as an index of one-line descriptions, truncated by the
5
+ host, so the skill that authors a file reads like the one that edits it, and a
6
+ list of names invites a guess even on a turn where nothing in it fits. TypeSafe's
7
+ own skill-suggestion cookbook puts a ranking in front of that choice and reports
8
+ the effect over 488 requests: wrong skill loads 16.8% -> 7.3%, needless loads
9
+ 9.8% -> 4.0%.
10
+
11
+ This is the smallest version of that recipe that fits a hook: ONE batched request
12
+ carrying a Choice over the installed skill names (with `none` as an option) and a
13
+ Noul asking whether the turn needs a skill at all. The winner becomes one
14
+ `<skill_relevance>` line appended to the per-turn text, naming what the skill is
15
+ for and saying the line is a hint to look at first. The roster itself is left
16
+ untouched - the cookbook keeps it so the host's prefix cache over it still holds,
17
+ and on five of the six hosts tezgah does not write that text anyway.
18
+
19
+ The roster is the plugin's own `skills/` - the 13 this checkout ships and every
20
+ host links - because a name no host can open would be a hint to nothing.
21
+
22
+ OFF UNLESS ARMED: `skill-suggest-on` in `~/.config/tezgah` turns it on. The
23
+ roster here is 13 skills, and an independent chooser was measured at 0 of 20
24
+ wrong on a labelled set WITHOUT any hint, so the line's benefit on this roster is
25
+ unproven while its cost is not (about 78 tokens and 0.8 s per fresh prompt), and a
26
+ capability that costs a certain amount for an unmeasured gain is opt-in. Total by
27
+ design: no credential, a timeout, a refused request, a reply that is not the
28
+ documented shape, a cache dir that cannot be written - every one of them returns
29
+ "" instead of raising, since this runs on the prompt path of every turn and a
30
+ missing hint must cost the turn nothing.
31
+ """
32
+ import hashlib
33
+ import json
34
+ import os
35
+ import re
36
+
37
+ import tezgah_integrity as ti
38
+ import tezgah_judge
39
+ import tezgah_paths as tp
40
+
41
+ ARM = "skill-suggest-on"
42
+ # Below this, the turn's own gate question says no skill is wanted and nothing is
43
+ # suggested - the cookbook's threshold, which is also where the triage selection
44
+ # sits: with `none` in the Choice, a forced nearest-neighbour pick is what the
45
+ # gate exists to prevent.
46
+ GATE = 0.30
47
+ # One attempt and a 4 s wall clock (`ask`'s `deadline`), about 4x the measured
48
+ # worst case (0.3-1.1 s live): omp's bridge kills a hook at 10 s, a killed hook
49
+ # loses the whole per-turn injection, and the rest of the prompt hook runs after
50
+ # this call - so a slow reply costs the hint and never the turn.
51
+ ASK_DEADLINE = 4.0
52
+ # The prompt goes out redacted (`ti.redact`) and cut to taste's own cap: the
53
+ # choice needs the request's gist, not a pasted log.
54
+ PROMPT_MAX = 2000
55
+ # The criteria the judge reads per skill, and what the appended line says the
56
+ # skill is for. One line: it must not cost more than the index entry it points at
57
+ # (the host's own entry is 60 characters), and 120 keeps the whole appended block
58
+ # under 320 characters (measured 305-317). The router line in bin/tezgah-setup
59
+ # caps its own copy of this sentence at 140.
60
+ CLAUSE_CAP = 120
61
+ NONE = "none"
62
+ CHOICE_INSTRUCTIONS = ("Which of these skills, if any, is the right one to load "
63
+ "to help with the user's latest request?")
64
+ # What "needs a skill" means for THIS roster: tezgah's 13 skills are working
65
+ # rules (scope, output shape, workflow, evidence), not the external procedures
66
+ # the cookbook's roster holds, so its "documented procedure" question is the wrong
67
+ # one here - measured on 8 prompts it put `ponytail` at 0.05-0.24 and lost two
68
+ # correct picks. This wording keeps them at 0.47-0.67 and separates the five that
69
+ # want a skill (0.80-0.98) from the three that do not (0.01-0.15).
70
+ GATE_INSTRUCTIONS = ("Does this request ask for work on the user's repository, "
71
+ "code, plans, analysis or writing, rather than a question "
72
+ "answered from general knowledge?")
73
+ # One session's answered prompts. Bounded because a session can be long, and keyed
74
+ # on the prompt so an identical submission is never paid for twice.
75
+ KEPT = 200
76
+ _FRONTMATTER = re.compile(r"^---\s*\n(.*?)\n---", re.S)
77
+ _FOLDED = re.compile(r"description:\s*[>|]-?\s*\n((?:\s+.*\n?)+)")
78
+ _INLINE = re.compile(r"description:\s*(.+)")
79
+
80
+
81
+ def slug(text):
82
+ """A filename-safe form of a host's session id."""
83
+ return re.sub(r"[^A-Za-z0-9]+", "-", str(text)).strip("-")
84
+
85
+
86
+ def clause(path):
87
+ """What the skill is for, in one line: the description sentence carrying the
88
+ trigger, or the opening one.
89
+
90
+ The `Use when ...` sentence wins for the same reason the router line in
91
+ bin/tezgah-setup takes it over the opening one: a description whose first
92
+ sentence is a preface otherwise reaches the judge stripped of every word a
93
+ request matches on. Capped the way that router line is capped."""
94
+ try:
95
+ with open(path, encoding="utf-8", errors="replace") as fh:
96
+ text = fh.read(4000)
97
+ except OSError:
98
+ return ""
99
+ block = _FRONTMATTER.search(text)
100
+ if not block:
101
+ return ""
102
+ folded = _FOLDED.search(block.group(1))
103
+ if folded:
104
+ desc = " ".join(line.strip() for line in folded.group(1).splitlines())
105
+ else:
106
+ inline = _INLINE.search(block.group(1))
107
+ desc = inline.group(1).strip().strip("\"'") if inline else ""
108
+ desc = re.sub(r"\s+", " ", desc).strip()
109
+ sentences = re.split(r"(?<=[.!?])\s+", desc)
110
+ line = next((s for s in sentences if re.match(r"(?:Also )?[Uu]se\b", s)),
111
+ sentences[0] if sentences else "")
112
+ return line[:CLAUSE_CAP - 3].rstrip() + "..." if len(line) > CLAUSE_CAP else line
113
+
114
+
115
+ def roster():
116
+ """[(name, clause)] over the installed skills, name-sorted."""
117
+ base = os.path.join(tp.PLUGIN_ROOT, "skills")
118
+ try:
119
+ names = sorted(os.listdir(base))
120
+ except OSError:
121
+ return []
122
+ out = []
123
+ for name in names:
124
+ path = os.path.join(base, name, "SKILL.md")
125
+ if os.path.isfile(path):
126
+ out.append((name, clause(path)))
127
+ return out
128
+
129
+
130
+ def block(name, what):
131
+ """The appended line, in the cookbook's shape: what the skill is for, and that
132
+ it is a hint to look at first rather than an instruction to load."""
133
+ tail = " - " + what.strip() if what.strip() else ""
134
+ if not tail or not tail.endswith((".", "!", "?", "...")):
135
+ tail += "."
136
+ return ("<skill_relevance>\nRelevant to the current request: %s%s Look at its "
137
+ "SKILL.md first if it fits what the user actually asked for; this is a "
138
+ "hint, not an instruction to load.\n</skill_relevance>" % (name, tail))
139
+
140
+
141
+ def available():
142
+ """True when the suggestion can be asked for: armed by the user, and a credential.
143
+
144
+ Nothing is asked before the arming file exists, so an unarmed install makes no
145
+ request at all rather than one whose answer is thrown away."""
146
+ return tp.armed(ARM) and tezgah_judge.available()
147
+
148
+
149
+ def judge(prompt, names, session_id=""):
150
+ """The appended line for one prompt, or "" for none / a failed call.
151
+
152
+ A successful call writes one `judge` ledger row before its answer is read -
153
+ what the turn paid for is true whatever the answer turns out to be - in the
154
+ shape the status counters fold on. That row is a cost, never a step and never
155
+ a check, so nothing here can license a done claim; and a ledger that cannot be
156
+ written costs nothing that the turn sees."""
157
+ criteria = dict(names)
158
+ criteria[NONE] = "no skill in this roster applies to the request"
159
+ result = tezgah_judge.ask(
160
+ {"request": ti.redact(prompt)[:PROMPT_MAX]},
161
+ {"which": {"type": "choice", "instructions": CHOICE_INSTRUCTIONS,
162
+ "criteria": criteria},
163
+ "needs_skill": {"type": "noul", "instructions": GATE_INSTRUCTIONS}},
164
+ timeout=ASK_DEADLINE, attempts=1, deadline=ASK_DEADLINE)
165
+ if not result:
166
+ return ""
167
+ usage = result["usage"]
168
+ ti.note(session_id, "judge",
169
+ "tezgah-skill-pick %s in=%d out=%d ms=%d judge=%s/%s"
170
+ % (result["model"], usage["input_tokens"], usage["output_tokens"],
171
+ result["latency_ms"], result["provider"], result["model"]))
172
+ chosen = tezgah_judge.choice(result, "which")
173
+ gate = tezgah_judge.noul(result, "needs_skill")
174
+ if chosen is None or chosen == NONE:
175
+ return ""
176
+ if gate is None or gate < GATE:
177
+ return ""
178
+ options = dict(names)
179
+ return block(chosen, options[chosen]) if chosen in options else ""
180
+
181
+
182
+ def _path(session_id):
183
+ return os.path.join(tp.cache_dir(), "skill-pick",
184
+ slug(session_id) + ".json")
185
+
186
+
187
+ def _remembered(session_id):
188
+ try:
189
+ with open(_path(session_id), encoding="utf-8") as fh:
190
+ data = json.load(fh)
191
+ except (OSError, ValueError):
192
+ return {}
193
+ return data if isinstance(data, dict) else {}
194
+
195
+
196
+ def _remember(session_id, digest, line):
197
+ """Best effort: a host may sandbox hook writes, and a cache that cannot be
198
+ written costs one more call, never the line."""
199
+ data = _remembered(session_id)
200
+ data[digest] = line
201
+ for old in list(data)[:max(0, len(data) - KEPT)]:
202
+ del data[old]
203
+ path = _path(session_id)
204
+ try:
205
+ os.makedirs(os.path.dirname(path), exist_ok=True)
206
+ with open(path, "w", encoding="utf-8") as fh:
207
+ json.dump(data, fh)
208
+ except OSError:
209
+ pass
210
+
211
+
212
+ def suggest(prompt, session_id=""):
213
+ """The `<skill_relevance>` line this prompt earns, or "".
214
+
215
+ Nothing is asked for a slash command (the user named the work, not the task
216
+ class), and nothing is asked twice for one prompt in one session."""
217
+ prompt = (prompt or "").strip()
218
+ if not prompt or prompt.startswith("/") or not available():
219
+ return ""
220
+ digest = hashlib.sha1(prompt.encode()).hexdigest()
221
+ known = _remembered(session_id)
222
+ if digest in known:
223
+ return known[digest] if isinstance(known[digest], str) else ""
224
+ names = roster()
225
+ line = judge(prompt, names, session_id) if names else ""
226
+ _remember(session_id, digest, line)
227
+ return line