@r1z4x/tezgah 1.9.2 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. package/CHANGELOG.md +415 -1
  2. package/MANIFEST +404 -144
  3. package/README.de.md +1 -1
  4. package/README.es.md +1 -1
  5. package/README.fr.md +1 -1
  6. package/README.md +5 -4
  7. package/README.tr.md +1 -1
  8. package/bin/codegen +5 -2
  9. package/bin/tezgah-design +288 -1
  10. package/bin/tezgah-docs +1 -1
  11. package/bin/tezgah-doctor +39 -2
  12. package/bin/tezgah-import-ai-research +26 -12
  13. package/bin/tezgah-ocr-review +296 -0
  14. package/bin/tezgah-research +255 -44
  15. package/bin/tezgah-review-quote +185 -0
  16. package/bin/tezgah-setup +1365 -55
  17. package/bin/tezgah-skill +1 -1
  18. package/bin/tezgah-status +201 -3
  19. package/bin/tezgah-task +258 -20
  20. package/commands/adhd.md +2 -2
  21. package/commands/ponytail.md +4 -4
  22. package/docs/architecture.md +2 -2
  23. package/docs/citations-baseline.json +3 -3
  24. package/docs/clarity-baseline.json +11 -5
  25. package/docs/contract.md +91 -43
  26. package/docs/environment.md +5 -2
  27. package/docs/evidence.md +109 -17
  28. package/docs/feature-audit.md +2 -2
  29. package/docs/gate.md +60 -33
  30. package/docs/glossary.md +6 -3
  31. package/docs/hosts.md +313 -17
  32. package/docs/index.json +34 -8
  33. package/docs/judge.md +4 -2
  34. package/docs/layers.md +4 -4
  35. package/docs/models.md +37 -9
  36. package/docs/operations.md +141 -5
  37. package/docs/research.md +815 -8
  38. package/docs/skills.md +137 -13
  39. package/docs/status-line.md +121 -1
  40. package/docs/testing.md +3 -1
  41. package/hooks/hooks.json +2 -2
  42. package/hooks/lang/en.json +21 -0
  43. package/hooks/lang/tr.json +22 -1
  44. package/hooks/projects-stop.py +2 -1
  45. package/hooks/tezgah_agents.py +65 -25
  46. package/hooks/tezgah_apps.py +18 -0
  47. package/hooks/tezgah_attest.py +79 -10
  48. package/hooks/tezgah_components.py +4 -0
  49. package/hooks/tezgah_context.py +207 -55
  50. package/hooks/tezgah_extension.py +337 -0
  51. package/hooks/tezgah_gate.py +267 -79
  52. package/hooks/tezgah_integrity.py +864 -143
  53. package/hooks/tezgah_judge.py +6 -4
  54. package/hooks/tezgah_models.py +59 -19
  55. package/hooks/tezgah_orca.py +1 -1
  56. package/hooks/tezgah_paths.py +145 -8
  57. package/hooks/tezgah_policy.py +128 -57
  58. package/hooks/tezgah_rank.py +9 -6
  59. package/hooks/tezgah_replay.py +12 -6
  60. package/hooks/tezgah_research.py +1414 -76
  61. package/hooks/tezgah_research_capture.py +1544 -0
  62. package/hooks/tezgah_research_evidence.py +842 -0
  63. package/hooks/tezgah_research_stats.py +258 -0
  64. package/hooks/tezgah_skill_pick.py +408 -106
  65. package/hooks/tezgah_stack.py +236 -1
  66. package/hooks/tezgah_stopspec.py +8 -1
  67. package/hooks/tezgah_task.py +14 -5
  68. package/hooks/tezgah_taste_ledger.py +1 -1
  69. package/hosts/amp/hook.py +217 -0
  70. package/hosts/amp/tezgah-plugin.ts.in +386 -0
  71. package/hosts/antigravity/hook.py +255 -0
  72. package/hosts/codex/hook.py +2 -1
  73. package/hosts/commandcode/hook.py +239 -0
  74. package/hosts/copilot/hook.py +284 -0
  75. package/hosts/cursor/hook.py +31 -3
  76. package/hosts/droid/hook.py +259 -0
  77. package/hosts/dsh/hooks.json +1 -1
  78. package/hosts/gemini/hook.py +213 -0
  79. package/hosts/goose/hook.py +145 -0
  80. package/hosts/omp/hook.py +4 -1
  81. package/hosts/omp/tezgah-hook.ts.in +30 -7
  82. package/hosts/opencode/plugins/tezgah.js +309 -48
  83. package/hosts/opencode/tui/cli/tui.tsx +100 -0
  84. package/hosts/opencode/tui/tezgah-tui.tsx +2 -1
  85. package/hosts/qwen/hook.py +206 -0
  86. package/output-styles/tezgah.md +20 -15
  87. package/package.json +1 -1
  88. package/skills/ai-research/SKILL.md +21 -14
  89. package/skills/ai-research/SOURCE +7 -5
  90. package/skills/ai-research/index/1-frame.md +6 -6
  91. package/skills/ai-research/index/2-data.md +9 -9
  92. package/skills/ai-research/index/3-train.md +36 -36
  93. package/skills/ai-research/index/4-measure.md +13 -13
  94. package/skills/ai-research/index/5-run.md +11 -11
  95. package/skills/ai-research/index/6-write.md +23 -23
  96. package/skills/ai-research/library.json +104 -104
  97. package/skills/analyze-app/SKILL.md +17 -12
  98. package/skills/design-contract/SKILL.md +42 -7
  99. package/skills/design-contract/data-views.md +2 -2
  100. package/skills/design-library/EVALS.md +1 -1
  101. package/skills/design-library/INDEX.md +39 -39
  102. package/skills/design-library/SKILL.md +19 -13
  103. package/skills/design-library/SOURCE +45 -43
  104. package/skills/feature-audit/SKILL.md +20 -14
  105. package/skills/hallmark/LICENSE +21 -0
  106. package/skills/hallmark/SKILL.md +154 -0
  107. package/skills/hallmark/SOURCE +207 -0
  108. package/skills/hallmark/agents/openai.yaml +13 -0
  109. package/skills/hallmark/references/anatomy.md +71 -0
  110. package/skills/hallmark/references/brand-truth.md +40 -0
  111. package/skills/hallmark/references/comp.md +104 -0
  112. package/skills/hallmark/references/craft.md +116 -0
  113. package/skills/hallmark/references/dark-mode.md +49 -0
  114. package/skills/hallmark/references/data-viz.md +48 -0
  115. package/skills/hallmark/references/design-md.md +53 -0
  116. package/skills/hallmark/references/direction.md +52 -0
  117. package/skills/hallmark/references/export-formats.md +80 -0
  118. package/skills/hallmark/references/flow.md +131 -0
  119. package/skills/hallmark/references/fonts.md +58 -0
  120. package/skills/hallmark/references/gates.md +243 -0
  121. package/skills/hallmark/references/genres/atmospheric.md +24 -0
  122. package/skills/hallmark/references/genres/editorial.md +24 -0
  123. package/skills/hallmark/references/genres/modern-minimal.md +24 -0
  124. package/skills/hallmark/references/genres/playful.md +24 -0
  125. package/skills/hallmark/references/imagery.md +99 -0
  126. package/skills/hallmark/references/interaction-and-states.md +89 -0
  127. package/skills/hallmark/references/layout.md +104 -0
  128. package/skills/hallmark/references/macrostructures/01-bento-grid.md +21 -0
  129. package/skills/hallmark/references/macrostructures/02-long-document.md +35 -0
  130. package/skills/hallmark/references/macrostructures/03-marquee-hero.md +21 -0
  131. package/skills/hallmark/references/macrostructures/04-stat-led.md +21 -0
  132. package/skills/hallmark/references/macrostructures/05-workbench.md +21 -0
  133. package/skills/hallmark/references/macrostructures/06-conversational-faq.md +28 -0
  134. package/skills/hallmark/references/macrostructures/07-manifesto.md +28 -0
  135. package/skills/hallmark/references/macrostructures/08-photographic.md +21 -0
  136. package/skills/hallmark/references/macrostructures/09-quote-led.md +21 -0
  137. package/skills/hallmark/references/macrostructures/10-specimen.md +21 -0
  138. package/skills/hallmark/references/macrostructures/11-catalogue.md +21 -0
  139. package/skills/hallmark/references/macrostructures/12-letter.md +21 -0
  140. package/skills/hallmark/references/macrostructures/13-index-first.md +21 -0
  141. package/skills/hallmark/references/macrostructures/14-narrative-workflow.md +21 -0
  142. package/skills/hallmark/references/macrostructures/15-split-studio.md +21 -0
  143. package/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
  144. package/skills/hallmark/references/macrostructures/17-type-specimen.md +19 -0
  145. package/skills/hallmark/references/macrostructures/18-portfolio-grid.md +21 -0
  146. package/skills/hallmark/references/macrostructures/19-map-diagram.md +21 -0
  147. package/skills/hallmark/references/macrostructures/20-ecosystem-index.md +19 -0
  148. package/skills/hallmark/references/macrostructures/21-component-playground.md +21 -0
  149. package/skills/hallmark/references/macrostructures.md +119 -0
  150. package/skills/hallmark/references/microinteractions.md +80 -0
  151. package/skills/hallmark/references/patterns.md +202 -0
  152. package/skills/hallmark/references/redesign.md +88 -0
  153. package/skills/hallmark/references/responsive.md +46 -0
  154. package/skills/hallmark/references/review-finish.md +19 -0
  155. package/skills/hallmark/references/review-hero.md +20 -0
  156. package/skills/hallmark/references/scroll-choreography.md +110 -0
  157. package/skills/hallmark/references/texture.md +90 -0
  158. package/skills/hallmark/references/themes/README.md +58 -0
  159. package/skills/hallmark/references/themes/almanac.jpg +0 -0
  160. package/skills/hallmark/references/themes/almanac.md +103 -0
  161. package/skills/hallmark/references/themes/arcade.jpg +0 -0
  162. package/skills/hallmark/references/themes/arcade.md +102 -0
  163. package/skills/hallmark/references/themes/atelier.jpg +0 -0
  164. package/skills/hallmark/references/themes/atelier.md +98 -0
  165. package/skills/hallmark/references/themes/bloom.jpg +0 -0
  166. package/skills/hallmark/references/themes/bloom.md +102 -0
  167. package/skills/hallmark/references/themes/blueprint.jpg +0 -0
  168. package/skills/hallmark/references/themes/blueprint.md +103 -0
  169. package/skills/hallmark/references/themes/broadside.jpg +0 -0
  170. package/skills/hallmark/references/themes/broadside.md +108 -0
  171. package/skills/hallmark/references/themes/brutal.jpg +0 -0
  172. package/skills/hallmark/references/themes/brutal.md +95 -0
  173. package/skills/hallmark/references/themes/carnival.jpg +0 -0
  174. package/skills/hallmark/references/themes/carnival.md +104 -0
  175. package/skills/hallmark/references/themes/cobalt.jpg +0 -0
  176. package/skills/hallmark/references/themes/cobalt.md +101 -0
  177. package/skills/hallmark/references/themes/console.jpg +0 -0
  178. package/skills/hallmark/references/themes/console.md +99 -0
  179. package/skills/hallmark/references/themes/coral.jpg +0 -0
  180. package/skills/hallmark/references/themes/coral.md +102 -0
  181. package/skills/hallmark/references/themes/darkroom.jpg +0 -0
  182. package/skills/hallmark/references/themes/darkroom.md +99 -0
  183. package/skills/hallmark/references/themes/dose.jpg +0 -0
  184. package/skills/hallmark/references/themes/dose.md +98 -0
  185. package/skills/hallmark/references/themes/dusk.jpg +0 -0
  186. package/skills/hallmark/references/themes/dusk.md +105 -0
  187. package/skills/hallmark/references/themes/editorial.jpg +0 -0
  188. package/skills/hallmark/references/themes/editorial.md +97 -0
  189. package/skills/hallmark/references/themes/formwork.jpg +0 -0
  190. package/skills/hallmark/references/themes/formwork.md +107 -0
  191. package/skills/hallmark/references/themes/furrow.jpg +0 -0
  192. package/skills/hallmark/references/themes/furrow.md +98 -0
  193. package/skills/hallmark/references/themes/garden.jpg +0 -0
  194. package/skills/hallmark/references/themes/garden.md +97 -0
  195. package/skills/hallmark/references/themes/grid.jpg +0 -0
  196. package/skills/hallmark/references/themes/grid.md +101 -0
  197. package/skills/hallmark/references/themes/halftone.jpg +0 -0
  198. package/skills/hallmark/references/themes/halftone.md +106 -0
  199. package/skills/hallmark/references/themes/hedgerow.jpg +0 -0
  200. package/skills/hallmark/references/themes/hedgerow.md +104 -0
  201. package/skills/hallmark/references/themes/hum.jpg +0 -0
  202. package/skills/hallmark/references/themes/hum.md +99 -0
  203. package/skills/hallmark/references/themes/index.json +2191 -0
  204. package/skills/hallmark/references/themes/ink.jpg +0 -0
  205. package/skills/hallmark/references/themes/ink.md +106 -0
  206. package/skills/hallmark/references/themes/kiln.jpg +0 -0
  207. package/skills/hallmark/references/themes/kiln.md +108 -0
  208. package/skills/hallmark/references/themes/loom.jpg +0 -0
  209. package/skills/hallmark/references/themes/loom.md +106 -0
  210. package/skills/hallmark/references/themes/lumen.jpg +0 -0
  211. package/skills/hallmark/references/themes/lumen.md +103 -0
  212. package/skills/hallmark/references/themes/manifesto.jpg +0 -0
  213. package/skills/hallmark/references/themes/manifesto.md +101 -0
  214. package/skills/hallmark/references/themes/midnight.jpg +0 -0
  215. package/skills/hallmark/references/themes/midnight.md +97 -0
  216. package/skills/hallmark/references/themes/newsprint.jpg +0 -0
  217. package/skills/hallmark/references/themes/newsprint.md +102 -0
  218. package/skills/hallmark/references/themes/overprint.jpg +0 -0
  219. package/skills/hallmark/references/themes/overprint.md +101 -0
  220. package/skills/hallmark/references/themes/pasteup.jpg +0 -0
  221. package/skills/hallmark/references/themes/pasteup.md +100 -0
  222. package/skills/hallmark/references/themes/piste.jpg +0 -0
  223. package/skills/hallmark/references/themes/piste.md +99 -0
  224. package/skills/hallmark/references/themes/ribbon.jpg +0 -0
  225. package/skills/hallmark/references/themes/ribbon.md +106 -0
  226. package/skills/hallmark/references/themes/rim.jpg +0 -0
  227. package/skills/hallmark/references/themes/rim.md +96 -0
  228. package/skills/hallmark/references/themes/riso.jpg +0 -0
  229. package/skills/hallmark/references/themes/riso.md +98 -0
  230. package/skills/hallmark/references/themes/solstice.jpg +0 -0
  231. package/skills/hallmark/references/themes/solstice.md +104 -0
  232. package/skills/hallmark/references/themes/specimen.jpg +0 -0
  233. package/skills/hallmark/references/themes/specimen.md +100 -0
  234. package/skills/hallmark/references/themes/spore.jpg +0 -0
  235. package/skills/hallmark/references/themes/spore.md +104 -0
  236. package/skills/hallmark/references/themes/sport.jpg +0 -0
  237. package/skills/hallmark/references/themes/sport.md +101 -0
  238. package/skills/hallmark/references/themes/squeeze.jpg +0 -0
  239. package/skills/hallmark/references/themes/squeeze.md +99 -0
  240. package/skills/hallmark/references/themes/sticker.jpg +0 -0
  241. package/skills/hallmark/references/themes/sticker.md +106 -0
  242. package/skills/hallmark/references/themes/studio.jpg +0 -0
  243. package/skills/hallmark/references/themes/studio.md +99 -0
  244. package/skills/hallmark/references/themes/terminal.jpg +0 -0
  245. package/skills/hallmark/references/themes/terminal.md +96 -0
  246. package/skills/hallmark/references/themes/terrazzo.jpg +0 -0
  247. package/skills/hallmark/references/themes/terrazzo.md +106 -0
  248. package/skills/hallmark/references/themes/ultraviolet.jpg +0 -0
  249. package/skills/hallmark/references/themes/ultraviolet.md +106 -0
  250. package/skills/hallmark/references/themes/vellum.jpg +0 -0
  251. package/skills/hallmark/references/themes/vellum.md +105 -0
  252. package/skills/hallmark/references/themes/wayfind.jpg +0 -0
  253. package/skills/hallmark/references/themes/wayfind.md +105 -0
  254. package/skills/hallmark/references/themes/werkstatt.jpg +0 -0
  255. package/skills/hallmark/references/themes/werkstatt.md +105 -0
  256. package/skills/hallmark/scripts/capture.mjs +125 -0
  257. package/skills/hallmark/scripts/fixtures/exemplars/atmospheric.html +324 -0
  258. package/skills/hallmark/scripts/fixtures/exemplars/editorial.html +363 -0
  259. package/skills/hallmark/scripts/fixtures/exemplars/modern-minimal.html +527 -0
  260. package/skills/hallmark/scripts/fixtures/exemplars/playful.html +353 -0
  261. package/skills/hallmark/scripts/fixtures/eyebrow-fail/index.html +118 -0
  262. package/skills/hallmark/scripts/fixtures/eyebrow-pass/index.html +137 -0
  263. package/skills/hallmark/scripts/fixtures/kept/after.html +27 -0
  264. package/skills/hallmark/scripts/fixtures/kept/before.html +26 -0
  265. package/skills/hallmark/scripts/fixtures/slopped.html +145 -0
  266. package/skills/hallmark/scripts/fixtures/tailwind-fail/Feature.vue +14 -0
  267. package/skills/hallmark/scripts/fixtures/tailwind-fail/Hero.tsx +33 -0
  268. package/skills/hallmark/scripts/fixtures/tailwind-fail/index.html +74 -0
  269. package/skills/hallmark/scripts/fixtures/tailwind-fail/style.css +6 -0
  270. package/skills/hallmark/scripts/fixtures/tailwind-pass/Hero.tsx +33 -0
  271. package/skills/hallmark/scripts/fixtures/tailwind-pass/index.html +57 -0
  272. package/skills/hallmark/scripts/fixtures/tailwind-pass/style.css +15 -0
  273. package/skills/hallmark/scripts/fixtures/waiver/index.html +54 -0
  274. package/skills/hallmark/scripts/imagegen.mjs +85 -0
  275. package/skills/hallmark/scripts/install-hook.mjs +70 -0
  276. package/skills/hallmark/scripts/install.mjs +141 -0
  277. package/skills/hallmark/scripts/lint-hook.mjs +49 -0
  278. package/skills/hallmark/scripts/photos.json +1 -0
  279. package/skills/hallmark/scripts/picture.mjs +71 -0
  280. package/skills/hallmark/scripts/refcheck.mjs +352 -0
  281. package/skills/hallmark/scripts/sloplint-render.mjs +1252 -0
  282. package/skills/hallmark/scripts/sloplint.mjs +4422 -0
  283. package/skills/hallmark/scripts/theme.mjs +650 -0
  284. package/skills/harness/SKILL.md +17 -8
  285. package/skills/i-have-adhd/SKILL.md +32 -12
  286. package/skills/no-ai-slop/SKILL.md +15 -1
  287. package/skills/plan-add/SKILL.md +38 -27
  288. package/skills/plan-status/SKILL.md +13 -7
  289. package/skills/plan-sync/SKILL.md +18 -12
  290. package/skills/pm-frameworks/SKILL.md +19 -10
  291. package/skills/pm-frameworks/SOURCE +7 -5
  292. package/skills/ponytail/SKILL.md +19 -14
  293. package/skills/product-analysis/SKILL.md +22 -18
  294. package/skills/product-flow/SKILL.md +14 -9
  295. package/skills/research/SKILL.md +97 -48
  296. package/skills/rl-env/SKILL.md +25 -13
  297. package/skills/rl-env/SOURCE +8 -6
  298. package/skills/tezgah-contract/SKILL.md +65 -47
  299. package/statusline.py +20 -9
  300. package/workflows/graph-review.js +14 -2
  301. package/bin/tezgah-skill.py +0 -59
  302. /package/skills/ai-research/0-autoresearch-skill/{SKILL.md → ENTRY.md} +0 -0
  303. /package/skills/ai-research/01-model-architecture/litgpt/{SKILL.md → ENTRY.md} +0 -0
  304. /package/skills/ai-research/01-model-architecture/mamba/{SKILL.md → ENTRY.md} +0 -0
  305. /package/skills/ai-research/01-model-architecture/nanogpt/{SKILL.md → ENTRY.md} +0 -0
  306. /package/skills/ai-research/01-model-architecture/rwkv/{SKILL.md → ENTRY.md} +0 -0
  307. /package/skills/ai-research/01-model-architecture/torchtitan/{SKILL.md → ENTRY.md} +0 -0
  308. /package/skills/ai-research/02-tokenization/huggingface-tokenizers/{SKILL.md → ENTRY.md} +0 -0
  309. /package/skills/ai-research/02-tokenization/sentencepiece/{SKILL.md → ENTRY.md} +0 -0
  310. /package/skills/ai-research/03-fine-tuning/axolotl/{SKILL.md → ENTRY.md} +0 -0
  311. /package/skills/ai-research/03-fine-tuning/llama-factory/{SKILL.md → ENTRY.md} +0 -0
  312. /package/skills/ai-research/03-fine-tuning/peft/{SKILL.md → ENTRY.md} +0 -0
  313. /package/skills/ai-research/03-fine-tuning/unsloth/{SKILL.md → ENTRY.md} +0 -0
  314. /package/skills/ai-research/04-mechanistic-interpretability/nnsight/{SKILL.md → ENTRY.md} +0 -0
  315. /package/skills/ai-research/04-mechanistic-interpretability/pyvene/{SKILL.md → ENTRY.md} +0 -0
  316. /package/skills/ai-research/04-mechanistic-interpretability/saelens/{SKILL.md → ENTRY.md} +0 -0
  317. /package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/{SKILL.md → ENTRY.md} +0 -0
  318. /package/skills/ai-research/05-data-processing/nemo-curator/{SKILL.md → ENTRY.md} +0 -0
  319. /package/skills/ai-research/05-data-processing/ray-data/{SKILL.md → ENTRY.md} +0 -0
  320. /package/skills/ai-research/06-post-training/grpo-rl-training/{SKILL.md → ENTRY.md} +0 -0
  321. /package/skills/ai-research/06-post-training/miles/{SKILL.md → ENTRY.md} +0 -0
  322. /package/skills/ai-research/06-post-training/openrlhf/{SKILL.md → ENTRY.md} +0 -0
  323. /package/skills/ai-research/06-post-training/simpo/{SKILL.md → ENTRY.md} +0 -0
  324. /package/skills/ai-research/06-post-training/slime/{SKILL.md → ENTRY.md} +0 -0
  325. /package/skills/ai-research/06-post-training/torchforge/{SKILL.md → ENTRY.md} +0 -0
  326. /package/skills/ai-research/06-post-training/trl-fine-tuning/{SKILL.md → ENTRY.md} +0 -0
  327. /package/skills/ai-research/06-post-training/verl/{SKILL.md → ENTRY.md} +0 -0
  328. /package/skills/ai-research/07-safety-alignment/constitutional-ai/{SKILL.md → ENTRY.md} +0 -0
  329. /package/skills/ai-research/07-safety-alignment/llamaguard/{SKILL.md → ENTRY.md} +0 -0
  330. /package/skills/ai-research/07-safety-alignment/nemo-guardrails/{SKILL.md → ENTRY.md} +0 -0
  331. /package/skills/ai-research/07-safety-alignment/prompt-guard/{SKILL.md → ENTRY.md} +0 -0
  332. /package/skills/ai-research/08-distributed-training/accelerate/{SKILL.md → ENTRY.md} +0 -0
  333. /package/skills/ai-research/08-distributed-training/deepspeed/{SKILL.md → ENTRY.md} +0 -0
  334. /package/skills/ai-research/08-distributed-training/megatron-core/{SKILL.md → ENTRY.md} +0 -0
  335. /package/skills/ai-research/08-distributed-training/pytorch-fsdp2/{SKILL.md → ENTRY.md} +0 -0
  336. /package/skills/ai-research/08-distributed-training/pytorch-lightning/{SKILL.md → ENTRY.md} +0 -0
  337. /package/skills/ai-research/08-distributed-training/ray-train/{SKILL.md → ENTRY.md} +0 -0
  338. /package/skills/ai-research/09-infrastructure/lambda-labs/{SKILL.md → ENTRY.md} +0 -0
  339. /package/skills/ai-research/09-infrastructure/modal/{SKILL.md → ENTRY.md} +0 -0
  340. /package/skills/ai-research/09-infrastructure/skypilot/{SKILL.md → ENTRY.md} +0 -0
  341. /package/skills/ai-research/10-optimization/awq/{SKILL.md → ENTRY.md} +0 -0
  342. /package/skills/ai-research/10-optimization/bitsandbytes/{SKILL.md → ENTRY.md} +0 -0
  343. /package/skills/ai-research/10-optimization/flash-attention/{SKILL.md → ENTRY.md} +0 -0
  344. /package/skills/ai-research/10-optimization/gguf/{SKILL.md → ENTRY.md} +0 -0
  345. /package/skills/ai-research/10-optimization/gptq/{SKILL.md → ENTRY.md} +0 -0
  346. /package/skills/ai-research/10-optimization/hqq/{SKILL.md → ENTRY.md} +0 -0
  347. /package/skills/ai-research/10-optimization/ml-training-recipes/{SKILL.md → ENTRY.md} +0 -0
  348. /package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/{SKILL.md → ENTRY.md} +0 -0
  349. /package/skills/ai-research/11-evaluation/lm-evaluation-harness/{SKILL.md → ENTRY.md} +0 -0
  350. /package/skills/ai-research/11-evaluation/nemo-evaluator/{SKILL.md → ENTRY.md} +0 -0
  351. /package/skills/ai-research/12-inference-serving/llama-cpp/{SKILL.md → ENTRY.md} +0 -0
  352. /package/skills/ai-research/12-inference-serving/sglang/{SKILL.md → ENTRY.md} +0 -0
  353. /package/skills/ai-research/12-inference-serving/tensorrt-llm/{SKILL.md → ENTRY.md} +0 -0
  354. /package/skills/ai-research/12-inference-serving/vllm/{SKILL.md → ENTRY.md} +0 -0
  355. /package/skills/ai-research/13-mlops/mlflow/{SKILL.md → ENTRY.md} +0 -0
  356. /package/skills/ai-research/13-mlops/swanlab/{SKILL.md → ENTRY.md} +0 -0
  357. /package/skills/ai-research/13-mlops/tensorboard/{SKILL.md → ENTRY.md} +0 -0
  358. /package/skills/ai-research/13-mlops/weights-and-biases/{SKILL.md → ENTRY.md} +0 -0
  359. /package/skills/ai-research/14-agents/a-evolve/{SKILL.md → ENTRY.md} +0 -0
  360. /package/skills/ai-research/14-agents/autogpt/{SKILL.md → ENTRY.md} +0 -0
  361. /package/skills/ai-research/14-agents/crewai/{SKILL.md → ENTRY.md} +0 -0
  362. /package/skills/ai-research/14-agents/langchain/{SKILL.md → ENTRY.md} +0 -0
  363. /package/skills/ai-research/14-agents/llamaindex/{SKILL.md → ENTRY.md} +0 -0
  364. /package/skills/ai-research/15-rag/chroma/{SKILL.md → ENTRY.md} +0 -0
  365. /package/skills/ai-research/15-rag/faiss/{SKILL.md → ENTRY.md} +0 -0
  366. /package/skills/ai-research/15-rag/pinecone/{SKILL.md → ENTRY.md} +0 -0
  367. /package/skills/ai-research/15-rag/qdrant/{SKILL.md → ENTRY.md} +0 -0
  368. /package/skills/ai-research/15-rag/sentence-transformers/{SKILL.md → ENTRY.md} +0 -0
  369. /package/skills/ai-research/16-prompt-engineering/dspy/{SKILL.md → ENTRY.md} +0 -0
  370. /package/skills/ai-research/16-prompt-engineering/guidance/{SKILL.md → ENTRY.md} +0 -0
  371. /package/skills/ai-research/16-prompt-engineering/instructor/{SKILL.md → ENTRY.md} +0 -0
  372. /package/skills/ai-research/16-prompt-engineering/outlines/{SKILL.md → ENTRY.md} +0 -0
  373. /package/skills/ai-research/17-observability/langsmith/{SKILL.md → ENTRY.md} +0 -0
  374. /package/skills/ai-research/17-observability/phoenix/{SKILL.md → ENTRY.md} +0 -0
  375. /package/skills/ai-research/18-multimodal/audiocraft/{SKILL.md → ENTRY.md} +0 -0
  376. /package/skills/ai-research/18-multimodal/blip-2/{SKILL.md → ENTRY.md} +0 -0
  377. /package/skills/ai-research/18-multimodal/clip/{SKILL.md → ENTRY.md} +0 -0
  378. /package/skills/ai-research/18-multimodal/cosmos-policy/{SKILL.md → ENTRY.md} +0 -0
  379. /package/skills/ai-research/18-multimodal/llava/{SKILL.md → ENTRY.md} +0 -0
  380. /package/skills/ai-research/18-multimodal/openpi/{SKILL.md → ENTRY.md} +0 -0
  381. /package/skills/ai-research/18-multimodal/openvla-oft/{SKILL.md → ENTRY.md} +0 -0
  382. /package/skills/ai-research/18-multimodal/segment-anything/{SKILL.md → ENTRY.md} +0 -0
  383. /package/skills/ai-research/18-multimodal/stable-diffusion/{SKILL.md → ENTRY.md} +0 -0
  384. /package/skills/ai-research/18-multimodal/whisper/{SKILL.md → ENTRY.md} +0 -0
  385. /package/skills/ai-research/19-emerging-techniques/knowledge-distillation/{SKILL.md → ENTRY.md} +0 -0
  386. /package/skills/ai-research/19-emerging-techniques/long-context/{SKILL.md → ENTRY.md} +0 -0
  387. /package/skills/ai-research/19-emerging-techniques/model-merging/{SKILL.md → ENTRY.md} +0 -0
  388. /package/skills/ai-research/19-emerging-techniques/model-pruning/{SKILL.md → ENTRY.md} +0 -0
  389. /package/skills/ai-research/19-emerging-techniques/moe-training/{SKILL.md → ENTRY.md} +0 -0
  390. /package/skills/ai-research/19-emerging-techniques/speculative-decoding/{SKILL.md → ENTRY.md} +0 -0
  391. /package/skills/ai-research/20-ml-paper-writing/academic-plotting/{SKILL.md → ENTRY.md} +0 -0
  392. /package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/{SKILL.md → ENTRY.md} +0 -0
  393. /package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/{SKILL.md → ENTRY.md} +0 -0
  394. /package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/{SKILL.md → ENTRY.md} +0 -0
  395. /package/skills/ai-research/21-research-ideation/brainstorming-research-ideas/{SKILL.md → ENTRY.md} +0 -0
  396. /package/skills/ai-research/21-research-ideation/creative-thinking-for-research/{SKILL.md → ENTRY.md} +0 -0
  397. /package/skills/ai-research/22-agent-native-research-artifact/compiler/{SKILL.md → ENTRY.md} +0 -0
  398. /package/skills/ai-research/22-agent-native-research-artifact/research-manager/{SKILL.md → ENTRY.md} +0 -0
  399. /package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/{SKILL.md → ENTRY.md} +0 -0
  400. /package/skills/design-library/adaptive-interfaces/skills/colour-independence/{SKILL.md → ENTRY.md} +0 -0
  401. /package/skills/design-library/adaptive-interfaces/skills/flexible-typography/{SKILL.md → ENTRY.md} +0 -0
  402. /package/skills/design-library/adaptive-interfaces/skills/information-density/{SKILL.md → ENTRY.md} +0 -0
  403. /package/skills/design-library/adaptive-interfaces/skills/preference-audit/{SKILL.md → ENTRY.md} +0 -0
  404. /package/skills/design-library/adaptive-interfaces/skills/responsive-accessibility/{SKILL.md → ENTRY.md} +0 -0
  405. /package/skills/design-library/adaptive-interfaces/skills/responsive-review/{SKILL.md → ENTRY.md} +0 -0
  406. /package/skills/design-library/adaptive-interfaces/skills/simplified-views/{SKILL.md → ENTRY.md} +0 -0
  407. /package/skills/design-library/adaptive-interfaces/skills/specify/{SKILL.md → ENTRY.md} +0 -0
  408. /package/skills/design-library/adaptive-interfaces/skills/user-preference-respect/{SKILL.md → ENTRY.md} +0 -0
  409. /package/skills/design-library/cognitive-accessibility/skills/adaptive-personalisation/{SKILL.md → ENTRY.md} +0 -0
  410. /package/skills/design-library/cognitive-accessibility/skills/assess-load/{SKILL.md → ENTRY.md} +0 -0
  411. /package/skills/design-library/cognitive-accessibility/skills/cognitive-load-assessment/{SKILL.md → ENTRY.md} +0 -0
  412. /package/skills/design-library/cognitive-accessibility/skills/contextual-help-design/{SKILL.md → ENTRY.md} +0 -0
  413. /package/skills/design-library/cognitive-accessibility/skills/error-prevention-recovery/{SKILL.md → ENTRY.md} +0 -0
  414. /package/skills/design-library/cognitive-accessibility/skills/focus-attention-design/{SKILL.md → ENTRY.md} +0 -0
  415. /package/skills/design-library/cognitive-accessibility/skills/memory-load-reduction/{SKILL.md → ENTRY.md} +0 -0
  416. /package/skills/design-library/cognitive-accessibility/skills/plain-language-design/{SKILL.md → ENTRY.md} +0 -0
  417. /package/skills/design-library/cognitive-accessibility/skills/review/{SKILL.md → ENTRY.md} +0 -0
  418. /package/skills/design-library/cognitive-accessibility/skills/simplify/{SKILL.md → ENTRY.md} +0 -0
  419. /package/skills/design-library/cognitive-accessibility/skills/wayfinding-navigation/{SKILL.md → ENTRY.md} +0 -0
  420. /package/skills/design-library/design-research/skills/behavioural-analytics/{SKILL.md → ENTRY.md} +0 -0
  421. /package/skills/design-library/design-research/skills/qual-quant-triangulation/{SKILL.md → ENTRY.md} +0 -0
  422. /package/skills/design-library/inclusive-interaction/skills/audit/{SKILL.md → ENTRY.md} +0 -0
  423. /package/skills/design-library/inclusive-interaction/skills/design-flow/{SKILL.md → ENTRY.md} +0 -0
  424. /package/skills/design-library/inclusive-interaction/skills/feedback-and-status/{SKILL.md → ENTRY.md} +0 -0
  425. /package/skills/design-library/inclusive-interaction/skills/gesture-alternatives/{SKILL.md → ENTRY.md} +0 -0
  426. /package/skills/design-library/inclusive-interaction/skills/keyboard-navigation/{SKILL.md → ENTRY.md} +0 -0
  427. /package/skills/design-library/inclusive-interaction/skills/keyboard-review/{SKILL.md → ENTRY.md} +0 -0
  428. /package/skills/design-library/inclusive-interaction/skills/motion-sensitivity/{SKILL.md → ENTRY.md} +0 -0
  429. /package/skills/design-library/inclusive-interaction/skills/multi-modal-input/{SKILL.md → ENTRY.md} +0 -0
  430. /package/skills/design-library/inclusive-interaction/skills/touch-target-design/{SKILL.md → ENTRY.md} +0 -0
  431. /package/skills/design-library/inclusive-interaction/skills/voice-interaction/{SKILL.md → ENTRY.md} +0 -0
  432. /package/skills/design-library/visual-critique/skills/critique-affordance/{SKILL.md → ENTRY.md} +0 -0
  433. /package/skills/design-library/visual-critique/skills/critique-brand-consistency/{SKILL.md → ENTRY.md} +0 -0
  434. /package/skills/design-library/visual-critique/skills/critique-color/{SKILL.md → ENTRY.md} +0 -0
  435. /package/skills/design-library/visual-critique/skills/critique-composition/{SKILL.md → ENTRY.md} +0 -0
  436. /package/skills/design-library/visual-critique/skills/critique-information-density/{SKILL.md → ENTRY.md} +0 -0
  437. /package/skills/design-library/visual-critique/skills/critique-typography/{SKILL.md → ENTRY.md} +0 -0
  438. /package/skills/design-library/visual-critique/skills/critique-visual-hierarchy/{SKILL.md → ENTRY.md} +0 -0
  439. /package/skills/pm-frameworks/intended-vs-implemented/{SKILL.md → ENTRY.md} +0 -0
  440. /package/skills/pm-frameworks/opportunity-solution-tree/{SKILL.md → ENTRY.md} +0 -0
  441. /package/skills/rl-env/generate-nemo-gym-env/{SKILL.md → ENTRY.md} +0 -0
  442. /package/skills/rl-env/generate-openenv-env/{SKILL.md → ENTRY.md} +0 -0
  443. /package/skills/rl-env/generate-ors-env/{SKILL.md → ENTRY.md} +0 -0
  444. /package/skills/rl-env/generate-verifiers-env/{SKILL.md → ENTRY.md} +0 -0
  445. /package/skills/rl-env/rl-env-from-description/{SKILL.md → ENTRY.md} +0 -0
