@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.
- package/CHANGELOG.md +738 -0
- package/LICENSE +21 -0
- package/MANIFEST +753 -0
- package/README.de.md +169 -0
- package/README.es.md +168 -0
- package/README.fr.md +166 -0
- package/README.md +161 -0
- package/README.tr.md +163 -0
- package/agents/tezgah-reviewer.md +70 -0
- package/bin/codegen +337 -0
- package/bin/consult +797 -0
- package/bin/tezgah-adhd +50 -0
- package/bin/tezgah-agents +45 -0
- package/bin/tezgah-capture +66 -0
- package/bin/tezgah-context +96 -0
- package/bin/tezgah-decisions +213 -0
- package/bin/tezgah-design +953 -0
- package/bin/tezgah-docs +1199 -0
- package/bin/tezgah-doctor +497 -0
- package/bin/tezgah-dsh +37 -0
- package/bin/tezgah-dsh.cmd +70 -0
- package/bin/tezgah-gate +75 -0
- package/bin/tezgah-import-ai-research +439 -0
- package/bin/tezgah-index +32 -0
- package/bin/tezgah-lessons +148 -0
- package/bin/tezgah-mcp +322 -0
- package/bin/tezgah-migrate +324 -0
- package/bin/tezgah-pony +50 -0
- package/bin/tezgah-research +772 -0
- package/bin/tezgah-rollback +93 -0
- package/bin/tezgah-route +124 -0
- package/bin/tezgah-setup +5798 -0
- package/bin/tezgah-status +383 -0
- package/bin/tezgah-task +607 -0
- package/bin/tezgah-taste +423 -0
- package/bin/tezgah-triage +485 -0
- package/bin/tezgah.js +36 -0
- package/commands/adhd.md +21 -0
- package/commands/ponytail.md +21 -0
- package/docs/README.md +112 -0
- package/docs/architecture.md +226 -0
- package/docs/citations-baseline.json +59 -0
- package/docs/clarity-baseline.json +116 -0
- package/docs/contract.md +416 -0
- package/docs/environment.md +141 -0
- package/docs/evidence.md +831 -0
- package/docs/feature-audit.md +139 -0
- package/docs/gate.md +407 -0
- package/docs/glossary.md +201 -0
- package/docs/hosts.md +400 -0
- package/docs/index.json +471 -0
- package/docs/judge.md +193 -0
- package/docs/layers.md +189 -0
- package/docs/models.md +160 -0
- package/docs/operations.md +666 -0
- package/docs/research.md +809 -0
- package/docs/results/paired-outcome-2026-10.jsonl +254 -0
- package/docs/results/paired-outcome-2026-10.md +204 -0
- package/docs/skills.md +236 -0
- package/docs/status-line.md +315 -0
- package/docs/testing.md +287 -0
- package/docs/vision.md +117 -0
- package/hooks/hooks.json +33 -0
- package/hooks/projects-auto-init.py +98 -0
- package/hooks/projects-posttooluse.py +149 -0
- package/hooks/projects-pretooluse.py +40 -0
- package/hooks/projects-stop.py +60 -0
- package/hooks/tezgah_agents.py +817 -0
- package/hooks/tezgah_apps.py +266 -0
- package/hooks/tezgah_attest.py +255 -0
- package/hooks/tezgah_clarity.py +171 -0
- package/hooks/tezgah_components.py +140 -0
- package/hooks/tezgah_context.py +2953 -0
- package/hooks/tezgah_embed.py +765 -0
- package/hooks/tezgah_gate.py +2736 -0
- package/hooks/tezgah_guard.py +177 -0
- package/hooks/tezgah_index.py +124 -0
- package/hooks/tezgah_integrity.py +5141 -0
- package/hooks/tezgah_judge.py +487 -0
- package/hooks/tezgah_lang.py +230 -0
- package/hooks/tezgah_lessons.py +210 -0
- package/hooks/tezgah_models.py +855 -0
- package/hooks/tezgah_paths.py +1132 -0
- package/hooks/tezgah_policy.py +1039 -0
- package/hooks/tezgah_rank.py +77 -0
- package/hooks/tezgah_replay.py +1109 -0
- package/hooks/tezgah_research.py +5176 -0
- package/hooks/tezgah_shapes.py +305 -0
- package/hooks/tezgah_skill_pick.py +227 -0
- package/hooks/tezgah_snapshot.py +490 -0
- package/hooks/tezgah_stopspec.py +320 -0
- package/hooks/tezgah_task.py +458 -0
- package/hooks/tezgah_taste.py +201 -0
- package/hooks/tezgah_untrusted.py +112 -0
- package/hooks/tezgah_update.py +430 -0
- package/hosts/codex/hook.py +268 -0
- package/hosts/codex/hooks.json +26 -0
- package/hosts/cursor/hook.py +461 -0
- package/hosts/cursor/hooks.json +44 -0
- package/hosts/dsh/hooks.json +21 -0
- package/hosts/dsh/statusline/lib/client.js +138 -0
- package/hosts/dsh/statusline/lib/index.js +104 -0
- package/hosts/dsh/statusline/package.json +28 -0
- package/hosts/omp/hook.py +277 -0
- package/hosts/omp/tezgah-hook.ts.in +701 -0
- package/hosts/opencode/plugins/tezgah.js +2742 -0
- package/hosts/opencode/tui/tezgah-tui.tsx +151 -0
- package/output-styles/tezgah.md +142 -0
- package/package.json +32 -0
- package/packaging/build.sh +342 -0
- package/packaging/install.ps1 +166 -0
- package/packaging/install.sh +56 -0
- package/packaging/upgrade.sh +142 -0
- package/skills/ai-research/0-autoresearch-skill/SKILL.md +411 -0
- package/skills/ai-research/0-autoresearch-skill/references/agent-continuity.md +95 -0
- package/skills/ai-research/0-autoresearch-skill/references/progress-reporting.md +166 -0
- package/skills/ai-research/0-autoresearch-skill/references/skill-routing.md +219 -0
- package/skills/ai-research/0-autoresearch-skill/templates/findings.md +44 -0
- package/skills/ai-research/0-autoresearch-skill/templates/research-log.md +41 -0
- package/skills/ai-research/01-model-architecture/litgpt/SKILL.md +469 -0
- package/skills/ai-research/01-model-architecture/litgpt/references/custom-models.md +569 -0
- package/skills/ai-research/01-model-architecture/litgpt/references/distributed-training.md +452 -0
- package/skills/ai-research/01-model-architecture/litgpt/references/supported-models.md +337 -0
- package/skills/ai-research/01-model-architecture/litgpt/references/training-recipes.md +620 -0
- package/skills/ai-research/01-model-architecture/mamba/SKILL.md +260 -0
- package/skills/ai-research/01-model-architecture/mamba/references/architecture-details.md +207 -0
- package/skills/ai-research/01-model-architecture/mamba/references/benchmarks.md +256 -0
- package/skills/ai-research/01-model-architecture/mamba/references/training-guide.md +389 -0
- package/skills/ai-research/01-model-architecture/nanogpt/SKILL.md +290 -0
- package/skills/ai-research/01-model-architecture/nanogpt/references/architecture.md +383 -0
- package/skills/ai-research/01-model-architecture/nanogpt/references/data.md +477 -0
- package/skills/ai-research/01-model-architecture/nanogpt/references/training.md +565 -0
- package/skills/ai-research/01-model-architecture/rwkv/SKILL.md +260 -0
- package/skills/ai-research/01-model-architecture/rwkv/references/architecture-details.md +345 -0
- package/skills/ai-research/01-model-architecture/rwkv/references/rwkv7.md +387 -0
- package/skills/ai-research/01-model-architecture/rwkv/references/state-management.md +370 -0
- package/skills/ai-research/01-model-architecture/torchtitan/SKILL.md +358 -0
- package/skills/ai-research/01-model-architecture/torchtitan/references/checkpoint.md +182 -0
- package/skills/ai-research/01-model-architecture/torchtitan/references/custom-models.md +259 -0
- package/skills/ai-research/01-model-architecture/torchtitan/references/float8.md +134 -0
- package/skills/ai-research/01-model-architecture/torchtitan/references/fsdp.md +127 -0
- package/skills/ai-research/02-tokenization/huggingface-tokenizers/SKILL.md +516 -0
- package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/algorithms.md +654 -0
- package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/integration.md +638 -0
- package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/pipeline.md +724 -0
- package/skills/ai-research/02-tokenization/huggingface-tokenizers/references/training.md +566 -0
- package/skills/ai-research/02-tokenization/sentencepiece/SKILL.md +235 -0
- package/skills/ai-research/02-tokenization/sentencepiece/references/algorithms.md +201 -0
- package/skills/ai-research/02-tokenization/sentencepiece/references/training.md +305 -0
- package/skills/ai-research/03-fine-tuning/axolotl/SKILL.md +158 -0
- package/skills/ai-research/03-fine-tuning/axolotl/references/api.md +5549 -0
- package/skills/ai-research/03-fine-tuning/axolotl/references/dataset-formats.md +1030 -0
- package/skills/ai-research/03-fine-tuning/axolotl/references/index.md +16 -0
- package/skills/ai-research/03-fine-tuning/axolotl/references/other.md +3564 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/SKILL.md +80 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/references/_images.md +24 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/references/advanced.md +1056 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/references/getting_started.md +350 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/references/index.md +20 -0
- package/skills/ai-research/03-fine-tuning/llama-factory/references/other.md +32 -0
- package/skills/ai-research/03-fine-tuning/peft/SKILL.md +431 -0
- package/skills/ai-research/03-fine-tuning/peft/references/advanced-usage.md +515 -0
- package/skills/ai-research/03-fine-tuning/peft/references/troubleshooting.md +481 -0
- package/skills/ai-research/03-fine-tuning/unsloth/SKILL.md +80 -0
- package/skills/ai-research/03-fine-tuning/unsloth/references/index.md +8 -0
- package/skills/ai-research/03-fine-tuning/unsloth/references/llms.md +83 -0
- package/skills/ai-research/04-mechanistic-interpretability/nnsight/SKILL.md +436 -0
- package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/README.md +79 -0
- package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/api.md +345 -0
- package/skills/ai-research/04-mechanistic-interpretability/nnsight/references/tutorials.md +301 -0
- package/skills/ai-research/04-mechanistic-interpretability/pyvene/SKILL.md +473 -0
- package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/README.md +74 -0
- package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/api.md +384 -0
- package/skills/ai-research/04-mechanistic-interpretability/pyvene/references/tutorials.md +377 -0
- package/skills/ai-research/04-mechanistic-interpretability/saelens/SKILL.md +386 -0
- package/skills/ai-research/04-mechanistic-interpretability/saelens/references/README.md +71 -0
- package/skills/ai-research/04-mechanistic-interpretability/saelens/references/api.md +334 -0
- package/skills/ai-research/04-mechanistic-interpretability/saelens/references/tutorials.md +319 -0
- package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/SKILL.md +346 -0
- package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/README.md +55 -0
- package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/api.md +363 -0
- package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/references/tutorials.md +340 -0
- package/skills/ai-research/05-data-processing/nemo-curator/SKILL.md +383 -0
- package/skills/ai-research/05-data-processing/nemo-curator/references/deduplication.md +88 -0
- package/skills/ai-research/05-data-processing/nemo-curator/references/filtering.md +103 -0
- package/skills/ai-research/05-data-processing/ray-data/SKILL.md +326 -0
- package/skills/ai-research/05-data-processing/ray-data/references/integration.md +83 -0
- package/skills/ai-research/05-data-processing/ray-data/references/transformations.md +84 -0
- package/skills/ai-research/06-post-training/grpo-rl-training/README.md +98 -0
- package/skills/ai-research/06-post-training/grpo-rl-training/SKILL.md +572 -0
- package/skills/ai-research/06-post-training/miles/SKILL.md +315 -0
- package/skills/ai-research/06-post-training/miles/references/api-reference.md +142 -0
- package/skills/ai-research/06-post-training/miles/references/troubleshooting.md +353 -0
- package/skills/ai-research/06-post-training/openrlhf/SKILL.md +249 -0
- package/skills/ai-research/06-post-training/openrlhf/references/algorithm-comparison.md +405 -0
- package/skills/ai-research/06-post-training/openrlhf/references/custom-rewards.md +531 -0
- package/skills/ai-research/06-post-training/openrlhf/references/hybrid-engine.md +288 -0
- package/skills/ai-research/06-post-training/openrlhf/references/multi-node-training.md +455 -0
- package/skills/ai-research/06-post-training/simpo/SKILL.md +219 -0
- package/skills/ai-research/06-post-training/simpo/references/datasets.md +479 -0
- package/skills/ai-research/06-post-training/simpo/references/hyperparameters.md +453 -0
- package/skills/ai-research/06-post-training/simpo/references/loss-functions.md +351 -0
- package/skills/ai-research/06-post-training/slime/SKILL.md +464 -0
- package/skills/ai-research/06-post-training/slime/references/api-reference.md +393 -0
- package/skills/ai-research/06-post-training/slime/references/troubleshooting.md +387 -0
- package/skills/ai-research/06-post-training/torchforge/SKILL.md +433 -0
- package/skills/ai-research/06-post-training/torchforge/references/api-reference.md +328 -0
- package/skills/ai-research/06-post-training/torchforge/references/troubleshooting.md +410 -0
- package/skills/ai-research/06-post-training/trl-fine-tuning/SKILL.md +455 -0
- package/skills/ai-research/06-post-training/trl-fine-tuning/references/dpo-variants.md +228 -0
- package/skills/ai-research/06-post-training/trl-fine-tuning/references/online-rl.md +83 -0
- package/skills/ai-research/06-post-training/trl-fine-tuning/references/reward-modeling.md +123 -0
- package/skills/ai-research/06-post-training/trl-fine-tuning/references/sft-training.md +169 -0
- package/skills/ai-research/06-post-training/verl/SKILL.md +391 -0
- package/skills/ai-research/06-post-training/verl/references/api-reference.md +302 -0
- package/skills/ai-research/06-post-training/verl/references/troubleshooting.md +392 -0
- package/skills/ai-research/07-safety-alignment/constitutional-ai/SKILL.md +290 -0
- package/skills/ai-research/07-safety-alignment/llamaguard/SKILL.md +337 -0
- package/skills/ai-research/07-safety-alignment/nemo-guardrails/SKILL.md +297 -0
- package/skills/ai-research/07-safety-alignment/prompt-guard/SKILL.md +312 -0
- package/skills/ai-research/08-distributed-training/accelerate/SKILL.md +332 -0
- package/skills/ai-research/08-distributed-training/accelerate/references/custom-plugins.md +454 -0
- package/skills/ai-research/08-distributed-training/accelerate/references/megatron-integration.md +490 -0
- package/skills/ai-research/08-distributed-training/accelerate/references/performance.md +526 -0
- package/skills/ai-research/08-distributed-training/deepspeed/SKILL.md +141 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/08.md +18 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/09.md +174 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/2020.md +379 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/2023.md +280 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/assets.md +180 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/index.md +36 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/mii.md +119 -0
- package/skills/ai-research/08-distributed-training/deepspeed/references/other.md +1192 -0
- package/skills/ai-research/08-distributed-training/megatron-core/SKILL.md +366 -0
- package/skills/ai-research/08-distributed-training/megatron-core/references/benchmarks.md +250 -0
- package/skills/ai-research/08-distributed-training/megatron-core/references/parallelism-guide.md +405 -0
- package/skills/ai-research/08-distributed-training/megatron-core/references/production-examples.md +474 -0
- package/skills/ai-research/08-distributed-training/megatron-core/references/training-recipes.md +548 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/SKILL.md +231 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_async_recipe.md +14 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_overview.md +19 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_dcp_recipe.md +18 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_ddp_notes.md +10 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_device_mesh_tutorial.md +22 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_examples_fsdp2.md +15 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fsdp1_api.md +9 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fsdp2_tutorial.md +45 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_fully_shard_api.md +49 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/pytorch_tp_tutorial.md +22 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/ray_train_fsdp2_example.md +13 -0
- package/skills/ai-research/08-distributed-training/pytorch-fsdp2/references/torchtitan_fsdp_notes.md +14 -0
- package/skills/ai-research/08-distributed-training/pytorch-lightning/SKILL.md +346 -0
- package/skills/ai-research/08-distributed-training/pytorch-lightning/references/callbacks.md +437 -0
- package/skills/ai-research/08-distributed-training/pytorch-lightning/references/distributed.md +491 -0
- package/skills/ai-research/08-distributed-training/pytorch-lightning/references/hyperparameter-tuning.md +557 -0
- package/skills/ai-research/08-distributed-training/ray-train/SKILL.md +406 -0
- package/skills/ai-research/08-distributed-training/ray-train/references/multi-node.md +629 -0
- package/skills/ai-research/09-infrastructure/lambda-labs/SKILL.md +545 -0
- package/skills/ai-research/09-infrastructure/lambda-labs/references/advanced-usage.md +612 -0
- package/skills/ai-research/09-infrastructure/lambda-labs/references/troubleshooting.md +531 -0
- package/skills/ai-research/09-infrastructure/modal/SKILL.md +341 -0
- package/skills/ai-research/09-infrastructure/modal/references/advanced-usage.md +504 -0
- package/skills/ai-research/09-infrastructure/modal/references/troubleshooting.md +495 -0
- package/skills/ai-research/09-infrastructure/skypilot/SKILL.md +509 -0
- package/skills/ai-research/09-infrastructure/skypilot/references/advanced-usage.md +492 -0
- package/skills/ai-research/09-infrastructure/skypilot/references/troubleshooting.md +571 -0
- package/skills/ai-research/10-optimization/awq/SKILL.md +310 -0
- package/skills/ai-research/10-optimization/awq/references/advanced-usage.md +325 -0
- package/skills/ai-research/10-optimization/awq/references/troubleshooting.md +345 -0
- package/skills/ai-research/10-optimization/bitsandbytes/SKILL.md +411 -0
- package/skills/ai-research/10-optimization/bitsandbytes/references/memory-optimization.md +522 -0
- package/skills/ai-research/10-optimization/bitsandbytes/references/qlora-training.md +522 -0
- package/skills/ai-research/10-optimization/bitsandbytes/references/quantization-formats.md +448 -0
- package/skills/ai-research/10-optimization/flash-attention/SKILL.md +367 -0
- package/skills/ai-research/10-optimization/flash-attention/references/benchmarks.md +216 -0
- package/skills/ai-research/10-optimization/flash-attention/references/transformers-integration.md +294 -0
- package/skills/ai-research/10-optimization/gguf/SKILL.md +427 -0
- package/skills/ai-research/10-optimization/gguf/references/advanced-usage.md +505 -0
- package/skills/ai-research/10-optimization/gguf/references/troubleshooting.md +443 -0
- package/skills/ai-research/10-optimization/gptq/SKILL.md +450 -0
- package/skills/ai-research/10-optimization/gptq/references/calibration.md +338 -0
- package/skills/ai-research/10-optimization/gptq/references/integration.md +130 -0
- package/skills/ai-research/10-optimization/gptq/references/troubleshooting.md +96 -0
- package/skills/ai-research/10-optimization/hqq/SKILL.md +445 -0
- package/skills/ai-research/10-optimization/hqq/references/advanced-usage.md +529 -0
- package/skills/ai-research/10-optimization/hqq/references/troubleshooting.md +504 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/SKILL.md +319 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/architecture.md +320 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/biomedical.md +498 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/domain-specific.md +626 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/experiment-loop.md +129 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/optimizers.md +330 -0
- package/skills/ai-research/10-optimization/ml-training-recipes/references/scaling-and-selection.md +428 -0
- package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/SKILL.md +405 -0
- package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/benchmarks.md +394 -0
- package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/custom-tasks.md +425 -0
- package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/references/issues.md +395 -0
- package/skills/ai-research/11-evaluation/lm-evaluation-harness/SKILL.md +490 -0
- package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/api-evaluation.md +491 -0
- package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/benchmark-guide.md +489 -0
- package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/custom-tasks.md +603 -0
- package/skills/ai-research/11-evaluation/lm-evaluation-harness/references/distributed-eval.md +520 -0
- package/skills/ai-research/11-evaluation/nemo-evaluator/SKILL.md +494 -0
- package/skills/ai-research/11-evaluation/nemo-evaluator/references/adapter-system.md +341 -0
- package/skills/ai-research/11-evaluation/nemo-evaluator/references/configuration.md +448 -0
- package/skills/ai-research/11-evaluation/nemo-evaluator/references/custom-benchmarks.md +316 -0
- package/skills/ai-research/11-evaluation/nemo-evaluator/references/execution-backends.md +362 -0
- package/skills/ai-research/12-inference-serving/llama-cpp/SKILL.md +258 -0
- package/skills/ai-research/12-inference-serving/llama-cpp/references/optimization.md +90 -0
- package/skills/ai-research/12-inference-serving/llama-cpp/references/quantization.md +214 -0
- package/skills/ai-research/12-inference-serving/llama-cpp/references/server.md +126 -0
- package/skills/ai-research/12-inference-serving/sglang/SKILL.md +442 -0
- package/skills/ai-research/12-inference-serving/sglang/references/deployment.md +491 -0
- package/skills/ai-research/12-inference-serving/sglang/references/radix-attention.md +414 -0
- package/skills/ai-research/12-inference-serving/sglang/references/structured-generation.md +542 -0
- package/skills/ai-research/12-inference-serving/tensorrt-llm/SKILL.md +187 -0
- package/skills/ai-research/12-inference-serving/tensorrt-llm/references/multi-gpu.md +299 -0
- package/skills/ai-research/12-inference-serving/tensorrt-llm/references/optimization.md +243 -0
- package/skills/ai-research/12-inference-serving/tensorrt-llm/references/serving.md +471 -0
- package/skills/ai-research/12-inference-serving/vllm/SKILL.md +364 -0
- package/skills/ai-research/12-inference-serving/vllm/references/optimization.md +227 -0
- package/skills/ai-research/12-inference-serving/vllm/references/quantization.md +285 -0
- package/skills/ai-research/12-inference-serving/vllm/references/server-deployment.md +256 -0
- package/skills/ai-research/12-inference-serving/vllm/references/troubleshooting.md +448 -0
- package/skills/ai-research/13-mlops/mlflow/SKILL.md +704 -0
- package/skills/ai-research/13-mlops/mlflow/references/deployment.md +745 -0
- package/skills/ai-research/13-mlops/mlflow/references/model-registry.md +771 -0
- package/skills/ai-research/13-mlops/mlflow/references/tracking.md +681 -0
- package/skills/ai-research/13-mlops/swanlab/SKILL.md +406 -0
- package/skills/ai-research/13-mlops/swanlab/references/integrations.md +305 -0
- package/skills/ai-research/13-mlops/swanlab/references/visualization.md +234 -0
- package/skills/ai-research/13-mlops/tensorboard/SKILL.md +629 -0
- package/skills/ai-research/13-mlops/tensorboard/references/integrations.md +639 -0
- package/skills/ai-research/13-mlops/tensorboard/references/profiling.md +546 -0
- package/skills/ai-research/13-mlops/tensorboard/references/visualization.md +621 -0
- package/skills/ai-research/13-mlops/weights-and-biases/SKILL.md +590 -0
- package/skills/ai-research/13-mlops/weights-and-biases/references/artifacts.md +585 -0
- package/skills/ai-research/13-mlops/weights-and-biases/references/integrations.md +701 -0
- package/skills/ai-research/13-mlops/weights-and-biases/references/sweeps.md +848 -0
- package/skills/ai-research/14-agents/a-evolve/SKILL.md +383 -0
- package/skills/ai-research/14-agents/a-evolve/references/README.md +831 -0
- package/skills/ai-research/14-agents/a-evolve/references/api.md +594 -0
- package/skills/ai-research/14-agents/a-evolve/references/architecture.md +417 -0
- package/skills/ai-research/14-agents/a-evolve/references/design-patterns.md +462 -0
- package/skills/ai-research/14-agents/a-evolve/references/examples.md +352 -0
- package/skills/ai-research/14-agents/a-evolve/references/issues.md +591 -0
- package/skills/ai-research/14-agents/a-evolve/references/releases.md +112 -0
- package/skills/ai-research/14-agents/a-evolve/references/tutorials.md +819 -0
- package/skills/ai-research/14-agents/autogpt/SKILL.md +403 -0
- package/skills/ai-research/14-agents/autogpt/references/advanced-usage.md +536 -0
- package/skills/ai-research/14-agents/autogpt/references/troubleshooting.md +421 -0
- package/skills/ai-research/14-agents/crewai/SKILL.md +498 -0
- package/skills/ai-research/14-agents/crewai/references/flows.md +439 -0
- package/skills/ai-research/14-agents/crewai/references/tools.md +430 -0
- package/skills/ai-research/14-agents/crewai/references/troubleshooting.md +481 -0
- package/skills/ai-research/14-agents/langchain/SKILL.md +480 -0
- package/skills/ai-research/14-agents/langchain/references/agents.md +500 -0
- package/skills/ai-research/14-agents/langchain/references/integration.md +563 -0
- package/skills/ai-research/14-agents/langchain/references/rag.md +601 -0
- package/skills/ai-research/14-agents/llamaindex/SKILL.md +569 -0
- package/skills/ai-research/14-agents/llamaindex/references/agents.md +84 -0
- package/skills/ai-research/14-agents/llamaindex/references/data_connectors.md +109 -0
- package/skills/ai-research/14-agents/llamaindex/references/query_engines.md +407 -0
- package/skills/ai-research/15-rag/chroma/SKILL.md +406 -0
- package/skills/ai-research/15-rag/chroma/references/integration.md +39 -0
- package/skills/ai-research/15-rag/faiss/SKILL.md +221 -0
- package/skills/ai-research/15-rag/faiss/references/index_types.md +281 -0
- package/skills/ai-research/15-rag/pinecone/SKILL.md +358 -0
- package/skills/ai-research/15-rag/pinecone/references/deployment.md +182 -0
- package/skills/ai-research/15-rag/qdrant/SKILL.md +493 -0
- package/skills/ai-research/15-rag/qdrant/references/advanced-usage.md +649 -0
- package/skills/ai-research/15-rag/qdrant/references/troubleshooting.md +632 -0
- package/skills/ai-research/15-rag/sentence-transformers/SKILL.md +255 -0
- package/skills/ai-research/15-rag/sentence-transformers/references/models.md +124 -0
- package/skills/ai-research/16-prompt-engineering/dspy/SKILL.md +590 -0
- package/skills/ai-research/16-prompt-engineering/dspy/references/examples.md +664 -0
- package/skills/ai-research/16-prompt-engineering/dspy/references/modules.md +476 -0
- package/skills/ai-research/16-prompt-engineering/dspy/references/optimizers.md +567 -0
- package/skills/ai-research/16-prompt-engineering/guidance/SKILL.md +572 -0
- package/skills/ai-research/16-prompt-engineering/guidance/references/backends.md +555 -0
- package/skills/ai-research/16-prompt-engineering/guidance/references/constraints.md +675 -0
- package/skills/ai-research/16-prompt-engineering/guidance/references/examples.md +768 -0
- package/skills/ai-research/16-prompt-engineering/instructor/SKILL.md +740 -0
- package/skills/ai-research/16-prompt-engineering/instructor/references/examples.md +108 -0
- package/skills/ai-research/16-prompt-engineering/instructor/references/providers.md +71 -0
- package/skills/ai-research/16-prompt-engineering/instructor/references/validation.md +607 -0
- package/skills/ai-research/16-prompt-engineering/outlines/SKILL.md +652 -0
- package/skills/ai-research/16-prompt-engineering/outlines/references/backends.md +616 -0
- package/skills/ai-research/16-prompt-engineering/outlines/references/examples.md +774 -0
- package/skills/ai-research/16-prompt-engineering/outlines/references/json_generation.md +653 -0
- package/skills/ai-research/17-observability/langsmith/SKILL.md +422 -0
- package/skills/ai-research/17-observability/langsmith/references/advanced-usage.md +549 -0
- package/skills/ai-research/17-observability/langsmith/references/troubleshooting.md +538 -0
- package/skills/ai-research/17-observability/phoenix/SKILL.md +475 -0
- package/skills/ai-research/17-observability/phoenix/references/advanced-usage.md +620 -0
- package/skills/ai-research/17-observability/phoenix/references/troubleshooting.md +539 -0
- package/skills/ai-research/18-multimodal/audiocraft/SKILL.md +564 -0
- package/skills/ai-research/18-multimodal/audiocraft/references/advanced-usage.md +667 -0
- package/skills/ai-research/18-multimodal/audiocraft/references/troubleshooting.md +505 -0
- package/skills/ai-research/18-multimodal/blip-2/SKILL.md +564 -0
- package/skills/ai-research/18-multimodal/blip-2/references/advanced-usage.md +681 -0
- package/skills/ai-research/18-multimodal/blip-2/references/troubleshooting.md +527 -0
- package/skills/ai-research/18-multimodal/clip/SKILL.md +253 -0
- package/skills/ai-research/18-multimodal/clip/references/applications.md +208 -0
- package/skills/ai-research/18-multimodal/cosmos-policy/SKILL.md +402 -0
- package/skills/ai-research/18-multimodal/cosmos-policy/references/libero-commands.md +175 -0
- package/skills/ai-research/18-multimodal/cosmos-policy/references/robocasa-commands.md +147 -0
- package/skills/ai-research/18-multimodal/llava/SKILL.md +304 -0
- package/skills/ai-research/18-multimodal/llava/references/training.md +198 -0
- package/skills/ai-research/18-multimodal/openpi/SKILL.md +480 -0
- package/skills/ai-research/18-multimodal/openpi/references/checkpoints-and-env-map.md +86 -0
- package/skills/ai-research/18-multimodal/openpi/references/config-recipes.md +50 -0
- package/skills/ai-research/18-multimodal/openpi/references/pytorch-gotchas.md +49 -0
- package/skills/ai-research/18-multimodal/openpi/references/remote-client-pattern.md +48 -0
- package/skills/ai-research/18-multimodal/openpi/references/training-debugging.md +46 -0
- package/skills/ai-research/18-multimodal/openvla-oft/SKILL.md +441 -0
- package/skills/ai-research/18-multimodal/openvla-oft/references/aloha-workflow.md +141 -0
- package/skills/ai-research/18-multimodal/openvla-oft/references/config-troubleshooting.md +97 -0
- package/skills/ai-research/18-multimodal/openvla-oft/references/libero-workflow.md +115 -0
- package/skills/ai-research/18-multimodal/openvla-oft/references/paper-and-checkpoints.md +84 -0
- package/skills/ai-research/18-multimodal/segment-anything/SKILL.md +500 -0
- package/skills/ai-research/18-multimodal/segment-anything/references/advanced-usage.md +590 -0
- package/skills/ai-research/18-multimodal/segment-anything/references/troubleshooting.md +485 -0
- package/skills/ai-research/18-multimodal/stable-diffusion/SKILL.md +519 -0
- package/skills/ai-research/18-multimodal/stable-diffusion/references/advanced-usage.md +717 -0
- package/skills/ai-research/18-multimodal/stable-diffusion/references/troubleshooting.md +556 -0
- package/skills/ai-research/18-multimodal/whisper/SKILL.md +317 -0
- package/skills/ai-research/18-multimodal/whisper/references/languages.md +190 -0
- package/skills/ai-research/19-emerging-techniques/knowledge-distillation/SKILL.md +458 -0
- package/skills/ai-research/19-emerging-techniques/knowledge-distillation/references/minillm.md +335 -0
- package/skills/ai-research/19-emerging-techniques/long-context/SKILL.md +536 -0
- package/skills/ai-research/19-emerging-techniques/long-context/references/extension_methods.md +469 -0
- package/skills/ai-research/19-emerging-techniques/long-context/references/fine_tuning.md +612 -0
- package/skills/ai-research/19-emerging-techniques/long-context/references/rope.md +403 -0
- package/skills/ai-research/19-emerging-techniques/model-merging/SKILL.md +497 -0
- package/skills/ai-research/19-emerging-techniques/model-merging/references/coefficient-tuning.md +415 -0
- package/skills/ai-research/19-emerging-techniques/model-merging/references/evaluation.md +463 -0
- package/skills/ai-research/19-emerging-techniques/model-merging/references/examples.md +429 -0
- package/skills/ai-research/19-emerging-techniques/model-merging/references/methods.md +353 -0
- package/skills/ai-research/19-emerging-techniques/model-pruning/SKILL.md +495 -0
- package/skills/ai-research/19-emerging-techniques/model-pruning/references/wanda.md +348 -0
- package/skills/ai-research/19-emerging-techniques/moe-training/SKILL.md +526 -0
- package/skills/ai-research/19-emerging-techniques/moe-training/references/architectures.md +433 -0
- package/skills/ai-research/19-emerging-techniques/moe-training/references/inference.md +349 -0
- package/skills/ai-research/19-emerging-techniques/moe-training/references/training.md +426 -0
- package/skills/ai-research/19-emerging-techniques/speculative-decoding/SKILL.md +467 -0
- package/skills/ai-research/19-emerging-techniques/speculative-decoding/references/lookahead.md +310 -0
- package/skills/ai-research/19-emerging-techniques/speculative-decoding/references/medusa.md +351 -0
- package/skills/ai-research/20-ml-paper-writing/academic-plotting/SKILL.md +479 -0
- package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/data-visualization.md +509 -0
- package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/diagram-generation.md +395 -0
- package/skills/ai-research/20-ml-paper-writing/academic-plotting/references/style-guide.md +305 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/SKILL.md +982 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/checklists.md +348 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/citation-workflow.md +563 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/reviewer-guidelines.md +349 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/sources.md +165 -0
- package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/references/writing-guide.md +477 -0
- package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/SKILL.md +298 -0
- package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/references/slide-templates.md +505 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/SKILL.md +270 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/checklist.md +279 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/reviewer-guidelines.md +116 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/section-blueprints.md +400 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/systems-conferences.md +261 -0
- package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/references/writing-patterns.md +231 -0
- package/skills/ai-research/21-research-ideation/brainstorming-research-ideas/SKILL.md +384 -0
- package/skills/ai-research/21-research-ideation/creative-thinking-for-research/SKILL.md +366 -0
- package/skills/ai-research/22-agent-native-research-artifact/compiler/SKILL.md +245 -0
- package/skills/ai-research/22-agent-native-research-artifact/compiler/references/ara-schema.md +439 -0
- package/skills/ai-research/22-agent-native-research-artifact/compiler/references/exploration-tree-spec.md +125 -0
- package/skills/ai-research/22-agent-native-research-artifact/compiler/references/validation-checklist.md +149 -0
- package/skills/ai-research/22-agent-native-research-artifact/research-manager/SKILL.md +324 -0
- package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/event-taxonomy.md +124 -0
- package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/provenance-tags.md +190 -0
- package/skills/ai-research/22-agent-native-research-artifact/research-manager/references/session-protocol.md +162 -0
- package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/SKILL.md +322 -0
- package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/references/review-dimensions.md +182 -0
- package/skills/ai-research/SKILL.md +101 -0
- package/skills/ai-research/SOURCE +38 -0
- package/skills/ai-research/index/1-frame.md +18 -0
- package/skills/ai-research/index/2-data.md +21 -0
- package/skills/ai-research/index/3-train.md +48 -0
- package/skills/ai-research/index/4-measure.md +25 -0
- package/skills/ai-research/index/5-run.md +23 -0
- package/skills/ai-research/index/6-write.md +35 -0
- package/skills/ai-research/library.json +3456 -0
- package/skills/analyze-app/EVALS.md +82 -0
- package/skills/analyze-app/SKILL.md +188 -0
- package/skills/design-contract/EVALS.md +80 -0
- package/skills/design-contract/SKILL.md +171 -0
- package/skills/design-library/EVALS.md +85 -0
- package/skills/design-library/INDEX.md +59 -0
- package/skills/design-library/SKILL.md +58 -0
- package/skills/design-library/SOURCE +131 -0
- package/skills/design-library/adaptive-interfaces/skills/colour-independence/SKILL.md +90 -0
- package/skills/design-library/adaptive-interfaces/skills/flexible-typography/SKILL.md +83 -0
- package/skills/design-library/adaptive-interfaces/skills/information-density/SKILL.md +87 -0
- package/skills/design-library/adaptive-interfaces/skills/preference-audit/SKILL.md +70 -0
- package/skills/design-library/adaptive-interfaces/skills/responsive-accessibility/SKILL.md +86 -0
- package/skills/design-library/adaptive-interfaces/skills/responsive-review/SKILL.md +76 -0
- package/skills/design-library/adaptive-interfaces/skills/simplified-views/SKILL.md +97 -0
- package/skills/design-library/adaptive-interfaces/skills/specify/SKILL.md +63 -0
- package/skills/design-library/adaptive-interfaces/skills/user-preference-respect/SKILL.md +100 -0
- package/skills/design-library/cognitive-accessibility/skills/adaptive-personalisation/SKILL.md +61 -0
- package/skills/design-library/cognitive-accessibility/skills/assess-load/SKILL.md +48 -0
- package/skills/design-library/cognitive-accessibility/skills/cognitive-load-assessment/SKILL.md +60 -0
- package/skills/design-library/cognitive-accessibility/skills/contextual-help-design/SKILL.md +61 -0
- package/skills/design-library/cognitive-accessibility/skills/error-prevention-recovery/SKILL.md +71 -0
- package/skills/design-library/cognitive-accessibility/skills/focus-attention-design/SKILL.md +67 -0
- package/skills/design-library/cognitive-accessibility/skills/memory-load-reduction/SKILL.md +60 -0
- package/skills/design-library/cognitive-accessibility/skills/plain-language-design/SKILL.md +78 -0
- package/skills/design-library/cognitive-accessibility/skills/review/SKILL.md +56 -0
- package/skills/design-library/cognitive-accessibility/skills/simplify/SKILL.md +39 -0
- package/skills/design-library/cognitive-accessibility/skills/wayfinding-navigation/SKILL.md +64 -0
- package/skills/design-library/design-research/skills/behavioural-analytics/SKILL.md +33 -0
- package/skills/design-library/design-research/skills/qual-quant-triangulation/SKILL.md +33 -0
- package/skills/design-library/inclusive-interaction/skills/audit/SKILL.md +50 -0
- package/skills/design-library/inclusive-interaction/skills/design-flow/SKILL.md +58 -0
- package/skills/design-library/inclusive-interaction/skills/feedback-and-status/SKILL.md +76 -0
- package/skills/design-library/inclusive-interaction/skills/gesture-alternatives/SKILL.md +70 -0
- package/skills/design-library/inclusive-interaction/skills/keyboard-navigation/SKILL.md +99 -0
- package/skills/design-library/inclusive-interaction/skills/keyboard-review/SKILL.md +54 -0
- package/skills/design-library/inclusive-interaction/skills/motion-sensitivity/SKILL.md +79 -0
- package/skills/design-library/inclusive-interaction/skills/multi-modal-input/SKILL.md +70 -0
- package/skills/design-library/inclusive-interaction/skills/touch-target-design/SKILL.md +71 -0
- package/skills/design-library/inclusive-interaction/skills/voice-interaction/SKILL.md +68 -0
- package/skills/design-library/visual-critique/skills/critique-affordance/SKILL.md +45 -0
- package/skills/design-library/visual-critique/skills/critique-brand-consistency/SKILL.md +42 -0
- package/skills/design-library/visual-critique/skills/critique-color/SKILL.md +44 -0
- package/skills/design-library/visual-critique/skills/critique-composition/SKILL.md +46 -0
- package/skills/design-library/visual-critique/skills/critique-information-density/SKILL.md +45 -0
- package/skills/design-library/visual-critique/skills/critique-typography/SKILL.md +45 -0
- package/skills/design-library/visual-critique/skills/critique-visual-hierarchy/SKILL.md +40 -0
- package/skills/feature-audit/EVALS.md +83 -0
- package/skills/feature-audit/SKILL.md +326 -0
- package/skills/harness/EVALS.md +81 -0
- package/skills/harness/SKILL.md +88 -0
- package/skills/i-have-adhd/EVALS.md +80 -0
- package/skills/i-have-adhd/SKILL.md +183 -0
- package/skills/no-ai-slop/EVALS.md +89 -0
- package/skills/no-ai-slop/SKILL.md +209 -0
- package/skills/no-ai-slop/eval.md +52 -0
- package/skills/plan-add/EVALS.md +79 -0
- package/skills/plan-add/SKILL.md +179 -0
- package/skills/plan-add/render_table.py +72 -0
- package/skills/plan-status/EVALS.md +78 -0
- package/skills/plan-status/SKILL.md +52 -0
- package/skills/plan-sync/EVALS.md +80 -0
- package/skills/plan-sync/SKILL.md +69 -0
- package/skills/pm-frameworks/SKILL.md +33 -0
- package/skills/pm-frameworks/SOURCE +39 -0
- package/skills/pm-frameworks/intended-vs-implemented/SKILL.md +42 -0
- package/skills/pm-frameworks/opportunity-solution-tree/SKILL.md +64 -0
- package/skills/ponytail/EVALS.md +80 -0
- package/skills/ponytail/SKILL.md +124 -0
- package/skills/product-analysis/EVALS.md +103 -0
- package/skills/product-analysis/SKILL.md +361 -0
- package/skills/research/EVALS.md +104 -0
- package/skills/research/SKILL.md +570 -0
- package/skills/rl-env/SKILL.md +53 -0
- package/skills/rl-env/SOURCE +41 -0
- package/skills/rl-env/generate-nemo-gym-env/SKILL.md +169 -0
- package/skills/rl-env/generate-nemo-gym-env/references/architecture.md +114 -0
- package/skills/rl-env/generate-openenv-env/SKILL.md +183 -0
- package/skills/rl-env/generate-openenv-env/references/architecture.md +82 -0
- package/skills/rl-env/generate-ors-env/SKILL.md +209 -0
- package/skills/rl-env/generate-ors-env/references/architecture.md +113 -0
- package/skills/rl-env/generate-verifiers-env/SKILL.md +188 -0
- package/skills/rl-env/generate-verifiers-env/references/architecture.md +119 -0
- package/skills/rl-env/rl-env-from-description/SKILL.md +124 -0
- package/skills/rl-env/rl-env-from-description/references/interview.md +75 -0
- package/skills/rl-env/rl-env-from-description/references/nemo_gym.md +41 -0
- package/skills/rl-env/rl-env-from-description/references/openenv.md +35 -0
- package/skills/rl-env/rl-env-from-description/references/ors.md +50 -0
- package/skills/rl-env/rl-env-from-description/references/verifiers.md +39 -0
- package/skills/tezgah-contract/EVALS.md +78 -0
- package/skills/tezgah-contract/SKILL.md +792 -0
- package/statusline.py +129 -0
- package/workflows/graph-impact.js +153 -0
- package/workflows/graph-map.js +158 -0
- 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))
|