@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,772 @@
1
+ #!/usr/bin/env python3
2
+ """tezgah-research - the research workspace CLI.
3
+
4
+ tezgah-research init <slug> [--question "..."] [--allow-open "<why>"]
5
+ [--supersedes <slug>] scaffold a line
6
+ tezgah-research commit <slug> "<message>" commit the line in .tezgah's own repo
7
+ tezgah-research check [<slug>] [--json] [--strict] [--orx] [--all-lines] [-- <slug>]
8
+ the discipline checks
9
+ tezgah-research status one line per research line
10
+ tezgah-research --all every checkout's lines (git worktrees)
11
+ tezgah-research claim <slug> record one claim from stdin
12
+ tezgah-research predict <slug> record one prediction from stdin
13
+ tezgah-research components [--json] what predicts what, per component
14
+ tezgah-research migrate <slug> [--dry-run] derive fields the rules require
15
+ tezgah-research source <slug> <hypothesis> --run <orxRunId> [--command "<cmd>"]
16
+ [--scope real|fixture|derived] [--fixture "<what was generated>"]
17
+ tezgah-research compare <slug> <decision> record one variants x criteria cell from stdin
18
+ tezgah-research close <slug> --limit "<reason>" conclude a line as a deliberate limit
19
+ tezgah-research seal <slug> [--history-lost] --ack "<owner decision>"
20
+ seal a line concluded before seals existed
21
+ tezgah-research import <checkout> [<slug>] [--allow-open "<why>"]
22
+ bring lines from another checkout, with history
23
+
24
+ A research line lives at <repo>/.tezgah/research/<slug>/ and holds the state an
25
+ auditable investigation needs: the question, the decision log, the findings, the
26
+ claims with their kind, falsification criteria and evidence, the predictions bound
27
+ to the commits that carried each proposed change, one directory per
28
+ experiment whose protocol is committed before its results, the literature index,
29
+ and the review a concluded line reports. `check` exits 1 when a line breaks those
30
+ rules, so a hook or a person can act on it. The project ignores `.tezgah/`; the
31
+ commits the order rule reads are made in `.tezgah`'s own private git repository,
32
+ which `init` creates and `commit` writes to, and a line the project itself
33
+ committed before the move keeps its order proof in the project's history.
34
+
35
+ `check` with no slug reports the open lines in full; a line under `done/` is
36
+ verified by its order seal's hashes alone and named only when they fail, with
37
+ one line counting the done lines - `check --all-lines` re-checks every line in
38
+ full, and `check <slug>` always does for that line (ADR 015).
39
+
40
+ `check --strict` also fails the guarantees the checker cannot decide - an
41
+ experiment file no repository can commit, a protocol that answers neither
42
+ what it predicts nor what would falsify it, a report a concluded line owes that
43
+ states nowhere what the evidence does not show, a claim written before `kind`
44
+ existed, a results row written before `source` did, a results file whose rows
45
+ declare no `scope` (what their numbers were measured on), a claim resting on a
46
+ fixture row that declares no scope or asserting a number its cited artifacts do not
47
+ contain, a grey source with no quality
48
+ note, an unsourced `Patterns` bullet, a concluded line with no review, a claim
49
+ that supersedes another - because a session that wants a line it can defend wants
50
+ those refused rather than noted. `check --orx` adds the run command the orx
51
+ project registered against this repository holds, which is the recipe its runs
52
+ have to be reproducible from. `migrate` derives the `kind` of the claims, the
53
+ `source` of the results rows whose own fields imply one, and the
54
+ `literature/INDEX.jsonl` rows from the artifacts already in the line, and reports
55
+ every field it cannot derive instead of inventing one - `scope` is one of those, so
56
+ the session that ran the experiment is the only thing that can supply it.
57
+ `source --run` files one
58
+ run's orx log as the experiment's receipt, and takes `--scope` for the row it
59
+ writes. `predict` writes one row of `predictions.jsonl` - the commit a proposed
60
+ change landed in, the claim it moves, the metric, its `value_before` and
61
+ `value_after`, and what would falsify it - and refuses a row whose commit is not
62
+ in this history, whose metric or baseline names no number, whose falsifier is
63
+ empty, whose commit reached a frozen path (`hooks/tezgah_gate.py`,
64
+ `hooks/tezgah_integrity.py`, `tests/`, `benchmarks/`, a protocol) without a human
65
+ `granted_by`, whose `claim` names an id the line does not hold, or whose
66
+ `components` is missing or names a component the manifest
67
+ (`hooks/tezgah_components.py`) does not define. `components` prints, per component
68
+ the manifest defines, the prediction rows that name it and their state -
69
+ `unmeasured` until the round measures them, `held` once `value_after` is filled,
70
+ `falsified` when the claim the row names is `refuted` in the line's own
71
+ `claims.jsonl` - with the number of components and rows it read. It is a report
72
+ and not a gate: it always exits 0.
73
+
74
+ `init` reads the lines already in the repository before it scaffolds anything, and
75
+ refuses while one of them is unfinished - its phase not `concluded`, a claim left
76
+ `hypothesis` or `testing`, a pre-registered experiment with no results or no
77
+ analysis, no `to_human/report.md` or `to_human/review.json`, a review finding with
78
+ no status, a design/plan/analysis/code deliverable with no decision comparing its
79
+ variants - printing every open slug with its reasons. `--allow-open "<reason>"`
80
+ opens the new line anyway and writes the reason into its `log.md` as the first
81
+ entry; an empty reason is misuse, and the hatch is refused while any open line has
82
+ `check` errors. `close <slug> --limit "<reason>"` concludes a line on purpose,
83
+ writing the reasons it was still open into `state.json` `closed` and `log.md`.
84
+ `--supersedes <old>` opens a new version of an existing line, which then carries
85
+ the old deliverable as a variant; a line asking an existing line's exact question
86
+ without it is refused. `compare` appends one cell to
87
+ `decisions/<decision>/comparison.jsonl` under the rule `check` applies to it.
88
+ `check` prints the same list of open lines after the per-line report, and so does
89
+ `status`, so neither state has to be discovered by being refused.
90
+
91
+ Exit codes: 0 clean, 1 problems found - a broken line for `check`, a refused
92
+ claim for `claim`, a refused row for `predict`, which writes nothing and prints
93
+ one reason per problem, or a new line refused for `init` over unfinished ones - 2
94
+ misuse.
95
+ """
96
+ import json
97
+ import os
98
+ import subprocess
99
+ import sys
100
+ import time
101
+
102
+ HERE = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
103
+ sys.path.insert(0, os.path.join(HERE, "hooks"))
104
+ import tezgah_paths as tp # noqa: E402
105
+ import tezgah_research as tr # noqa: E402
106
+
107
+
108
+ def repo_root(path):
109
+ try:
110
+ out = subprocess.run(["git", "-C", path, "rev-parse", "--show-toplevel"],
111
+ capture_output=True, text=True)
112
+ if out.returncode == 0 and out.stdout.strip():
113
+ top = out.stdout.strip()
114
+ # inside `.tezgah` git answers with the private repository; the line
115
+ # belongs to the project around it
116
+ return os.path.dirname(top) if os.path.basename(top) == tp.WORKSPACE else top
117
+ except OSError:
118
+ pass
119
+ return os.path.realpath(path)
120
+
121
+
122
+ def misuse(message):
123
+ """Misuse exits 2, so a caller can tell it from a line that fails the checks."""
124
+ print("tezgah-research: %s" % message, file=sys.stderr)
125
+ return 2
126
+
127
+
128
+ def cmd_init(args):
129
+ if not args:
130
+ return misuse("init needs a slug")
131
+ slug = args[0].strip().lower().replace(" ", "-")
132
+ if not tr.valid_slug(slug):
133
+ # A slug is the directory name the other commands list, so anything that
134
+ # is not one (a path, a `..`, a leading dot) would scaffold a line that
135
+ # `check`, `status` and `claim` can never see.
136
+ return misuse("init <slug>: %r is not a slug - lowercase letters, digits "
137
+ "and dashes" % args[0])
138
+ question, allow, supersedes = "", None, None
139
+ ask, tier = "", str(tr.DEFAULT_TIER)
140
+ rest = args[1:]
141
+ while rest:
142
+ flag = rest.pop(0)
143
+ if flag == "--question" and rest:
144
+ question = rest.pop(0)
145
+ elif flag == "--ask" and rest:
146
+ ask = rest.pop(0)
147
+ elif flag == "--tier" and rest:
148
+ tier = rest.pop(0)
149
+ elif flag == "--allow-open" and rest:
150
+ allow = rest.pop(0)
151
+ elif flag == "--supersedes" and rest:
152
+ supersedes = rest.pop(0)
153
+ else:
154
+ return misuse('init <slug> --ask "<the user\'s words>" [--tier quick|study|program]'
155
+ ' [--question "..."] [--allow-open "<reason>"] [--supersedes <slug>]')
156
+ problems = tr.ask_problems(ask, tier)
157
+ if problems:
158
+ for problem in problems:
159
+ print("FAIL init: %s" % problem)
160
+ return 1
161
+ if allow is not None and not allow.strip():
162
+ return misuse("--allow-open needs the reason the new line is worth opening "
163
+ "over the unfinished ones")
164
+ repo = repo_root(os.getcwd())
165
+ if supersedes is not None and supersedes not in tr.slugs(repo):
166
+ return misuse("--supersedes %r is not a research line here" % supersedes)
167
+ unfinished = tr.open_lines(repo)
168
+ if unfinished and allow is None:
169
+ # The refusal is the whole point: a line opened beside eleven unfinished
170
+ # ones is how this repository came to hold thirteen of them, so the state
171
+ # is read before anything is written and the reason is the only way past.
172
+ print("init refused: %d research line(s) are unfinished, and a new line is "
173
+ "not opened over them without a reason:" % len(unfinished))
174
+ for name, reasons in unfinished:
175
+ print(" %s: %s" % (name, "; ".join(reasons)))
176
+ print('to open %s anyway, say why: tezgah-research init %s '
177
+ '--allow-open "<reason>"' % (slug, slug))
178
+ return 1
179
+ broken = tr.broken_open_lines(repo) if unfinished else []
180
+ if broken:
181
+ # The hatch opens a line beside unfinished ones, never beside broken ones:
182
+ # a broken line is fixed, or closed as a deliberate limit, first.
183
+ print("init refused: --allow-open does not open a line beside an open line "
184
+ "that check refuses:")
185
+ for name, errors in broken:
186
+ print(" %s: %d error(s), first: %s" % (name, len(errors), errors[0]))
187
+ print('fix them, or record what is left: tezgah-research close <slug> '
188
+ '--limit "<reason>"')
189
+ return 1
190
+ twins = [t for t in tr.serial_twins(repo, slug, {"question": question})
191
+ if t != supersedes]
192
+ if twins:
193
+ print("init refused: %s already asks this question; a new version of it is "
194
+ "compared with the old one, not opened beside it: tezgah-research "
195
+ "init %s --supersedes %s" % (", ".join(twins), slug, twins[0]))
196
+ return 1
197
+ created = time.strftime("%Y-%m-%d")
198
+ made = tr.init(repo, slug, question=question, created=created,
199
+ supersedes=supersedes, ask=ask, tier=tier)
200
+ if allow is not None:
201
+ problem = tr.note_open(repo, slug, allow, created)
202
+ if problem:
203
+ print(" WARNING: the reason could not be written to log.md (%s)"
204
+ % problem)
205
+ print("research line: %s" % tr.line_dir(repo, slug))
206
+ for path in made:
207
+ print(" wrote %s" % path)
208
+ print("\nnext: write experiments/<hypothesis>/protocol.md - what the change is, "
209
+ "what it predicts, what result would falsify it, why - and COMMIT it "
210
+ "before the run: `tezgah-research commit %s \"protocol <hypothesis>\"`. "
211
+ "Then record the run in results.jsonl and commit it the same way, in a "
212
+ "later commit. The commits land in `.tezgah`'s own git repository (the "
213
+ "project ignores `.tezgah/`); `git -C .tezgah add ... && git -C .tezgah "
214
+ "commit` is the same step by hand. Then analyse it in analysis.md, and "
215
+ "put the claim in claims.jsonl with its kind, falsification criterion and "
216
+ "evidence." % slug)
217
+ print("kill switch: research-off")
218
+ return 0
219
+
220
+
221
+ def cmd_commit(args):
222
+ """Commit one line in the private `.tezgah` repository - the commit the order
223
+ rule reads. Only the line's own path is staged and committed."""
224
+ if len(args) != 2 or not args[1].strip():
225
+ return misuse('commit <slug> "<message>"')
226
+ slug, message = args
227
+ repo = repo_root(os.getcwd())
228
+ known = tr.slugs(repo)
229
+ if slug not in known:
230
+ return misuse("no such research line (have: %s)" % (", ".join(known) or "none"))
231
+ ws = tp.ensure_workspace(repo)
232
+ if ws is None:
233
+ print("commit refused: %s is not a git work tree (or .tezgah could not be "
234
+ "set up), so there is no private repository to commit into" % repo)
235
+ return 1
236
+ rel = os.path.relpath(tr.line_dir(repo, slug), ws)
237
+ try:
238
+ done = tp.ws_git(repo, "add", "-A", "--", rel)
239
+ if not done.returncode:
240
+ done = tp.ws_git(repo, "commit", "-q", "-m", message, "--", rel)
241
+ except OSError as exc:
242
+ print("commit failed: %s" % exc)
243
+ return 1
244
+ if done.returncode:
245
+ print("commit failed: %s" % (done.stderr or done.stdout).strip())
246
+ return 1
247
+ sha = tp.ws_git(repo, "rev-parse", "HEAD").stdout.strip()
248
+ print("committed %s in %s at %s" % (rel, ws, sha))
249
+ return 0
250
+
251
+
252
+ def cmd_check(args):
253
+ # after `--` every word is the slug, never a flag (the MCP tool passes it so)
254
+ sep = args.index("--") if "--" in args else len(args)
255
+ flags, after = args[:sep], args[sep + 1:]
256
+ as_json = "--json" in flags
257
+ strict = "--strict" in flags
258
+ ask_orx = "--orx" in flags
259
+ all_lines = "--all-lines" in flags
260
+ rest = [a for a in flags
261
+ if a not in ("--json", "--strict", "--orx", "--all-lines")] + after
262
+ repo = repo_root(os.getcwd())
263
+ if len(rest) > 1:
264
+ return misuse("check [<slug>] [--json] [--strict] [--orx] [--all-lines] "
265
+ "[-- <slug>]")
266
+ known = tr.slugs(repo)
267
+ if rest and rest[0] not in known:
268
+ print("FAIL %s: no such research line (have: %s)"
269
+ % (rest[0], ", ".join(known) or "none"))
270
+ return 1
271
+ problems = 0
272
+ report = {}
273
+ if known:
274
+ report = tr.check(repo, rest[0] if rest else None, strict=strict,
275
+ all_lines=all_lines)
276
+ for slug, row in report.items():
277
+ for err in row["errors"]:
278
+ problems += 1
279
+ print("FAIL %s: %s" % (slug, err))
280
+ for warn in row["warnings"]:
281
+ print("warn %s: %s" % (slug, warn))
282
+ else:
283
+ print("no research line under %s" % tr.root(repo))
284
+ if ask_orx:
285
+ # The registry is the repository's, not a line's, so this runs whatever the
286
+ # lines look like - which is also why it is only asked for when --orx says so.
287
+ report["orx"] = tr.check_orx(repo, tp.orx_bin(), strict=strict)
288
+ for err in report["orx"]["errors"]:
289
+ problems += 1
290
+ print("FAIL orx: %s" % err)
291
+ for warn in report["orx"]["warnings"]:
292
+ print("warn orx: %s" % warn)
293
+ if as_json:
294
+ # The payload is the whole answer for a machine caller: a sentence after
295
+ # it is not JSON, and one before it is prose the reader never asked for.
296
+ print(json.dumps(report, indent=2))
297
+ return 1 if problems else 0
298
+ if not problems:
299
+ print("research: %d line(s) ok" % len(report))
300
+ if not rest and not all_lines:
301
+ done = [slug for slug in known if tr.sealed(repo, slug)]
302
+ if done:
303
+ seals = sum(1 for slug in done if tr.SEAL in tr.line_state(repo, slug))
304
+ print("research: %d done line(s): %d checked by their seal, %d unsealed "
305
+ "(not checked); `check --all-lines` runs them in full"
306
+ % (len(done), seals, len(done) - seals))
307
+ # The layer's own state, after the per-line report and outside the FAIL/warn
308
+ # classes: a line being open is a state and not a defect, but it is the state
309
+ # `init` refuses a new line over, so a session running `check` sees it here
310
+ # instead of meeting it at its next `init`. Only when the whole layer was
311
+ # asked about: `check <slug>` answers for that line and stays that answer.
312
+ if not rest:
313
+ unfinished = tr.open_note(repo)
314
+ if unfinished:
315
+ print(unfinished)
316
+ return 1 if problems else 0
317
+
318
+
319
+ def cmd_status(args):
320
+ if args:
321
+ return misuse("status takes no arguments")
322
+ repo = repo_root(os.getcwd())
323
+ rows = tr.summary(repo)
324
+ if not rows:
325
+ print("no research line under %s" % tr.root(repo))
326
+ return 0
327
+ for row in rows:
328
+ print(row)
329
+ return 0
330
+
331
+
332
+ def cmd_components(args):
333
+ """The per-component report: which predictions name each component and what
334
+ state they are in, read from the manifest the rules also read.
335
+
336
+ Always exit 0, because it is a report and not a gate: it refuses nothing the
337
+ checker does not already refuse, and what it prints - the components and the
338
+ rows it read - is what tells an empty manifest from a line with no
339
+ predictions. The shaping is the module's (`component_report`,
340
+ `components_text`), so the `--json` and the text are one decision."""
341
+ as_json = "--json" in args
342
+ if [a for a in args if a != "--json"]:
343
+ return misuse("components [--json]")
344
+ report = tr.component_report(repo_root(os.getcwd()))
345
+ if as_json:
346
+ print(json.dumps(report, indent=2))
347
+ return 0
348
+ for line in tr.components_text(report):
349
+ print(line)
350
+ return 0
351
+
352
+
353
+ def cmd_claim(args):
354
+ """Record the claim handed in on stdin; the line must exist first, so a
355
+ typo cannot create one. Reading stdin happens after the slug check, so a
356
+ misuse case never waits on a terminal."""
357
+ if not args:
358
+ return misuse("claim needs a slug")
359
+ slug = args[0]
360
+ repo = repo_root(os.getcwd())
361
+ known = tr.slugs(repo)
362
+ if slug not in known:
363
+ return misuse("no such research line (have: %s)" % (", ".join(known) or "none"))
364
+ try:
365
+ # The bytes, decoded here rather than by the interpreter's stdin wrapper:
366
+ # under a C locale that wrapper reads invalid bytes as lone surrogates, so
367
+ # a claim could be recorded whose statement is not text at all.
368
+ body = sys.stdin.buffer.read().decode("utf-8")
369
+ except UnicodeDecodeError:
370
+ return misuse("stdin is not valid UTF-8")
371
+ if not body.strip():
372
+ return misuse("claim needs one JSON object on stdin")
373
+ try:
374
+ claim = json.loads(body)
375
+ except ValueError:
376
+ return misuse("stdin is not valid JSON")
377
+ if not isinstance(claim, dict):
378
+ return misuse("stdin must be one JSON object")
379
+ try:
380
+ claim_id, problems = tr.append_claim(repo, slug, claim)
381
+ except OSError as exc:
382
+ # The line directory can go missing or stop being writable between the
383
+ # slug check and the append; that is a problem with the line, not with
384
+ # how the command was called, so it takes the refusal channel.
385
+ claim_id, problems = claim.get("id"), ["cannot append to claims.jsonl: %s" % exc]
386
+ if problems:
387
+ for problem in problems:
388
+ print("FAIL %s: %s" % (slug, problem))
389
+ return 1
390
+ print(("claim %s recorded" % claim_id) if claim_id else "claim recorded")
391
+ return 0
392
+
393
+
394
+ def cmd_predict(args):
395
+ """Record the prediction handed in on stdin; the line must exist first, the
396
+ same way `claim` requires it, and the row is judged by the module's own
397
+ `prediction_problems` so the writer can never refuse what `check` accepts.
398
+
399
+ One reason per problem, and nothing written when anything is refused: a row
400
+ the loop later reads is a promise about a commit, so a half-valid one is not
401
+ worth appending. The undecidable class - a commit git cannot place - is
402
+ printed as a warning and recorded, which is the same fail-open `check` uses:
403
+ a check that cannot decide must not invent a refusal."""
404
+ if len(args) != 1:
405
+ return misuse("predict <slug>")
406
+ slug = args[0]
407
+ repo = repo_root(os.getcwd())
408
+ known = tr.slugs(repo)
409
+ if slug not in known:
410
+ return misuse("no such research line (have: %s)" % (", ".join(known) or "none"))
411
+ try:
412
+ # The bytes, decoded here rather than by the interpreter's stdin wrapper:
413
+ # under a C locale that wrapper reads invalid bytes as lone surrogates, so
414
+ # a row could be recorded whose metric is not text at all.
415
+ body = sys.stdin.buffer.read().decode("utf-8")
416
+ except UnicodeDecodeError:
417
+ return misuse("stdin is not valid UTF-8")
418
+ if not body.strip():
419
+ return misuse("predict needs one JSON object on stdin")
420
+ try:
421
+ pred = json.loads(body)
422
+ except ValueError:
423
+ return misuse("stdin is not valid JSON")
424
+ if not isinstance(pred, dict):
425
+ return misuse("stdin must be one JSON object")
426
+ try:
427
+ problems, undecided = tr.append_prediction(repo, slug, pred)
428
+ except OSError as exc:
429
+ # The line directory can go missing or stop being writable between the
430
+ # slug check and the append; that is a problem with the line, not with
431
+ # how the command was called, so it takes the refusal channel.
432
+ problems = ["cannot append to predictions.jsonl: %s" % exc]
433
+ undecided = []
434
+ for problem in problems:
435
+ print("FAIL %s: %s" % (slug, problem))
436
+ for note in undecided:
437
+ print("warn %s: %s" % (slug, note))
438
+ if problems:
439
+ return 1
440
+ print("prediction for commit %s recorded" % pred.get("commit"))
441
+ return 0
442
+
443
+
444
+ def cmd_migrate(args):
445
+ """Derive what the newer rules require of the artifacts already in the line.
446
+
447
+ The dry run prints exactly what the real run would derive and what it cannot,
448
+ which is the point of having it: an existing line is other sessions' evidence,
449
+ and a migration that cannot be previewed is a migration nobody dares run."""
450
+ dry = "--dry-run" in args
451
+ rest = [a for a in args if a != "--dry-run"]
452
+ if len(rest) != 1:
453
+ return misuse("migrate <slug> [--dry-run]")
454
+ slug = rest[0]
455
+ repo = repo_root(os.getcwd())
456
+ known = tr.slugs(repo)
457
+ if slug not in known:
458
+ return misuse("no such research line (have: %s)" % (", ".join(known) or "none"))
459
+ lines, problems = tr.migrate(repo, slug, dry_run=dry)
460
+ print("migrate %s%s: %d derived" % (slug, " (dry run, nothing written)" if dry
461
+ else "", len(lines)))
462
+ for line in lines:
463
+ print(" %s" % line)
464
+ for problem in problems:
465
+ print("could not derive: %s" % problem)
466
+ return 0
467
+
468
+
469
+ def cmd_source(args):
470
+ """File one orx run's log as the receipt of an experiment."""
471
+ usage = ('source <slug> <hypothesis> --run <orxRunId> [--command "<cmd>"] '
472
+ '[--scope real|fixture|derived] [--fixture "<what was generated>"]')
473
+ if len(args) < 2:
474
+ return misuse(usage)
475
+ slug, hypothesis = args[0], args[1]
476
+ run = command = scope = ""
477
+ fixture = None
478
+ rest = args[2:]
479
+ while rest:
480
+ flag = rest.pop(0)
481
+ if flag == "--run" and rest:
482
+ run = rest.pop(0)
483
+ elif flag == "--command" and rest:
484
+ command = rest.pop(0)
485
+ elif flag == "--scope" and rest:
486
+ scope = rest.pop(0)
487
+ elif flag == "--fixture" and rest:
488
+ fixture = rest.pop(0)
489
+ else:
490
+ return misuse(usage)
491
+ if "/" in hypothesis or "\\" in hypothesis or hypothesis.startswith("."):
492
+ return misuse("source <slug> <hypothesis>: %r is not an experiment "
493
+ "directory name" % hypothesis)
494
+ if not run:
495
+ return misuse("source needs --run <orxRunId>")
496
+ if scope and scope not in tr.SCOPES:
497
+ return misuse("--scope %r is not one of %s" % (scope, ", ".join(tr.SCOPES)))
498
+ if fixture is not None and not fixture.strip():
499
+ return misuse("--fixture needs the text naming what was generated")
500
+ repo = repo_root(os.getcwd())
501
+ known = tr.slugs(repo)
502
+ if slug not in known:
503
+ return misuse("no such research line (have: %s)" % (", ".join(known) or "none"))
504
+ orx = tp.orx_bin()
505
+ if not orx:
506
+ return misuse("orx is not installed, so no run log can be read; nothing "
507
+ "was written (TEZGAH_ORX_BIN overrides the lookup)")
508
+ path, problems = tr.source_run(repo, slug, hypothesis, run, orx, command, scope,
509
+ fixture or "")
510
+ if problems:
511
+ for problem in problems:
512
+ print("FAIL %s: %s" % (slug, problem))
513
+ return 1
514
+ print("receipt %s" % path)
515
+ print('row {"source": "orx:%s", "log": "raw/%s.log"%s%s%s}'
516
+ % (run, run, ', "command": %s' % json.dumps(command) if command else "",
517
+ ', "scope": %s' % json.dumps(scope) if scope else "",
518
+ ', "fixture": %s' % json.dumps(fixture) if fixture else ""))
519
+ if not scope:
520
+ print("note: the row declares no scope, so nothing says whether this run "
521
+ "measured the running system or an input you generated; re-file with "
522
+ "--scope %s" % "|".join(tr.SCOPES))
523
+ elif scope == "fixture" and not fixture:
524
+ print("note: the row declares scope fixture and does not say what was "
525
+ "generated, which is the field the checker warns about; re-file with "
526
+ '--fixture "<what was generated>"')
527
+ return 0
528
+
529
+
530
+ def cmd_compare(args):
531
+ """Record one variants x criteria cell from stdin into
532
+ decisions/<decision>/comparison.jsonl, judged by the checker's own rule."""
533
+ if len(args) != 2:
534
+ return misuse("compare <slug> <decision>")
535
+ slug, decision = args
536
+ repo = repo_root(os.getcwd())
537
+ known = tr.slugs(repo)
538
+ if slug not in known:
539
+ return misuse("no such research line (have: %s)" % (", ".join(known) or "none"))
540
+ try:
541
+ body = sys.stdin.buffer.read().decode("utf-8")
542
+ row = json.loads(body)
543
+ except (UnicodeDecodeError, ValueError):
544
+ return misuse("compare needs one JSON object on stdin")
545
+ try:
546
+ problems = tr.append_comparison(repo, slug, decision, row)
547
+ except OSError as exc:
548
+ problems = ["cannot append to comparison.jsonl: %s" % exc]
549
+ if problems:
550
+ for problem in problems:
551
+ print("FAIL %s/%s: %s" % (slug, decision, problem))
552
+ return 1
553
+ print("cell %s x %s recorded" % (row.get("variant"), row.get("criterion")))
554
+ criteria = os.path.join(tr.line_dir(repo, slug), "decisions", decision,
555
+ "criteria.json")
556
+ if not tr.added_commits(repo, criteria)[0]:
557
+ print("note: criteria.json is not committed, so nothing shows the criteria "
558
+ "were fixed before this cell; commit it before the comparison")
559
+ return 0
560
+
561
+
562
+ def cmd_verdict(args):
563
+ """Record one success criterion's verdict, with the evidence it rests on."""
564
+ if len(args) < 3:
565
+ return misuse('verdict <slug> <id> met|not-met|unanswerable --evidence "<ref>"')
566
+ slug, sid, verdict = args[0], args[1], args[2]
567
+ evidence = ""
568
+ rest = args[3:]
569
+ while rest:
570
+ flag = rest.pop(0)
571
+ if flag == "--evidence" and rest:
572
+ evidence = rest.pop(0)
573
+ else:
574
+ return misuse('verdict <slug> <id> met|not-met|unanswerable --evidence "<ref>"')
575
+ repo = repo_root(os.getcwd())
576
+ if slug not in tr.slugs(repo):
577
+ return misuse("no such research line: %s" % slug)
578
+ path = os.path.join(tr.line_dir(repo, slug), "state.json")
579
+ try:
580
+ with open(path, encoding="utf-8") as fh:
581
+ state = json.load(fh)
582
+ except (OSError, ValueError) as exc:
583
+ print("FAIL %s: state.json does not parse (%s)" % (slug, exc))
584
+ return 1
585
+ if not isinstance(state, dict):
586
+ print("FAIL %s: state.json is not an object" % slug)
587
+ return 1
588
+ problems = tr.verdict_problems(state, [(sid, verdict, evidence)])
589
+ if problems:
590
+ for problem in problems:
591
+ print("FAIL verdict: %s" % problem)
592
+ return 1
593
+ for row in state.get("success") or []:
594
+ if str(row.get("id")) == sid:
595
+ row["verdict"] = verdict
596
+ row["evidence"] = evidence
597
+ with open(path, "w", encoding="utf-8") as fh:
598
+ fh.write(json.dumps(state, indent=2) + "\n")
599
+ print("criterion %s: %s (%s)" % (sid, verdict, evidence))
600
+ return 0
601
+
602
+
603
+ def cmd_conclude(args):
604
+ """Conclude a line once every success criterion carries a verdict."""
605
+ if len(args) != 1:
606
+ return misuse("conclude <slug>")
607
+ slug = args[0]
608
+ repo = repo_root(os.getcwd())
609
+ if slug not in tr.slugs(repo):
610
+ return misuse("no such research line: %s" % slug)
611
+ problems, _state = tr.conclude_line(repo, slug, time.strftime("%Y-%m-%d"))
612
+ if problems:
613
+ for problem in problems:
614
+ print("FAIL conclude: %s" % problem)
615
+ return 1
616
+ print("concluded %s; it moved to research/done/%s" % (slug, slug))
617
+ return 0
618
+
619
+
620
+ def cmd_migrate_layout(args):
621
+ """Move flat `research/<slug>` directories into `open/` or `done/`."""
622
+ if args:
623
+ return misuse("migrate-layout takes no arguments")
624
+ repo = repo_root(os.getcwd())
625
+ moved = tr.migrate_layout(repo)
626
+ for slug, folder in moved:
627
+ print("moved %s -> research/%s/%s" % (slug, folder, slug))
628
+ print("migrate-layout: %d line(s) moved" % len(moved))
629
+ return 0
630
+
631
+
632
+ def cmd_close(args):
633
+ """Conclude a line as a deliberate limit, writing what was left and why."""
634
+ ack = ""
635
+ rest = list(args)
636
+ if "--ack" in rest:
637
+ i = rest.index("--ack")
638
+ if i + 1 >= len(rest):
639
+ return misuse('--ack "<what the user said>" needs the words')
640
+ ack = rest[i + 1]
641
+ rest = rest[:i] + rest[i + 2:]
642
+ if len(rest) != 3 or rest[1] != "--limit" or not rest[2].strip():
643
+ return misuse('close <slug> --limit "<what is left and why>" '
644
+ '[--ack "<what the user said about the unmet criteria>"]')
645
+ slug, limit = rest[0], rest[2]
646
+ repo = repo_root(os.getcwd())
647
+ known = tr.slugs(repo)
648
+ if slug not in known:
649
+ return misuse("no such research line (have: %s)" % (", ".join(known) or "none"))
650
+ left, problem = tr.close_line(repo, slug, limit,
651
+ time.strftime("%Y-%m-%d"), ack=ack)
652
+ if problem:
653
+ print("FAIL %s: %s" % (slug, problem))
654
+ return 1
655
+ print("closed %s as a deliberate limit; left: %s"
656
+ % (slug, "; ".join(left) or "nothing"))
657
+ return 0
658
+
659
+
660
+ def cmd_seal(args):
661
+ """Seal a line concluded before the seal existed: plainly when every
662
+ experiment's order still checks (ADR 018), or with the owner's
663
+ `history-lost` verdict (ADR 009); a line concluded or closed now is sealed
664
+ by `conclude`/`close` itself."""
665
+ usage = 'seal <slug> [--history-lost] --ack "<the owner\'s decision>"'
666
+ lost = args[1:2] == ["--history-lost"]
667
+ rest = args[:1] + args[2:] if lost else args
668
+ if len(rest) != 3 or rest[1] != "--ack":
669
+ return misuse(usage)
670
+ slug, ack = rest[0], rest[2]
671
+ repo = repo_root(os.getcwd())
672
+ if slug not in tr.slugs(repo):
673
+ return misuse("no such research line: %s" % slug)
674
+ record, problem = tr.retro_seal(repo, slug, ack, time.strftime("%Y-%m-%d"),
675
+ history_lost=lost)
676
+ if problem:
677
+ print("FAIL %s: %s" % (slug, problem))
678
+ return 1
679
+ rows = record["experiments"]
680
+ if not lost:
681
+ print("sealed %s: %d experiment(s), order checks" % (slug, len(rows)))
682
+ return 0
683
+ lost = sorted(h for h, row in rows.items() if row.get("order") == tr.HISTORY_LOST)
684
+ print("sealed %s: %d experiment(s), history lost for %s"
685
+ % (slug, len(rows), ", ".join(lost) or "none"))
686
+ return 0
687
+
688
+
689
+ def cmd_import(args):
690
+ """Bring lines from another checkout's `.tezgah` repository with their
691
+ history; a plain copy is refused."""
692
+ usage = 'import <checkout> [<slug>] [--allow-open "<reason>"]'
693
+ rest, allow = list(args), None
694
+ if "--allow-open" in rest:
695
+ i = rest.index("--allow-open")
696
+ if i + 1 >= len(rest) or not rest[i + 1].strip():
697
+ return misuse("--allow-open needs the reason the line is worth opening")
698
+ allow = rest[i + 1]
699
+ rest = rest[:i] + rest[i + 2:]
700
+ if len(rest) not in (1, 2) or any(a.startswith("-") for a in rest):
701
+ return misuse(usage)
702
+ source = os.path.abspath(rest[0])
703
+ slug = rest[1] if len(rest) == 2 else None
704
+ if slug is not None and not tr.valid_slug(slug):
705
+ return misuse("not a research line name: %r" % slug)
706
+ repo = repo_root(os.getcwd())
707
+ if tp.ensure_workspace(repo) is None:
708
+ print("import refused: %s is not a git work tree (or .tezgah could not be "
709
+ "set up)" % repo)
710
+ return 1
711
+ imported, problem = tr.import_line(repo, source, slug, allow,
712
+ time.strftime("%Y-%m-%d"))
713
+ if problem:
714
+ print("FAIL import: %s" % problem)
715
+ return 1
716
+ print("imported %s from %s" % (", ".join(imported) or "nothing", source))
717
+ return 0
718
+
719
+
720
+ def cmd_all(args):
721
+ if args:
722
+ return misuse("--all takes no arguments")
723
+ for row in tr.across(repo_root(os.getcwd())):
724
+ print(row)
725
+ return 0
726
+
727
+
728
+ def main(argv):
729
+ if len(argv) < 2:
730
+ print(__doc__, file=sys.stderr)
731
+ return 2
732
+ cmd, rest = argv[1], argv[2:]
733
+ if cmd == "--all":
734
+ return cmd_all(rest)
735
+ if cmd == "init":
736
+ return cmd_init(rest)
737
+ if cmd == "commit":
738
+ return cmd_commit(rest)
739
+ if cmd == "check":
740
+ return cmd_check(rest)
741
+ if cmd == "status":
742
+ return cmd_status(rest)
743
+ if cmd == "claim":
744
+ return cmd_claim(rest)
745
+ if cmd == "predict":
746
+ return cmd_predict(rest)
747
+ if cmd == "components":
748
+ return cmd_components(rest)
749
+ if cmd == "migrate":
750
+ return cmd_migrate(rest)
751
+ if cmd == "source":
752
+ return cmd_source(rest)
753
+ if cmd == "compare":
754
+ return cmd_compare(rest)
755
+ if cmd == "verdict":
756
+ return cmd_verdict(rest)
757
+ if cmd == "conclude":
758
+ return cmd_conclude(rest)
759
+ if cmd == "migrate-layout":
760
+ return cmd_migrate_layout(rest)
761
+ if cmd == "close":
762
+ return cmd_close(rest)
763
+ if cmd == "seal":
764
+ return cmd_seal(rest)
765
+ if cmd == "import":
766
+ return cmd_import(rest)
767
+ return misuse("unknown command %r (init, commit, check, status, --all, claim, predict, "
768
+ "components, migrate, source, compare, close, seal, import)" % cmd)
769
+
770
+
771
+ if __name__ == "__main__":
772
+ sys.exit(main(sys.argv))