package/docs/skills.md CHANGED
@@ -11,11 +11,30 @@ install step that links them. The always-on rule text a session is told is
11
11
  A skill is `skills/<name>/SKILL.md`: YAML frontmatter carrying `name` and
12
12
  `description`, then a markdown body. The body is instructions for the model - the
13
13
  read tool opens it, nothing executes it. `plan-add` and `ponytail` also declare
14
- `argument-hint` in that frontmatter (`skills/plan-add/SKILL.md:11`,
15
- `skills/ponytail/SKILL.md:16`), and Claude exposes each skill as
14
+ `argument-hint` in that frontmatter (`skills/plan-add/SKILL.md:7`,
15
+ `skills/ponytail/SKILL.md:6`), and Claude exposes each skill as
16
16
  `/tezgah:<name>` - a bare `/plan-add` is a command that does not exist
17
17
  (`tests/test_skills.py::SkillStandards.test_slash_commands_carry_the_prefix_the_plugin_registers`).
18
18
 
19
+ Every host shows the `description`, and hosts cut it.
20
+ The omp host keeps about twelve words.
21
+ Codex and Claude drop descriptions once the skill list passes their budget. So a shipped description opens with `Use when`, names its
22
+ English and Turkish triggers, and stays within 160 characters
23
+ (`tests/test_skills.py::DESCRIPTION_CAP`).
24
+ The routing word `tests/routing-fixtures.md` pins for the skill sits in its first
25
+ 100 characters (`tests/test_skills.py::DESCRIPTION_KEPT`).
26
+ The longer text a description used to carry opens the body, under `## When to use`.
27
+ A skill body that calls a tezgah CLI writes its installed path,
28
+ `~/.config/tezgah/bin/<cmd>`: no host but Claude puts that directory on PATH.
29
+
30
+ A vendored library entry nested under a skill is `ENTRY.md`, not `SKILL.md`.
31
+ Codex and Cursor list every `SKILL.md` below a skills directory, nested ones
32
+ included. There are 144 vendored entries: 98 in `ai-research`, 39 in
33
+ `design-library`, 5 in `rl-env` and 2 in `pm-frameworks`.
34
+ Those hosts listed each one as a skill, which pushed codex past its skills budget. Each keeps its bytes and upstream path under the new
35
+ name, and `bin/tezgah-import-ai-research` writes `ENTRY.md` on a re-vendor
36
+ (`bin/tezgah-import-ai-research::vendored`).
37
+
19
38
  Two neighbours are not skills. A **slash command** is a file under `commands/`
