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