20
39
  wired only through the Claude plugin channel - `commands/ponytail.md` and
21
40
  `commands/adhd.md` are shells over `tezgah-pony` and `tezgah-adhd`, and no other
@@ -67,8 +86,11 @@ A line is cut at 140 characters with a trailing `...`; a description with no
67
86
  trigger sentence keeps its first sentence.
68
87
 
69
88
  The on-demand file also carries a **collision table**: the pairs among tezgah's
70
- own skills whose descriptions share three or more subject words, computed from
71
- the router lines themselves (`skill_collisions()`, `bin/tezgah-setup::skill_collisions`).
89
+ own skills whose `## When to use` trigger lines share three or more subject words
90
+ (`skill_collisions()`, `bin/tezgah-setup::skill_collisions`).
91
+ `skill_when_line()` reads that line from the body (`bin/tezgah-setup::skill_when_line`).
92
+ The short bilingual description shares too few words for two near-neighbours to pair.
93
+ The longer `## When to use` text still tells them apart.
72
94
  It rides `opencode-skills.full.md` and never the always-on file, because it is
73
95
  read when a session is about to choose, not every turn. It is a view, not a
74
96
  rename: it names `plan-add` / `plan-status` / `plan-sync` and
@@ -124,9 +146,37 @@ CLI into `~/.config/tezgah/bin` beside the other tezgah commands.
124
146
  On a turn the judgement does not answer, the same search runs on its own,
125
147
  default on and with no model (`hooks/tezgah_skill_pick.py::section_hint`). It
126
148
  keeps its index as SQLite in the tezgah cache dir (`skill-search.sqlite`). It
127
- rebuilds that index only when a SKILL.md's mtime or size moves
128
- (`hooks/tezgah_skill_pick.py::_open_index`). A prompt reads its own terms'
129
- postings and the length column, never the corpus.
149
+ rebuilds that index only when a SKILL.md's mtime or size moves, or when an older
150
+ `INDEX_VERSION` wrote the index
151
+ (`hooks/tezgah_skill_pick.py::_open_index`, `hooks/tezgah_skill_pick.py::INDEX_VERSION`).
152
+ A prompt reads its own terms' postings and the length column, never the corpus.
153
+
154
+ The hint reads the project's skills from the session's cwd (`section_hint(..., cwd=)`).
155
+ `project_roots()` finds the nearest `.git` top and takes its `.claude/skills`,
156
+ `.agents/skills` and `skills/` directories (`hooks/tezgah_skill_pick.py::project_roots`).
157
+ A project that ships its own skills gets its own index file,
158
+ `skill-search-<hash>.sqlite`.
159
+ Two sessions in two such projects then do not rebuild each other's index on every turn.
160
+
161
+ Ranking runs in two tiers (`hooks/tezgah_skill_pick.py::search`).
162
+ tezgah's own skills and the project's rank first.
163
+ The hosts' machine-wide directories (omp's, Claude's, `~/.agents`, Codex's,
164
+ opencode's) answer only when the first tier cannot (`hooks/tezgah_skill_pick.py::_second_tier`).
165
+ Before the split, 16 of 54 live hints in one transcript set pointed at cyber skills.
166
+ In another set, 3 of 7 pointed at marketing skills. Both sets came from product repositories.
167
+ The search covers `tezgah-contract`, but the hint never names it (`hooks/tezgah_skill_pick.py::HINT_SKIP`).
168
+ Replayed over 1331 owner prompts, it still took 76 of 123 hints.
169
+
170
+ A skill's frontmatter description rides its first section twice
171
+ (`hooks/tezgah_skill_pick.py::DESC_WEIGHT`).
172
+ On the 18 English owner prompts of the adoption set, top-1 moved from 10 to 16.
173
+ Every term folds Turkish letters to ASCII on both sides (`ç ğ ö ş ü` to `c g o s u`).
174
+ A word longer than five letters also indexes its five-letter prefix
175
+ (`hooks/tezgah_skill_pick.py::STEM`, `hooks/tezgah_skill_pick.py::terms`).
176
+ A Turkish word carries case and possessive in suffixes, so "tasarımını" meets
177
+ "tasarım" only through the prefix. Before folding, the Turkish hint matched 0 of 18 prompts.
178
+ The full word stays a term too, so an exact match outscores a prefix-only one.
179
+ A link is an address, not a topic: the hint drops URLs from the prompt before ranking.
130
180
 
131
181
  Some skills route through their own `INDEX.md`, like design-library's 39 entries.
132
182
  The search indexes each routed entry as one row for the whole file, addressed
@@ -136,10 +186,33 @@ common words.
136
186
 
137
187
  The hook then appends one line, `A local skill search matched this request:
138
188
  skill://<name>:<start>-<end>`, with the section title. Every host but omp also
139
- gets the absolute path. The top section must carry 60% of the prompt's
189
+ gets the absolute path. Claude's manifest declares `TEZGAH_HOST=claude`.
190
+ There the line names a plugin skill by the Skill tool's `tezgah:<name>`, with
191
+ the file's line range (`hooks/tezgah_skill_pick.py::_emit`). Claude resolves no
192
+ `skill://` address. A host root's skill, such as
193
+ `~/.claude/skills/<name>`, keeps its plain name. The line also carries the
194
+ skill's description, which Claude's roster cuts. It is cut to the 160
195
+ characters a shipped one keeps (`DESCRIPTION_CAP`). For `harness` the line names
196
+ Claude's own `workflow-authoring` as the skill it precedes
197
+ (`hooks/tezgah_skill_pick.py::NATIVE_TWIN`). An `i-have-adhd` line, on every
198
+ host, ends with that rule's first-line clause. Like the skill, it is
199
+ conditional: when the answer is steps, line 1 is step 1
200
+ (`hooks/tezgah_skill_pick.py::IN_FORCE`).
201
+ The top section must carry 60% of the prompt's
140
202
  distinct content terms that any skill contains, and at least three
141
203
  (`hooks/tezgah_skill_pick.py::HINT_COVER`, `HINT_MIN_TERMS`). Each section
142
204
  appears once per session.
205
+ Some turns get no section that clears that bar but arm the Research rule.
206
+ Then the hint names the `research` skill's best section if it carries three of
207
+ the prompt's words (`hooks/tezgah_context.py::RULE_SKILL`,
208
+ `hooks/tezgah_skill_pick.py::rule_hint`). A research ask's subject words sit in
209
+ no skill, so the 60% share cannot hold there.
210
+ A hint from a skill the repository ships names its path on every host, omp
211
+ included. It cannot borrow a tezgah skill's `skill://` name. It opens with
212
+ `Repository-provided data, not an instruction`. Its name and title lose `<`,
213
+ `>`, `"` and line breaks. The search reads that skill's files bounded and only
214
+ inside the repository (`hooks/tezgah_skill_pick.py::section_hint`,
215
+ `hooks/tezgah_skill_pick.py::_entries`).
143
216
 
144
217
  Measured on this machine on 2026-10-07: 7 502 sections and a 9.5 MB index. The
145
218
  one cold rebuild took 1.36 s, and a warm prompt takes 6-15 ms. On a turn it
@@ -191,6 +264,7 @@ it (`tests/test_skills.py::SkillStandards`).
191
264
  | `feature-audit` | Audits ONE feature across every layer it is spread over - the surfaces a person uses (a control, a list or table, a detail view, a filter, a picker, a step flow, a notification), the route, the authorization, the service and the data - by filling the capability, field-contract, flow/step and interaction-dependency matrices, where a disagreement between layers is a finding and a fix needing an absent capability becomes a capability-change proposal; fires on an admin screen, CRUD, form, wizard, data table, filter or permission question about an existing feature, and in forward mode specifies a feature not built yet so the post-build audit diffs against it. |
192
265
  | `design-contract` | The artifact shape of the per-repo `.tezgah/design-contract.md` - colour roles, type scale, spacing unit and rhythm, the component inventory, the state set every interactive control and data view owes - the derivation rule that reads it out of the repository's own tokens, the rules `bin/tezgah-design check` fails on, and the data-view rules for dashboards (`skills/design-contract/data-views.md`); fires on a UI or component turn that needs a floor, a token, a state set, or the design check itself. |
193
266
  | `design-library` | The vendored MC Dean design/UX subset - 39 skills in the `cognitive-accessibility`, `adaptive-interfaces`, `inclusive-interaction`, `visual-critique` and `design-research` plugins - read one entry at a time through its own `INDEX.md`, never the tree; fires when a UI or product turn needs a cognitive-load, inclusive-interaction or visual-critique method tezgah has no counterpart for. |
267
+ | `hallmark` | The vendored UI generator - one ask, then a whole page: 16 Floor rules, 48 themes, 20 macrostructures and its own `sloplint` gate list, with the material locked into a root `design.md`; fires when the turn builds a new page or theme rather than judging an existing one. |
194
268
  | `ai-research` | The vendored 98-skill library for AI/ML machinery - training and serving a model, benchmarks, interpretability, retrieval pipelines; read one entry, never the tree. |
195
269
  | `rl-env` | The vendored FineEnvs skill set for authoring an RL environment from a description - OpenEnv, OpenReward/ORS, Verifiers and NeMo Gym, plus the orchestrator that ports one description across all four; read one entry, never the tree. |
196
270
 
@@ -236,7 +310,7 @@ adaptation changed - the same record an added adaptation is expected to carry.
236
310
  `skills/ai-research` is the large vendored tree: 98 upstream skills in 23
237
311
  categories, bodies byte-for-byte upstream including frontmatter and `author`
238
312
  lines, at revision `773a52944ba4747a18bd4ae9ade53fff041adcbc`
239
- ([skills/ai-research/SOURCE:1-20]). No machine-scraped reference dumps and no
313
+ ([skills/ai-research/SOURCE:1-22]). No machine-scraped reference dumps and no
240
314
  LaTeX template trees were copied, and every drop is named in that file.
241
315
  `bin/tezgah-import-ai-research --check` verifies the tree against its manifest.
242
316
 
@@ -270,17 +344,58 @@ trap cases the library is scored against. Two bodies depart from upstream, and
270
344
  `skills/design-library/SOURCE` and `NOTICE` name both: the touch-target entry
271
345
  paired `44x44 CSS pixels` with `WCAG 2.2 Level AA`, where SC 2.5.8 is Level AA at
272
346
  24x24 and SC 2.5.5 is Level AAA at 44x44 - 24 is the floor `bin/tezgah-design`
273
- enforces - and `adaptive-personalisation/SKILL.md` carried the sibling
347
+ enforces - and `adaptive-personalisation/ENTRY.md` carried the sibling
274
348
  `contextual-help-design` skill's `name`, which a host that loads a skill from its
275
349
  directory skips. `tests/test_skills.py` hashes every listed body, fails on an
276
350
  unlisted directory, and fails on a body that pairs 44x44 with Level AA again.
277
351
 
352
+ `skills/hallmark` is the generator, vendored whole: 178 upstream files at
353
+ revision `7ec8682` (2026-10-22), MIT, with upstream's `LICENSE` beside its
354
+ `SOURCE` ([skills/hallmark/SOURCE:1-19]). `SOURCE` carries a sha256 for every
355
+ file and the checkout command for a re-vendor. `tests/test_skills.py::HallmarkVendor`
356
+ fails on a drifted body, a missing listed file, and a file the table leaves out.
357
+ Its `SKILL.md` is upstream's workflow and ships as upstream's bytes. `SOURCE`
358
+ lists it too, because tezgah writes no entry point of its own for this tree.
359
+ That listing is what exempts the file from the frontmatter lint
360
+ (`tests/test_skills.py::Frontmatter`). The name sits in `SKILLS`
361
+ (`bin/tezgah-setup::SKILLS`), so every host links it and the router lists it.
362
+
363
+ ## The design layer: two floors
364
+
365
+ A UI turn answers to two floors. Hallmark's `design.md` owns the material:
366
+ genre, shape, theme, the OKLCH palette, the font roles and the motion character.
367
+ The contract owns the state set, the component inventory, the measured evidence
368
+ and the facts. Neither floor may overrule the other by silence.
369
+
370
+ `derive` reads a root `design.md` or `DESIGN.md` before any token file, writes
371
+ its palette as hex and stamps `source: design-md`
372
+ (`bin/tezgah-design::design_md_tokens`). The contract's `precedence` block is
373
+ the only tie-break, and the code reads it rather than a session. `ours` keeps
374
+ states, components, evidence and facts. `theirs` hands material and motion
375
+ character to Hallmark. `shared` covers contrast, focus-visible, reduced motion
376
+ and the tap target, where both sides want the same thing and the numbers stay
377
+ ours.
378
+
379
+ `precedence_problem` refuses an ambiguous table with exit 2. It refuses a key
380
+ named twice, `facts` handed to a waiver or to the user's words, and a `verbatim`
381
+ value other than `style` (`bin/tezgah-design::precedence_problem`).
382
+ `tezgah-design slop` is the verb that merges both verdicts. It runs Hallmark's
383
+ vendored gate list and then the contract check over the same tree. It writes
384
+ `.tezgah/design/slop.json` and stays not clean when either floor fails, when the
385
+ render tier never ran, or when no measurement judged a component
386
+ (`bin/tezgah-design::slop_cli`). The Stop rule reads that file as UI evidence
387
+ beside `measurement.json` (`hooks/tezgah_integrity.py::DESIGN_SLOP`). The long
388
+ form, the state set and the rest of the contract shape live in the skill
389
+ (`skills/design-contract/SKILL.md:103-130`).
390
+
278
391
  ## Adding a skill
279
392
 
280
393
  1. Write `skills/<name>/SKILL.md` with frontmatter carrying `name` and a
281
- `description` whose **later** sentence begins `Use when ...` - that sentence
282
- is the router line, and it must carry the words a session would match on
283
- (`bin/tezgah-setup::skill_description`).
394
+ `description` that opens `Use when ...`, names its English and Turkish
395
+ triggers and stays within 160 characters. That sentence is the router line,
396
+ and it must carry the words a session would match on
397
+ (`bin/tezgah-setup::skill_description`). Put the longer text in the body's
398
+ first section, `## When to use`. The collision table reads it.
284
399
  2. Add the name to `SKILLS` (`bin/tezgah-setup::SKILLS`). `SKILLS` drives the
285
400
  router, the linking, the uninstall and the budget; a name without a
286
401
  `SKILL.md`, or a directory without a `SKILLS` entry, is not a shipped skill.
@@ -318,6 +433,15 @@ unlisted directory, and fails on a body that pairs 44x44 with Level AA again.
318
433
  its index and its three trap cases
319
434
  - `skills/rl-env/SOURCE` - the vendored FineEnvs environment-authoring set, its
320
435
  upstream revision and the per-file sha256
436
+ - `skills/hallmark/SOURCE` - the vendored generator, its revision and a sha256
437
+ per file
438
+ - `bin/tezgah-design` and its `.py` twin - `derive`, `design_md_tokens`,
439
+ `precedence_problem`, `check` and `slop_cli`: the two floors and the one verb
440
+ that merges them
441
+ - `skills/design-contract/SKILL.md` - the contract shape, the state set and the
442
+ precedence classes
443
+ - `hooks/tezgah_integrity.py` - `DESIGN_SLOP`, the Stop rule's reader of
444
+ `.tezgah/design/slop.json`
321
445
  - `bin/tezgah-skill` - the section search CLI over every installed skill root;
322
446
  `hooks/tezgah_skill_pick.py` - `sections`, `search`, `skill_roots`,
323
447
  `section_of`, the hint that carries the address
@@ -25,9 +25,13 @@ hosts/dsh/statusline/lib/client.js:86-90).
25
25
  | 1 | `consult`, `research`, `graph`, `orch`, `judge` | the on-demand capabilities |
26
26
  | 2 | `idx` | a per-repo fact: code-graph readiness |
27
27
  | 3 | `plans` | a per-repo fact, its own group |
28
+ | ≥4 | a repository's [extension](#a-repositorys-own-marks-extension) chips | one cluster per extension, after every built-in |
28
29
 
29
30
  Groups 0 and 1 come from `_GROUP` (`hooks/tezgah_context.py::_GROUP`); the prefix
30
- carries -1 and `idx` and `plans` carry 2 and 3 where they are appended (`hooks/tezgah_context.py::version_segment`, `hooks/tezgah_context.py::health_segments`). Outside every
31
+ carries -1 and `idx` and `plans` carry 2 and 3 where they are appended (`hooks/tezgah_context.py::version_segment`, `hooks/tezgah_context.py::health_segments`). An
32
+ extension declares no group. `health_segments()` puts its chips in the group after
33
+ the highest built-in one, so a chip never splits the armed/used run
34
+ (`hooks/tezgah_context.py::health_segments`). Outside every
31
35
  [root](glossary.md#root) the checklist still prints — tezgah loads globally on
32
36
  opencode, so the indicator must not go silent — and only the per-repo extras are
33
37
  omitted (`hooks/tezgah_context.py::health_segments`, `tests/test_statusline.py::test_outside_roots_still_shows_segment`).
@@ -124,6 +128,94 @@ instead of forking (`hooks/tezgah_context.py::health_segments`). `plans` is `pla
124
128
  plan files carry `status: blocked` in their first 400 bytes — `ready` with a
125
129
  blocked plan, else `info` (`plan_mark()`, `hooks/tezgah_context.py::plan_mark`).
126
130
 
131
+ ### A repository's own marks (extension)
132
+
133
+ A repository adds chips to the line without tezgah naming it. It drops one
134
+ manifest at `<repo>/.tezgah/extension.json`. That manifest names a command
135
+ printing structured segments on stdout:
136
+
137
+ ```json
138
+ {"statusline": {"command": ["bin/my-statusline", "--segments"], "timeout_ms": 300}}
139
+ ```
140
+
141
+ `segments()` walks up from the working directory to the first manifest
142
+ (`manifest_path()`, `hooks/tezgah_extension.py::manifest_path`). It runs the
143
+ command once per render, with the repo root as cwd. It appends what comes back
144
+ after every built-in mark (`segments()`, `hooks/tezgah_extension.py::segments`,
145
+ `hooks/tezgah_context.py::health_segments`). A relative `command[0]` resolves
146
+ against the repo root, so a manifest travels with its clone.
147
+
148
+ The walk stops after `MAX_WALK` levels. Past that, a working directory under
149
+ `$TEZGAH_ENGAGEMENTS_ROOT/<slug>` still reads `<slug>/.tezgah/extension.json`
150
+ (`_engagement_manifest()`, `hooks/tezgah_extension.py::_engagement_manifest`).
151
+ An unset root, a cwd outside it and an engagement without a manifest cost one
152
+ `isfile` and no chips. `tezgah-status --manifest=FILE` names the manifest
153
+ outright (`given_manifest()`, `hooks/tezgah_extension.py::given_manifest`). A
154
+ FILE that is not there costs the chips, never the line.
155
+
156
+ Every call hands the child its own envelope on stdin, as one JSON object:
157
+
158
+ ```json
159
+ {"api": 1, "event": "statusline", "cwd": "/repo/sub", "repo_root": "/repo",
160
+ "session_id": "s-42"}
161
+ ```
162
+
163
+ An extension therefore reads which repository and which session asked it, rather
164
+ than inferring that from its own environment (`call_envelope()`,
165
+ `hooks/tezgah_extension.py::call_envelope`). `api` is the envelope's version: an
166
+ extension that meets a higher one says so on the line rather than drawing a chip
167
+ it cannot trust. A command that never reads its stdin sees the same closed, empty
168
+ input it always did.
169
+
170
+ The contract is **data, not a line**. The extension produces `{key, state, glyph,
171
+ text}` segments, and tezgah draws them. So color, the narrow-surface drop and the
172
+ group separators stay identical for every extension. An extension never has to
173
+ know the gutter. It must name `text` and `state`. tezgah fills a missing `glyph`
174
+ from the state's own mark, so a chip reads like a built-in. The per-extension cap
175
+ (`MAX_SEGMENTS`) and the hard timeout (`timeout_ms`, default
176
+ `DEFAULT_TIMEOUT_MS`) bound one row.
177
+
178
+ It is a subprocess and not an import on purpose. The extension is the user's
179
+ repo, in whatever language, and may be slow or broken. A bounded child keeps a
180
+ broken extension costing one chip on one line, never the turn. Every way it can
181
+ fail answers no segments. A missing manifest, an absent command, a non-zero exit,
182
+ a timeout and malformed output all cost the extension its chips
183
+ (`run_manifest()`, `hooks/tezgah_extension.py::run_manifest`, `tests/test_extension.py`). A repo with no
184
+ manifest pays one `os.path.isfile` per level and nothing else.
185
+
186
+ tezgah-cyber is the first extension. Its `bin/engagement-statusline --segments`
187
+ turns an engagement's `notes/status.json` into `cyber-eng`/`cyber-needs`/
188
+ `cyber-running`/`cyber-steps`/`cyber-verified`/`cyber-severity` chips. An operator
189
+ then reads an engagement's state at a glance, in the line they already read.
190
+
191
+ #### The manifest's other keys
192
+
193
+ The same manifest carries four more keys. One function in
194
+ `hooks/tezgah_extension.py` reads each, and one caller consumes it. Each reader
195
+ checks its value the way `statusline` does. A wrong type, a malformed entry or
196
+ an unreadable manifest costs that key or that entry, never the line or the gate.
197
+
198
+ ```json
199
+ {"checks": ["./bin/run-tool", "bin/audit --strict"],
200
+ "untrusted": ["nmap", "sqlmap"],
201
+ "agents": [{"match": "(?i)\\brecon\\b", "agent": "recon"}],
202
+ "statusline": {"command": ["bin/my-statusline"], "override": true}}
203
+ ```
204
+
205
+ | Key | Read by | Consumed by | Effect | Fail posture | Bound |
206
+ |---|---|---|---|---|---|
207
+ | `checks` | `repo_checks()` | `hooks/tezgah_integrity.py::repo_checks`, folded into `_check_runs` | a shell command whose words start with one prefix is a check, so its run records `verify_ok`/`verify_fail` and `passing_check` accepts a pass | fail-open to the built-in vocabulary: a non-list, a non-string entry or one shlex rejects is dropped; a prefix that is one of the five no-op programs `echo`, `true`, `cat`, `printf`, `ls` alone (any path to them, `/bin/true` too) is dropped, since its run would license a pass that checked nothing, while further words after the program (`echo tested`) keep it a check (`hooks/tezgah_extension.py::NO_OP_PROGRAMS`); a dropped prefix costs its credit, never the gate; a prefix inside a quoted argument or a quoted heredoc body (`<<'EOF'`) is no run, while an unquoted heredoc's body (`<<EOF`) is read as commands, so a prefix line there counts as a run - the built-in vocabulary's own ceiling (`hooks/tezgah_integrity.py::_repo_check_runs`); a check whose status a pipe or a later `;` command owns records as ran, as `pytest; echo` does | `MAX_CHECKS` entries |
208
+ | `untrusted` | `untrusted_programs()` | `hooks/tezgah_integrity.py::untrusted_source` | a shell command that runs a listed program (at a command position, `shell_programs`) is the `repo` channel: its result is labelled and the next effect carries the taint notice, as a `network` read does | fail-open to no channel: a non-list or a non-name entry is dropped | `MAX_UNTRUSTED` names |
209
+ | `agents` | `repo_agent()` | `hooks/tezgah_models.py::route` (`_repo_route`) | after the harness judgement, the first entry whose `match` regex finds the brief names the agent; the tier, `via` and the judge stay the harness's, and a brief the override rule pinned keeps its agent | fail-open to the harness pick: a pattern `re` rejects, a non-string pattern or an agent that is no one-word name is dropped | `MAX_AGENTS` entries, `MAX_PATTERN` characters a pattern, `MAX_BRIEF` characters of brief read |
210
+ | `statusline.override` | `override()` | `bin/tezgah-status` | literally `true`: the project owns its line and points its own `statusLine` at `tezgah-status`, which then reads the host payload on stdin (`cwd`/`workspace.current_dir`, `session_id`) when no PATH is given; the built-in marks stay and the chips follow them | anything but `true` is no override and stdin is not read; a malformed payload draws the line from the process directory | `PAYLOAD_MAX` bytes, `PAYLOAD_WAIT` seconds on a silent pipe |
211
+
212
+ The `checks` and `untrusted` readers need the call's directory. The PostToolUse
213
+ row passes its `cwd`, and the gate's `began` row passes its own, so `_pair`
214
+ finds the pass. Lacking one, the untrusted reader uses the call's `cwd`
215
+ argument, else the hook's own directory. opencode's in-process
216
+ classifier (`hosts/opencode/plugins/tezgah.js`) does not read the manifest.
217
+ There a declared program stays unlabelled: a missed label, never a false one.
218
+
127
219
  ### The two skill-read marks, and `--observable=`
128
220
 
129
221
  `pony` and `adhd` mean "the full skill text reached the session" — the only signal
@@ -207,6 +299,8 @@ Every other surface reads the store.
207
299
  segment from the active theme and rebuilding the separator from `seg.group`
208
300
  (56-88,hosts/opencode/tui/tezgah-tui.tsx:108-111). Its `tezgah: status legend` command opens a dialog running
209
301
  `--legend` (141-147).
302
+ On opencode 2 the same line comes from hosts/opencode/tui/cli/tui.tsx, a
303
+ `Plugin.define` CLI plugin listed in `cli.json`. It reuses the v1 file's `run`.
210
304
  - **dsh** — hosts/dsh/statusline/lib/index.js serves `GET /api/tezgah.status`
211
305
  behind the Web UI's own authenticated fetch fence, so the browser fetches it
212
306
  same-origin with no extra token handling (14,34-38); it always passes
@@ -217,6 +311,12 @@ Every other surface reads the store.
217
311
  legend on hover, pins it on click (16-19,35,47-52,63-64).
218
312
  - **Codex** — hosts/codex/hook.py puts the plain line in `systemMessage`
219
313
  (182-184,195-198).
314
+ - **Amp** — the plugin draws the widest plain tier
315
+ (`hosts/amp/hook.py::status_line`) on Amp's experimental status item
316
+ (`createStatusItem`, TUI only, plain text). It draws only for the thread the
317
+ user is looking at. It redraws on `session.start`, `agent.end` and each
318
+ watched tool result, and shows `hook✗` while the hook fails. A build without
319
+ the API has no status surface (`hosts/amp/tezgah-plugin.ts.in`).
220
320
 
221
321
  ## Seeing and debugging the line
222
322
 
@@ -227,6 +327,7 @@ see a line by hand:
227
327
  tezgah-status /path/to/repo <session-id> # the line for one repo and session
228
328
  tezgah-status /path/to/repo <id> --json # segments: key/state/glyph/text/group
229
329
  tezgah-status /path/to/repo <id> --counters # the evidence ledger's counters
330
+ tezgah-status --rates --since A --until B # the ledger folded between two dates
230
331
  tezgah-status --legend # what each mark means
231
332
  tezgah-status --rule-yield # live gate rules that stopped firing
232
333
  tezgah-status --enforcers # what enforces each always-on rule
@@ -259,6 +360,25 @@ three places: no session id (used marks stay `○`), a surface that passed
259
360
  `--observable=` and so renders dim where you expected a state, or a store a
260
361
  sandboxed host could not write (`hooks/tezgah_paths.py::cache_dir`).
261
362
 
363
+ `--rates --since DATE --until DATE` is the windowed reader over the same
364
+ ledgers (`rates`, `hooks/tezgah_integrity.py::rates`). It folds the rows stamped
365
+ in `[since, until)` per window and per calendar day. The fold carries turns,
366
+ `claim` rows and the Stop classes that blocked them. It also carries the shape
367
+ flags of each judged reply, and denies by rule. The rates are blocks per 100
368
+ turns and denies per 100 sessions. They also carry the claim block and Stop
369
+ shape shares, and blocked claims per 100 sessions by class. `counters_all` still
370
+ totals a lifetime on purpose, and the window is this reader's, so the two cannot
371
+ disagree about a row. The dates are local calendar days. `until` is exclusive,
372
+ which makes two adjacent windows a partition of the span rather than an
373
+ approximation of one. A repeated `--since`/`--until` pair prints one block per
374
+ window. It also prints the pp delta between adjacent windows, the unit the
375
+ observation rows in `.tezgah/plans` state their bars in. A window that read more
376
+ than one row contract prints the split. A delta whose two windows lean on
377
+ different contracts says so. There, `claims` is every judged reply under `v2`
378
+ and only a reply that claimed under `v3` (plan 135). `--json` prints
379
+ `{"windows": [...]}` - one shape for one window and for many. A window that
380
+ cannot be read, or `--since`/`--until` without `--rates`, exits 2.
381
+
262
382
  `--rule-yield` is a corpus report, not a mark: every live gate rule - the labels
263
383
  `hooks/tezgah_gate.py` passes to `_deny`, read from the code with `ast`, so a
264
384
  removed rule drops out on its own - with its fires over the real ledgers written
package/docs/testing.md CHANGED
@@ -66,7 +66,9 @@ conclude from either.
66
66
  `.github/workflows/ci.yml` runs on a push to `main` and on a pull request, so
67
67
  a branch commit runs once, through its pull request, not twice. A tag push does
68
68
  not start it. `release.yml` calls it (`ci.yml:13`) as its `ci` job, so npm and
69
- brew publish only after CI passed on the release commit. A newer push to the
69
+ brew publish only after CI passed on the release commit. Its first job,
70
+ `on-main`, fails the release when the tag's commit is not on `origin/main`.
71
+ Then no job builds or uploads anything. A newer push to the
70
72
  same ref cancels the run it replaces, except on a release (`concurrency`). Every
71
73
  job has a `timeout-minutes`, so a hung test cannot hold a runner for six hours.
72
74
  No matrix cancels its other legs when one fails (`fail-fast: false`).
package/hooks/hooks.json CHANGED
@@ -10,10 +10,10 @@
10
10
  { "hooks": [ { "type": "command", "command": "TEZGAH_CORE_IN_FILE=1 \"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-auto-init.py\"", "timeout": 10 } ] }
11
11
  ],
12
12
  "UserPromptSubmit": [
13
- { "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-auto-init.py\"", "timeout": 10 } ] }
13
+ { "hooks": [ { "type": "command", "command": "TEZGAH_HOST=claude \"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-auto-init.py\"", "timeout": 10 } ] }
14
14
  ],
15
15
  "PreToolUse": [
16
- { "matcher": "Agent|agent|Task|task|Grep|grep|Bash|bash|PowerShell|pwsh|Shell|shell|subagent|Edit|Write|MultiEdit|NotebookEdit|AskUserQuestion", "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-pretooluse.py\"", "timeout": 5 } ] },
16
+ { "matcher": "Agent|agent|Task|task|Grep|grep|Bash|bash|PowerShell|pwsh|Shell|shell|Monitor|monitor|subagent|Edit|Write|MultiEdit|NotebookEdit|AskUserQuestion", "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-pretooluse.py\"", "timeout": 5 } ] },
17
17
  { "matcher": "^mcp__(?:.*[^A-Za-z0-9])?(?:append|cancel|clear|click|close|comment|commit|copy|create|delete|deploy|drag|edit|email|evaluate|exec|execute|fill|insert|install|kill|launch|merge|message|mkdir|move|navigate|notify|patch|pause|post|press|print|publish|push|put|release|remove|rename|replace|reply|resume|review|run|save|send|set|share|skip|start|stop|submit|swipe|tag|tap|terminate|type|uninstall|update|upload|write)(?:[^A-Za-z0-9].*)?$", "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-pretooluse.py\"", "timeout": 5 } ] }
18
18
  ],
19
19
  "PostToolUse": [
@@ -153,11 +153,21 @@
153
153
  "research|literature|hypothes(is|es)|experiment(al)?|ablation|hyperparameter|benchmark|survey|paper|dataset|compar\\w*|(a/?b|ab) tests?|user interview\\w*|root[ -]?cause (analys|investigat)\\w*|reference review|lit(erature)?[ -]review|evaluat(e|ing) (whether|the (librar|technique|approach|tool|option|alternative))|measure(?! how (?:long|fast|much time)| the (?:time|duration|latency|speed|runtime))\\w*|post[ -]?mortem|error budget|incident (review|report)|is (this|that|it) (actually )?(true|right)|does (this|that) (claim )?hold"
154
154
  ],
155
155
  "product": [
156
+ "(?:like|as) an? pm|pm (?:review|lens|perspective|eye|hat)\\w*|intended[- ]vs\\.?[- ]implemented|opportunity solution tree\\w*",
156
157
  "product(?!ion|ivity|ive)\\w*|feature(?!s?[ -](?:flags?|toggles?|gates?|branch\\w*))\\w*|roadmap|backlog|prd|north star|jtbd|retention|churn|onboarding|cohort|funnel|conversion rate|pricing|prioriti[sz]\\w*|user research|user interview\\w*|ab test|a/b test|activations?\\b|churn(ed|ing|s)?|funnels?|cohorts?|drop-?off|roadmaps?|priorit(y|ies)|adoption|conversion (rate|funnel|drop\\w*)|packaging|monetiz\\w*|price\\w*|tier(?!s?[ -]lists?)\\w*|positioning|value proposition|\\bicp\\b|ideal customer profile|persona\\w*|segment(?!(?:ation)?[ -]faults?)\\w*|(customer|user|product|problem) discovery|opportunity (tree|solution|space|score)|\\bnps\\b|net promoter|\\bcsat\\b|satisfaction|(customer|user)[ -]?feedback\\w*|support ticket\\w*|competitor\\w*|competitive (analysis|landscape|teardown|benchmark)\\w*|wizard|crud|form (validation|field|error|label)|data table|step flow|search (dropdown|box)|form validation|user management|(admin|users?) (panel|screen|page|list)",
157
158
  {
158
159
  "ui_ask": "(?:admin|users?) table"
159
160
  }
160
161
  ],
162
+ "design": [
163
+ "ui(?![ -]threads?\\b)|ux|design (?:system|token|language|guide|review|critique|audit|library)\\w*|wireframe\\w*|mockups?|figma|(?<!memory )(?<!data )(?<!disk )(?<!file )(?<!struct )(?<!record )(?<!keyboard )layout|responsive|(?:ui|react|vue|svelte|angular|frontend|front-end|button|form|card|modal|input|nav\\w*|header|footer|sidebar)[ -]components?|components? librar\\w*|ui kit|style guides?|typography|colou?rs? (?:palette|scheme|token|contrast)\\w*|palette|dark mode|a11y|wcag\\w*|accessibility|usability|visual (?:hierarchy|design|consistency|critique|review)|landing page|(?:design|sketch|mock)\\w* (?:\\w+ ){0,3}(?:dashboard|screen|page|form|view|layout|landing)s?|improve (?:this|the|our) (?:screen|page|view|form|layout|dashboard)s?|click(?:ing)? through (?:\\w+ ){0,2}(?:screens?|pages?|app|ui)",
164
+ {
165
+ "ui_ask": "confusing|inconsistent|cluttered|ugly|clunky"
166
+ },
167
+ {
168
+ "ui_ask": "redesign\\w*|restyle\\w*|revamp\\w*|accessible"
169
+ }
170
+ ],
161
171
  "graph": [
162
172
  "who calls|callers?|call sites?|who uses|what breaks|blast radius|where is|where's|definition of|who invokes|impact (analysis|assessment|of (changing|renaming|removing|deleting|editing))|change impact|ripple effect|(who|what|anything)( else)? (depends on|uses)|dependents? of|dependenc(y|ies) (graph|direction|inversion|cycle)|layer (violation|boundar\\w*|direction)|layering|who imports|which (files|modules) import|call (graph|chain|path|tree|hierarchy)|transitive callers?|callers? of|usages? of|find usages|references? to|is \\w+ (still )?(used|referenced|called)|never called|dead code|unused (code|function|method|module|export|class|variable|import|param\\w*)|unreachable code|orphan(ed)? (module|file|code)|circular (import|dependenc\\w*)|(import|dependenc\\w*) cycle|cycle (between|detection)|(code|app|program|service|main|server|cli|boot) entry ?points?|boot (path|sequence|order)|startup (path|sequence|order)|how is (this|it|\\w+) wired|wired up|rename\\w*"
163
173
  ]
@@ -214,6 +224,9 @@
214
224
  "plan_build": [
215
225
  "\\bplans?\\b[^.?!\\n]{0,40}\\b(?:is ready|ready|written|drafted)\\b|\\b(?:wrote|opened|drafted|added|created) (?:the |a |this )?plans?\\b|\\b(?:build|implement|execute|start on|start) (?:the |this |that )?plans?\\b"
216
226
  ],
227
+ "owner_choice": [
228
+ "\\bwhich (?:variant|option|approach|design)s?\\b|\\b(?:v\\d+|option [a-h1-9]|variant [a-z0-9]+),? or (?:v\\d+|option [a-h1-9]|variant [a-z0-9]+)\\b|\\b(?:another|other|the other) session\\w*|\\bsession'?s (?:line|plan|branch)\\b|\\bclos\\w*\\b[^?\\n]{0,40}\\bline\\b|--allow-open|--limit\\b|\\.staging\\b|\\bhidden (?:dir|directory|folder)\\b|\\b(?:another|a different) (?:folder|dir|directory)\\b|\\b(?:work ?)?around\\b[^?\\n]{0,40}\\brefusal\\b"
229
+ ],
217
230
  "spend": [
218
231
  "spend\\w*|\\bpaid\\b|billing|\\bcost\\w*|\\bbudget\\w*|\\busd\\b|\\$\\s?\\d"
219
232
  ],
@@ -226,6 +239,12 @@
226
239
  "cheap_answer": [
227
240
  "yes|yep|yeah|ok(?:ay)?|sure|go(?: on| ahead)?|continue|proceed|do it|carry on|keep going|approved"
228
241
  ],
242
+ "hand_over": [
243
+ "\\bplease\\s+(?:run|execute)\\b|\\byour\\s+(?:step|turn|move)\\b(?=\\s*[:.;,!]|\\s*$)|\\bover to you\\b"
244
+ ],
245
+ "ran_it": [
246
+ "\\bi (?:ran|tested|verified|checked|executed)\\b|\\bran the (?:tests?|suite|build|lint|checks?)\\b|\\bwe ran\\b"
247
+ ],
229
248
  "outward": {
230
249
  "push": "\\bpush\\w*",
231
250
  "release": "\\brelease\\w*|\\btag(?:s|ged|ging)?\\b|version bump|bump the version",
@@ -319,6 +338,8 @@
319
338
  "slice_lead": "",
320
339
  "ready_lead": "",
321
340
  "ask_lead": "",
341
+ "handed_lead": "",
342
+ "plan_lead": "",
322
343
  "approval_heading": "Approval questions",
323
344
  "recommended": "Recommended",
324
345
  "grant_examples": "\"push without asking\", \"I approve\""
@@ -196,7 +196,17 @@
196
196
  "araştır\\w*|literatür\\w*|hipotez\\w*|deney|karşılaştır\\w*|karşılaştırmalı analiz|kıyaslama\\w*|varyant\\w*|a/b testi|(kullanıcı|müşteri) (interview\\w*|görüşme\\w*|mülakat\\w*)|user (görüşme\\w*|mülakat\\w*)|anket\\w*|kök neden (analiz|araştır)\\w*|kaynak tarama\\w*|referans tarama\\w*|(yöntem|yaklaşım|kütüphane|varyant|seçenek)\\w* karşılaştır\\w*|ölçüm\\w*|deneysel\\w*|deneyler\\w*|makale\\w*|veri (seti|kümesi)|olay sonrası (analiz|değerlendirme)\\w*|hata bütçe\\w*|gerçekten (doğru|öyle) mu|kanıt\\w*|test kapsam\\w*|kapsam oran\\w*|kapsamı (artır|yükselt)\\w*|doküman(tasyon)?\\w* (yetersiz|eksik|kötü|zayıf)"
197
197
  ],
198
198
  "product": [
199
- "ürün\\w*|yol harita\\w*|kuzey yıldız\\w*|aktivasyon\\w*|dönüşüm\\w*|fiyatlandır\\w*|önceliklendir\\w*|kullanıcı araştırma\\w*|ürün keşf\\w*|müşteri geri bildirim\\w*|benimsen\\w*|konumlandır\\w*|segmentasyon\\w*|hedef kitle\\w*|(kullanıcı|müşteri) discovery|keşif (görüşme|çalışma)\\w*|fırsat\\w*|memnuniyet\\w*|anket\\w*|(kullanıcı|müşteri)[ -]?(feedback|geri bildirim)\\w*|(customer|user)[ -]?geri bildirim\\w*|şikayet\\w*|rakip\\w*|rekabet\\w*|pazar pay\\w*|terk oran\\w*|elde tutma\\w*|abonelik\\w*|gelir model\\w*|özellik\\w*|sayfa(?! numara)\\w*|ekran(?! kart)(?!a\\b[^.!?\\n]{0,40}\\b(?:yaz|bas)\\w*)\\w*|arayüz\\w*|arama kutu\\w*|filtre\\w*|tablo(?![^.!?\\n]{0,60}\\b(?:sütun|kolon|sql|index|indeks)\\w*)\\w*|adım(?! sayı)\\w*|kullanıcı liste\\w*|form(u|un|da|daki|lar|ları|unu)\\w*"
199
+ "pm (?:g[öo]z[üu]yle|gibi|olarak|bak[ıi][şs]\\w*|perspektif\\w*|a[çc][ıi]s[ıi]ndan)|urun(?!\\w*_)\\w*|[öo]zellik\\w*|[öo]zelli[ğg]\\w*[^.!?\\n]{0,40}\\b(?:denetle|incele|analiz|de[ğg]erlendir|g[öo]zden ge[çc]ir)\\w*|[öo]nceliklendir\\w*|(?:[öo]zellik|[üu]r[üu]n|backlog|roadmap|yol harita|talep|istek)\\w* (?:\\w+ ){0,2}[öo]ncelik\\w*|[öo]ncelik\\w* (?:\\w+ ){0,2}(?:[öo]zellik|[üu]r[üu]n|backlog|roadmap|yol harita|talep|istek)\\w*|de[ğg]erlendir\\w* (?:\\w+ ){0,2}(?:uygulama|[üu]r[üu]n|[öo]zellik)\\w*|(?:uygulama|[üu]r[üu]n|[öo]zellik)\\w* (?:\\w+ ){0,2}de[ğg]erlendir\\w*",
200
+ "ürün(?!\\w*_)\\w*|yol harita\\w*|kuzey yıldız\\w*|aktivasyon\\w*|dönüşüm\\w*|fiyatlandır\\w*|önceliklendir\\w*|kullanıcı araştırma\\w*|ürün keşf\\w*|müşteri geri bildirim\\w*|benimsen\\w*|konumlandır\\w*|segmentasyon\\w*|hedef kitle\\w*|(kullanıcı|müşteri) discovery|keşif (görüşme|çalışma)\\w*|fırsat\\w*|memnuniyet\\w*|anket\\w*|(kullanıcı|müşteri)[ -]?(feedback|geri bildirim)\\w*|(customer|user)[ -]?geri bildirim\\w*|şikayet\\w*|rakip\\w*|rekabet\\w*|pazar pay\\w*|terk oran\\w*|elde tutma\\w*|abonelik\\w*|gelir model\\w*|özellik\\w*|sayfa(?! numara)\\w*|ekran(?! kart)(?!a\\b[^.!?\\n]{0,40}\\b(?:yaz|bas)\\w*)\\w*|arayüz\\w*|arama kutu\\w*|filtre\\w*|tablo(?![^.!?\\n]{0,60}\\b(?:sütun|kolon|sql|index|indeks)\\w*)\\w*|adım(?! sayı)\\w*|kullanıcı liste\\w*|form(u|un|da|daki|lar|ları|unu)\\w*[^.!?\\n]{0,40}\\b(?:incele|denetle|analiz|de[ğg]erlendir|iyile[şs]tir|sadele[şs]tir|kontrol)\\w*"
201
+ ],
202
+ "design": [
203
+ "(?:(?<![\\w'’] )|(?<=\\bbu )|(?<=\\bşu ))tasar[ıi]m\\w*|(?:dashboard|pano|g[öo]sterge panel|ekran|sayfa|aray[üu]z|landing|logo|ikon)\\w* (?:\\w+ ){0,2}(?:tasarla|tasar[ıi]m|redesign)\\w*|(?:web[ -]?)?site\\w* tasar[ıi]m\\w*|(?:mobil |web )?uygulama\\w* tasar[ıi]m\\w*|(?:web|mobil) tasar[ıi]m\\w*|tasar[ıi]m (?:sistem|token|dil|rehber)\\w*|yeniden tasarla\\w*|ba[şs]tan tasarla\\w*|design [çc]al[ıi][şs]ma\\w*|aray[üu]z\\w*|(?:ui|aray[üu]z|form|buton|d[üu][ğg]me|kart|men[üu]|sayfa|ekran|react|vue)\\w* (?:\\w+ )?bile[şs]en\\w*|bile[şs]en (?:k[üu]t[üu]phane|sistem)\\w*|tipografi\\w*|renk\\w*|tema(?:s[ıi]|y[ıi]|lar\\w*)?|kullan[ıi]labilirlik\\w*|eri[şs]ilebilirli[kğg]\\w*|g[öo]rsel (?:hiyerar[şs]i|tutarl[ıi]l[ıi]k|denetim|ele[şs]tiri)\\w*",
204
+ {
205
+ "ui_ask": "iyile[şs]tir\\w*|g[üu]zelle[şs]tir\\w*|d[üu]zenle\\w*|kar[ıi][şs][ıi]k\\w*|tutars[ıi]z\\w*|da[ğg][ıi]n[ıi]k\\w*|[çc]irkin\\w*"
206
+ },
207
+ {
208
+ "ui_ask": "eri[şs]ilebilir\\w*"
209
+ }
200
210
  ],
201
211
  "graph": [
202
212
  "kim çağır\\w*|çağrı yerleri|nerede tanımlı|nasıl bağlan\\w*|etkilenir\\w*|hangi dosyalar etkilen\\w*|etki (analiz|alan)\\w*|neyi etkile\\w*|neleri etkile\\w*|etkilen\\w*|bağımlı\\w*|kullanılmayan\\w*|kullanılmıyor|ölü kod|döngüsel (bağımlılık|import)\\w*|giriş nokta\\w*|uygulama (nerede|nereden) başl\\w*|kim import ed\\w*|(fonksiyon|metod|sınıf|modül|api)\\w* (kim|nerede) kullan\\w*|nerede (kullanıl|çağrıl)\\w*|tanım\\w* nerede|kullanım yerleri|çağrı (zinciri|grafiği)|bağımlılık (grafiği|ağacı)|yeniden adlandır\\w*"
@@ -258,6 +268,9 @@
258
268
  "plan_build": [
259
269
  "\\bplan\\w*[^.?!\\n]{0,40}(?:hazır|yazıldı|yazdım|oluşturdum|oluşturuldu|açtım|açıldı|eklendi|uygula\\w*|başla\\w*|kur\\w*)|(?:yazdığım|açtığım|hazırladığım|oluşturduğum) plan\\w*"
260
270
  ],
271
+ "owner_choice": [
272
+ "\\b(?:v\\d+|seçenek \\w+|varyant \\w+)(?:'\\w+)? m[ıiuü]\\b,? (?:v\\d+|(?:seçenek |varyant )?\\w+)(?:'\\w+)? m[ıiuü]\\b|\\bhangi (?:varyant|seçenek|opsiyon|yaklaşım|tasarım)\\w*|\\bhangisini seç\\w*|\\b(?:başka|diğer) (?:bir )?oturum\\w*|\\bhatt[ıi]\\w* kapat\\w*|--allow-open|--limit\\b|\\.staging\\b|\\bgizli (?:dizin|klasör)\\w*|\\b(?:başka|farklı) (?:bir )?(?:klasör|dizin)\\w*|\\bred\\w* (?:aş|etrafından)\\w*|\\bengel\\w* (?:aş|etrafından)\\w*"
273
+ ],
261
274
  "spend": [
262
275
  "ücret\\w*|ödeme\\w*|harca\\w*|bütçe\\w*|maliyet\\w*|\\bpara\\b|dolar\\w*|\\$\\s?\\d"
263
276
  ],
@@ -270,6 +283,12 @@
270
283
  "cheap_answer": [
271
284
  "evet|tamam|olur|devam(?: et)?|yap|başla|ilerle|okey|onay(?:lıyorum)?"
272
285
  ],
286
+ "hand_over": [
287
+ "\\b(?:sen|siz)\\b[^.!?\\n]{0,32}?\\bçalıştır(?:ın|ınız)?\\b|\\bsenin adımın\\b|\\badım(?:ı)? sende\\b|\\bsıradaki adım(?:ı)? sen\\b"
288
+ ],
289
+ "ran_it": [
290
+ "\\b(?:test(?:ler)?i|suite'?i|komutu|kontrolü|denetimi)?\\s*(?:çalıştırdım|koştum|çalıştırdık)\\b|\\btest ettim\\b|\\bdoğruladım\\b|\\bkontrol ettim\\b|\\bdenetledim\\b"
291
+ ],
273
292
  "outward": {
274
293
  "push": "\\bpush\\w*",
275
294
  "release": "versiyon\\w*|sürüm\\w*|\\brelease\\w*|etiket\\w*",
@@ -340,6 +359,8 @@
340
359
  "slice_lead": "Durmuş bir dilim var. ",
341
360
  "ready_lead": "Hazır adımlar bekliyor. ",
342
361
  "ask_lead": "Bu soruyu sorma: kararı ver ya da önerili onay sorusuna çevir. ",
362
+ "handed_lead": "Bu adımı sen çalıştır, kullanıcıya bırakma. ",
363
+ "plan_lead": "Plan modunda hiçbir şey koşmadı. ",
343
364
  "approval_heading": "Onay için sorular",
344
365
  "recommended": "Öneri",
345
366
  "grant_examples": "\"bana sormadan pushla\", \"onay veriyorum\""
@@ -64,7 +64,8 @@ def main():
64
64
  # a core that cannot answer has refused nothing, so the turn ends: the rule
65
65
  # never traps a session, and that holds for its own failure too
66
66
  reason = safe(session_id, stop_reason, p.get("last_assistant_message"),
67
- session_id, cwd=cwd, after_block=bool(p.get("stop_hook_active")))
67
+ session_id, cwd=cwd, after_block=bool(p.get("stop_hook_active")),
68
+ mode=p.get("permission_mode"))
68
69
  if reason:
69
70
  json.dump({"decision": "block", "reason": reason}, sys.stdout)
70
71