@r1z4x/tezgah 1.9.2 → 1.11.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 (426) hide show
  1. package/CHANGELOG.md +83 -1
  2. package/MANIFEST +382 -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 +1 -1
  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 +216 -40
  15. package/bin/tezgah-review-quote +185 -0
  16. package/bin/tezgah-setup +136 -33
  17. package/bin/tezgah-skill +1 -1
  18. package/bin/tezgah-status +201 -3
  19. package/bin/tezgah-task +203 -3
  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 +2 -2
  24. package/docs/clarity-baseline.json +2 -2
  25. package/docs/contract.md +87 -42
  26. package/docs/environment.md +2 -0
  27. package/docs/evidence.md +28 -9
  28. package/docs/feature-audit.md +2 -2
  29. package/docs/gate.md +54 -31
  30. package/docs/glossary.md +5 -2
  31. package/docs/hosts.md +17 -3
  32. package/docs/index.json +34 -8
  33. package/docs/judge.md +4 -2
  34. package/docs/layers.md +3 -3
  35. package/docs/models.md +31 -9
  36. package/docs/operations.md +126 -1
  37. package/docs/research.md +786 -5
  38. package/docs/skills.md +137 -13
  39. package/docs/status-line.md +115 -1
  40. package/hooks/hooks.json +1 -1
  41. package/hooks/lang/en.json +10 -0
  42. package/hooks/lang/tr.json +11 -1
  43. package/hooks/tezgah_agents.py +38 -22
  44. package/hooks/tezgah_apps.py +18 -0
  45. package/hooks/tezgah_components.py +4 -0
  46. package/hooks/tezgah_context.py +189 -50
  47. package/hooks/tezgah_extension.py +337 -0
  48. package/hooks/tezgah_gate.py +188 -56
  49. package/hooks/tezgah_integrity.py +652 -105
  50. package/hooks/tezgah_judge.py +6 -4
  51. package/hooks/tezgah_models.py +59 -19
  52. package/hooks/tezgah_orca.py +1 -1
  53. package/hooks/tezgah_paths.py +102 -6
  54. package/hooks/tezgah_policy.py +94 -45
  55. package/hooks/tezgah_rank.py +9 -6
  56. package/hooks/tezgah_replay.py +4 -4
  57. package/hooks/tezgah_research.py +1260 -65
  58. package/hooks/tezgah_research_capture.py +1544 -0
  59. package/hooks/tezgah_research_evidence.py +842 -0
  60. package/hooks/tezgah_research_stats.py +258 -0
  61. package/hooks/tezgah_skill_pick.py +408 -106
  62. package/hooks/tezgah_stopspec.py +8 -1
  63. package/hooks/tezgah_task.py +12 -4
  64. package/hooks/tezgah_taste_ledger.py +1 -1
  65. package/hosts/cursor/hook.py +29 -2
  66. package/hosts/opencode/plugins/tezgah.js +307 -46
  67. package/hosts/opencode/tui/cli/tui.tsx +100 -0
  68. package/hosts/opencode/tui/tezgah-tui.tsx +2 -1
  69. package/output-styles/tezgah.md +10 -10
  70. package/package.json +1 -1
  71. package/skills/ai-research/SKILL.md +21 -14
  72. package/skills/ai-research/SOURCE +7 -5
  73. package/skills/ai-research/index/1-frame.md +6 -6
  74. package/skills/ai-research/index/2-data.md +9 -9
  75. package/skills/ai-research/index/3-train.md +36 -36
  76. package/skills/ai-research/index/4-measure.md +13 -13
  77. package/skills/ai-research/index/5-run.md +11 -11
  78. package/skills/ai-research/index/6-write.md +23 -23
  79. package/skills/ai-research/library.json +104 -104
  80. package/skills/analyze-app/SKILL.md +17 -12
  81. package/skills/design-contract/SKILL.md +42 -7
  82. package/skills/design-contract/data-views.md +2 -2
  83. package/skills/design-library/EVALS.md +1 -1
  84. package/skills/design-library/INDEX.md +39 -39
  85. package/skills/design-library/SKILL.md +19 -13
  86. package/skills/design-library/SOURCE +45 -43
  87. package/skills/feature-audit/SKILL.md +20 -14
  88. package/skills/hallmark/LICENSE +21 -0
  89. package/skills/hallmark/SKILL.md +154 -0
  90. package/skills/hallmark/SOURCE +207 -0
  91. package/skills/hallmark/agents/openai.yaml +13 -0
  92. package/skills/hallmark/references/anatomy.md +71 -0
  93. package/skills/hallmark/references/brand-truth.md +40 -0
  94. package/skills/hallmark/references/comp.md +104 -0
  95. package/skills/hallmark/references/craft.md +116 -0
  96. package/skills/hallmark/references/dark-mode.md +49 -0
  97. package/skills/hallmark/references/data-viz.md +48 -0
  98. package/skills/hallmark/references/design-md.md +53 -0
  99. package/skills/hallmark/references/direction.md +52 -0
  100. package/skills/hallmark/references/export-formats.md +80 -0
  101. package/skills/hallmark/references/flow.md +131 -0
  102. package/skills/hallmark/references/fonts.md +58 -0
  103. package/skills/hallmark/references/gates.md +243 -0
  104. package/skills/hallmark/references/genres/atmospheric.md +24 -0
  105. package/skills/hallmark/references/genres/editorial.md +24 -0
  106. package/skills/hallmark/references/genres/modern-minimal.md +24 -0
  107. package/skills/hallmark/references/genres/playful.md +24 -0
  108. package/skills/hallmark/references/imagery.md +99 -0
  109. package/skills/hallmark/references/interaction-and-states.md +89 -0
  110. package/skills/hallmark/references/layout.md +104 -0
  111. package/skills/hallmark/references/macrostructures/01-bento-grid.md +21 -0
  112. package/skills/hallmark/references/macrostructures/02-long-document.md +35 -0
  113. package/skills/hallmark/references/macrostructures/03-marquee-hero.md +21 -0
  114. package/skills/hallmark/references/macrostructures/04-stat-led.md +21 -0
  115. package/skills/hallmark/references/macrostructures/05-workbench.md +21 -0
  116. package/skills/hallmark/references/macrostructures/06-conversational-faq.md +28 -0
  117. package/skills/hallmark/references/macrostructures/07-manifesto.md +28 -0
  118. package/skills/hallmark/references/macrostructures/08-photographic.md +21 -0
  119. package/skills/hallmark/references/macrostructures/09-quote-led.md +21 -0
  120. package/skills/hallmark/references/macrostructures/10-specimen.md +21 -0
  121. package/skills/hallmark/references/macrostructures/11-catalogue.md +21 -0
  122. package/skills/hallmark/references/macrostructures/12-letter.md +21 -0
  123. package/skills/hallmark/references/macrostructures/13-index-first.md +21 -0
  124. package/skills/hallmark/references/macrostructures/14-narrative-workflow.md +21 -0
  125. package/skills/hallmark/references/macrostructures/15-split-studio.md +21 -0
  126. package/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
  127. package/skills/hallmark/references/macrostructures/17-type-specimen.md +19 -0
  128. package/skills/hallmark/references/macrostructures/18-portfolio-grid.md +21 -0
  129. package/skills/hallmark/references/macrostructures/19-map-diagram.md +21 -0
  130. package/skills/hallmark/references/macrostructures/20-ecosystem-index.md +19 -0
  131. package/skills/hallmark/references/macrostructures/21-component-playground.md +21 -0
  132. package/skills/hallmark/references/macrostructures.md +119 -0
  133. package/skills/hallmark/references/microinteractions.md +80 -0
  134. package/skills/hallmark/references/patterns.md +202 -0
  135. package/skills/hallmark/references/redesign.md +88 -0
  136. package/skills/hallmark/references/responsive.md +46 -0
  137. package/skills/hallmark/references/review-finish.md +19 -0
  138. package/skills/hallmark/references/review-hero.md +20 -0
  139. package/skills/hallmark/references/scroll-choreography.md +110 -0
  140. package/skills/hallmark/references/texture.md +90 -0
  141. package/skills/hallmark/references/themes/README.md +58 -0
  142. package/skills/hallmark/references/themes/almanac.jpg +0 -0
  143. package/skills/hallmark/references/themes/almanac.md +103 -0
  144. package/skills/hallmark/references/themes/arcade.jpg +0 -0
  145. package/skills/hallmark/references/themes/arcade.md +102 -0
  146. package/skills/hallmark/references/themes/atelier.jpg +0 -0
  147. package/skills/hallmark/references/themes/atelier.md +98 -0
  148. package/skills/hallmark/references/themes/bloom.jpg +0 -0
  149. package/skills/hallmark/references/themes/bloom.md +102 -0
  150. package/skills/hallmark/references/themes/blueprint.jpg +0 -0
  151. package/skills/hallmark/references/themes/blueprint.md +103 -0
  152. package/skills/hallmark/references/themes/broadside.jpg +0 -0
  153. package/skills/hallmark/references/themes/broadside.md +108 -0
  154. package/skills/hallmark/references/themes/brutal.jpg +0 -0
  155. package/skills/hallmark/references/themes/brutal.md +95 -0
  156. package/skills/hallmark/references/themes/carnival.jpg +0 -0
  157. package/skills/hallmark/references/themes/carnival.md +104 -0
  158. package/skills/hallmark/references/themes/cobalt.jpg +0 -0
  159. package/skills/hallmark/references/themes/cobalt.md +101 -0
  160. package/skills/hallmark/references/themes/console.jpg +0 -0
  161. package/skills/hallmark/references/themes/console.md +99 -0
  162. package/skills/hallmark/references/themes/coral.jpg +0 -0
  163. package/skills/hallmark/references/themes/coral.md +102 -0
  164. package/skills/hallmark/references/themes/darkroom.jpg +0 -0
  165. package/skills/hallmark/references/themes/darkroom.md +99 -0
  166. package/skills/hallmark/references/themes/dose.jpg +0 -0
  167. package/skills/hallmark/references/themes/dose.md +98 -0
  168. package/skills/hallmark/references/themes/dusk.jpg +0 -0
  169. package/skills/hallmark/references/themes/dusk.md +105 -0
  170. package/skills/hallmark/references/themes/editorial.jpg +0 -0
  171. package/skills/hallmark/references/themes/editorial.md +97 -0
  172. package/skills/hallmark/references/themes/formwork.jpg +0 -0
  173. package/skills/hallmark/references/themes/formwork.md +107 -0
  174. package/skills/hallmark/references/themes/furrow.jpg +0 -0
  175. package/skills/hallmark/references/themes/furrow.md +98 -0
  176. package/skills/hallmark/references/themes/garden.jpg +0 -0
  177. package/skills/hallmark/references/themes/garden.md +97 -0
  178. package/skills/hallmark/references/themes/grid.jpg +0 -0
  179. package/skills/hallmark/references/themes/grid.md +101 -0
  180. package/skills/hallmark/references/themes/halftone.jpg +0 -0
  181. package/skills/hallmark/references/themes/halftone.md +106 -0
  182. package/skills/hallmark/references/themes/hedgerow.jpg +0 -0
  183. package/skills/hallmark/references/themes/hedgerow.md +104 -0
  184. package/skills/hallmark/references/themes/hum.jpg +0 -0
  185. package/skills/hallmark/references/themes/hum.md +99 -0
  186. package/skills/hallmark/references/themes/index.json +2191 -0
  187. package/skills/hallmark/references/themes/ink.jpg +0 -0
  188. package/skills/hallmark/references/themes/ink.md +106 -0
  189. package/skills/hallmark/references/themes/kiln.jpg +0 -0
  190. package/skills/hallmark/references/themes/kiln.md +108 -0
  191. package/skills/hallmark/references/themes/loom.jpg +0 -0
  192. package/skills/hallmark/references/themes/loom.md +106 -0
  193. package/skills/hallmark/references/themes/lumen.jpg +0 -0
  194. package/skills/hallmark/references/themes/lumen.md +103 -0
  195. package/skills/hallmark/references/themes/manifesto.jpg +0 -0
  196. package/skills/hallmark/references/themes/manifesto.md +101 -0
  197. package/skills/hallmark/references/themes/midnight.jpg +0 -0
  198. package/skills/hallmark/references/themes/midnight.md +97 -0
  199. package/skills/hallmark/references/themes/newsprint.jpg +0 -0
  200. package/skills/hallmark/references/themes/newsprint.md +102 -0
  201. package/skills/hallmark/references/themes/overprint.jpg +0 -0
  202. package/skills/hallmark/references/themes/overprint.md +101 -0
  203. package/skills/hallmark/references/themes/pasteup.jpg +0 -0
  204. package/skills/hallmark/references/themes/pasteup.md +100 -0
  205. package/skills/hallmark/references/themes/piste.jpg +0 -0
  206. package/skills/hallmark/references/themes/piste.md +99 -0
  207. package/skills/hallmark/references/themes/ribbon.jpg +0 -0
  208. package/skills/hallmark/references/themes/ribbon.md +106 -0
  209. package/skills/hallmark/references/themes/rim.jpg +0 -0
  210. package/skills/hallmark/references/themes/rim.md +96 -0
  211. package/skills/hallmark/references/themes/riso.jpg +0 -0
  212. package/skills/hallmark/references/themes/riso.md +98 -0
  213. package/skills/hallmark/references/themes/solstice.jpg +0 -0
  214. package/skills/hallmark/references/themes/solstice.md +104 -0
  215. package/skills/hallmark/references/themes/specimen.jpg +0 -0
  216. package/skills/hallmark/references/themes/specimen.md +100 -0
  217. package/skills/hallmark/references/themes/spore.jpg +0 -0
  218. package/skills/hallmark/references/themes/spore.md +104 -0
  219. package/skills/hallmark/references/themes/sport.jpg +0 -0
  220. package/skills/hallmark/references/themes/sport.md +101 -0
  221. package/skills/hallmark/references/themes/squeeze.jpg +0 -0
  222. package/skills/hallmark/references/themes/squeeze.md +99 -0
  223. package/skills/hallmark/references/themes/sticker.jpg +0 -0
  224. package/skills/hallmark/references/themes/sticker.md +106 -0
  225. package/skills/hallmark/references/themes/studio.jpg +0 -0
  226. package/skills/hallmark/references/themes/studio.md +99 -0
  227. package/skills/hallmark/references/themes/terminal.jpg +0 -0
  228. package/skills/hallmark/references/themes/terminal.md +96 -0
  229. package/skills/hallmark/references/themes/terrazzo.jpg +0 -0
  230. package/skills/hallmark/references/themes/terrazzo.md +106 -0
  231. package/skills/hallmark/references/themes/ultraviolet.jpg +0 -0
  232. package/skills/hallmark/references/themes/ultraviolet.md +106 -0
  233. package/skills/hallmark/references/themes/vellum.jpg +0 -0
  234. package/skills/hallmark/references/themes/vellum.md +105 -0
  235. package/skills/hallmark/references/themes/wayfind.jpg +0 -0
  236. package/skills/hallmark/references/themes/wayfind.md +105 -0
  237. package/skills/hallmark/references/themes/werkstatt.jpg +0 -0
  238. package/skills/hallmark/references/themes/werkstatt.md +105 -0
  239. package/skills/hallmark/scripts/capture.mjs +125 -0
  240. package/skills/hallmark/scripts/fixtures/exemplars/atmospheric.html +324 -0
  241. package/skills/hallmark/scripts/fixtures/exemplars/editorial.html +363 -0
  242. package/skills/hallmark/scripts/fixtures/exemplars/modern-minimal.html +527 -0
  243. package/skills/hallmark/scripts/fixtures/exemplars/playful.html +353 -0
  244. package/skills/hallmark/scripts/fixtures/eyebrow-fail/index.html +118 -0
  245. package/skills/hallmark/scripts/fixtures/eyebrow-pass/index.html +137 -0
  246. package/skills/hallmark/scripts/fixtures/kept/after.html +27 -0
  247. package/skills/hallmark/scripts/fixtures/kept/before.html +26 -0
  248. package/skills/hallmark/scripts/fixtures/slopped.html +145 -0
  249. package/skills/hallmark/scripts/fixtures/tailwind-fail/Feature.vue +14 -0
  250. package/skills/hallmark/scripts/fixtures/tailwind-fail/Hero.tsx +33 -0
  251. package/skills/hallmark/scripts/fixtures/tailwind-fail/index.html +74 -0
  252. package/skills/hallmark/scripts/fixtures/tailwind-fail/style.css +6 -0
  253. package/skills/hallmark/scripts/fixtures/tailwind-pass/Hero.tsx +33 -0
  254. package/skills/hallmark/scripts/fixtures/tailwind-pass/index.html +57 -0
  255. package/skills/hallmark/scripts/fixtures/tailwind-pass/style.css +15 -0
  256. package/skills/hallmark/scripts/fixtures/waiver/index.html +54 -0
  257. package/skills/hallmark/scripts/imagegen.mjs +85 -0
  258. package/skills/hallmark/scripts/install-hook.mjs +70 -0
  259. package/skills/hallmark/scripts/install.mjs +141 -0
  260. package/skills/hallmark/scripts/lint-hook.mjs +49 -0
  261. package/skills/hallmark/scripts/photos.json +1 -0
  262. package/skills/hallmark/scripts/picture.mjs +71 -0
  263. package/skills/hallmark/scripts/refcheck.mjs +352 -0
  264. package/skills/hallmark/scripts/sloplint-render.mjs +1252 -0
  265. package/skills/hallmark/scripts/sloplint.mjs +4422 -0
  266. package/skills/hallmark/scripts/theme.mjs +650 -0
  267. package/skills/harness/SKILL.md +15 -8
  268. package/skills/i-have-adhd/SKILL.md +22 -11
  269. package/skills/no-ai-slop/SKILL.md +15 -1
  270. package/skills/plan-add/SKILL.md +33 -26
  271. package/skills/plan-status/SKILL.md +13 -7
  272. package/skills/plan-sync/SKILL.md +18 -12
  273. package/skills/pm-frameworks/SKILL.md +19 -10
  274. package/skills/pm-frameworks/SOURCE +7 -5
  275. package/skills/ponytail/SKILL.md +19 -14
  276. package/skills/product-analysis/SKILL.md +22 -18
  277. package/skills/product-flow/SKILL.md +14 -9
  278. package/skills/research/SKILL.md +75 -39
  279. package/skills/rl-env/SKILL.md +25 -13
  280. package/skills/rl-env/SOURCE +8 -6
  281. package/skills/tezgah-contract/SKILL.md +47 -42
  282. package/bin/tezgah-skill.py +0 -59
  283. /package/skills/ai-research/0-autoresearch-skill/{SKILL.md → ENTRY.md} +0 -0
  284. /package/skills/ai-research/01-model-architecture/litgpt/{SKILL.md → ENTRY.md} +0 -0
  285. /package/skills/ai-research/01-model-architecture/mamba/{SKILL.md → ENTRY.md} +0 -0
  286. /package/skills/ai-research/01-model-architecture/nanogpt/{SKILL.md → ENTRY.md} +0 -0
  287. /package/skills/ai-research/01-model-architecture/rwkv/{SKILL.md → ENTRY.md} +0 -0
  288. /package/skills/ai-research/01-model-architecture/torchtitan/{SKILL.md → ENTRY.md} +0 -0
  289. /package/skills/ai-research/02-tokenization/huggingface-tokenizers/{SKILL.md → ENTRY.md} +0 -0
  290. /package/skills/ai-research/02-tokenization/sentencepiece/{SKILL.md → ENTRY.md} +0 -0
  291. /package/skills/ai-research/03-fine-tuning/axolotl/{SKILL.md → ENTRY.md} +0 -0
  292. /package/skills/ai-research/03-fine-tuning/llama-factory/{SKILL.md → ENTRY.md} +0 -0
  293. /package/skills/ai-research/03-fine-tuning/peft/{SKILL.md → ENTRY.md} +0 -0
  294. /package/skills/ai-research/03-fine-tuning/unsloth/{SKILL.md → ENTRY.md} +0 -0
  295. /package/skills/ai-research/04-mechanistic-interpretability/nnsight/{SKILL.md → ENTRY.md} +0 -0
  296. /package/skills/ai-research/04-mechanistic-interpretability/pyvene/{SKILL.md → ENTRY.md} +0 -0
  297. /package/skills/ai-research/04-mechanistic-interpretability/saelens/{SKILL.md → ENTRY.md} +0 -0
  298. /package/skills/ai-research/04-mechanistic-interpretability/transformer-lens/{SKILL.md → ENTRY.md} +0 -0
  299. /package/skills/ai-research/05-data-processing/nemo-curator/{SKILL.md → ENTRY.md} +0 -0
  300. /package/skills/ai-research/05-data-processing/ray-data/{SKILL.md → ENTRY.md} +0 -0
  301. /package/skills/ai-research/06-post-training/grpo-rl-training/{SKILL.md → ENTRY.md} +0 -0
  302. /package/skills/ai-research/06-post-training/miles/{SKILL.md → ENTRY.md} +0 -0
  303. /package/skills/ai-research/06-post-training/openrlhf/{SKILL.md → ENTRY.md} +0 -0
  304. /package/skills/ai-research/06-post-training/simpo/{SKILL.md → ENTRY.md} +0 -0
  305. /package/skills/ai-research/06-post-training/slime/{SKILL.md → ENTRY.md} +0 -0
  306. /package/skills/ai-research/06-post-training/torchforge/{SKILL.md → ENTRY.md} +0 -0
  307. /package/skills/ai-research/06-post-training/trl-fine-tuning/{SKILL.md → ENTRY.md} +0 -0
  308. /package/skills/ai-research/06-post-training/verl/{SKILL.md → ENTRY.md} +0 -0
  309. /package/skills/ai-research/07-safety-alignment/constitutional-ai/{SKILL.md → ENTRY.md} +0 -0
  310. /package/skills/ai-research/07-safety-alignment/llamaguard/{SKILL.md → ENTRY.md} +0 -0
  311. /package/skills/ai-research/07-safety-alignment/nemo-guardrails/{SKILL.md → ENTRY.md} +0 -0
  312. /package/skills/ai-research/07-safety-alignment/prompt-guard/{SKILL.md → ENTRY.md} +0 -0
  313. /package/skills/ai-research/08-distributed-training/accelerate/{SKILL.md → ENTRY.md} +0 -0
  314. /package/skills/ai-research/08-distributed-training/deepspeed/{SKILL.md → ENTRY.md} +0 -0
  315. /package/skills/ai-research/08-distributed-training/megatron-core/{SKILL.md → ENTRY.md} +0 -0
  316. /package/skills/ai-research/08-distributed-training/pytorch-fsdp2/{SKILL.md → ENTRY.md} +0 -0
  317. /package/skills/ai-research/08-distributed-training/pytorch-lightning/{SKILL.md → ENTRY.md} +0 -0
  318. /package/skills/ai-research/08-distributed-training/ray-train/{SKILL.md → ENTRY.md} +0 -0
  319. /package/skills/ai-research/09-infrastructure/lambda-labs/{SKILL.md → ENTRY.md} +0 -0
  320. /package/skills/ai-research/09-infrastructure/modal/{SKILL.md → ENTRY.md} +0 -0
  321. /package/skills/ai-research/09-infrastructure/skypilot/{SKILL.md → ENTRY.md} +0 -0
  322. /package/skills/ai-research/10-optimization/awq/{SKILL.md → ENTRY.md} +0 -0
  323. /package/skills/ai-research/10-optimization/bitsandbytes/{SKILL.md → ENTRY.md} +0 -0
  324. /package/skills/ai-research/10-optimization/flash-attention/{SKILL.md → ENTRY.md} +0 -0
  325. /package/skills/ai-research/10-optimization/gguf/{SKILL.md → ENTRY.md} +0 -0
  326. /package/skills/ai-research/10-optimization/gptq/{SKILL.md → ENTRY.md} +0 -0
  327. /package/skills/ai-research/10-optimization/hqq/{SKILL.md → ENTRY.md} +0 -0
  328. /package/skills/ai-research/10-optimization/ml-training-recipes/{SKILL.md → ENTRY.md} +0 -0
  329. /package/skills/ai-research/11-evaluation/bigcode-evaluation-harness/{SKILL.md → ENTRY.md} +0 -0
  330. /package/skills/ai-research/11-evaluation/lm-evaluation-harness/{SKILL.md → ENTRY.md} +0 -0
  331. /package/skills/ai-research/11-evaluation/nemo-evaluator/{SKILL.md → ENTRY.md} +0 -0
  332. /package/skills/ai-research/12-inference-serving/llama-cpp/{SKILL.md → ENTRY.md} +0 -0
  333. /package/skills/ai-research/12-inference-serving/sglang/{SKILL.md → ENTRY.md} +0 -0
  334. /package/skills/ai-research/12-inference-serving/tensorrt-llm/{SKILL.md → ENTRY.md} +0 -0
  335. /package/skills/ai-research/12-inference-serving/vllm/{SKILL.md → ENTRY.md} +0 -0
  336. /package/skills/ai-research/13-mlops/mlflow/{SKILL.md → ENTRY.md} +0 -0
  337. /package/skills/ai-research/13-mlops/swanlab/{SKILL.md → ENTRY.md} +0 -0
  338. /package/skills/ai-research/13-mlops/tensorboard/{SKILL.md → ENTRY.md} +0 -0
  339. /package/skills/ai-research/13-mlops/weights-and-biases/{SKILL.md → ENTRY.md} +0 -0
  340. /package/skills/ai-research/14-agents/a-evolve/{SKILL.md → ENTRY.md} +0 -0
  341. /package/skills/ai-research/14-agents/autogpt/{SKILL.md → ENTRY.md} +0 -0
  342. /package/skills/ai-research/14-agents/crewai/{SKILL.md → ENTRY.md} +0 -0
  343. /package/skills/ai-research/14-agents/langchain/{SKILL.md → ENTRY.md} +0 -0
  344. /package/skills/ai-research/14-agents/llamaindex/{SKILL.md → ENTRY.md} +0 -0
  345. /package/skills/ai-research/15-rag/chroma/{SKILL.md → ENTRY.md} +0 -0
  346. /package/skills/ai-research/15-rag/faiss/{SKILL.md → ENTRY.md} +0 -0
  347. /package/skills/ai-research/15-rag/pinecone/{SKILL.md → ENTRY.md} +0 -0
  348. /package/skills/ai-research/15-rag/qdrant/{SKILL.md → ENTRY.md} +0 -0
  349. /package/skills/ai-research/15-rag/sentence-transformers/{SKILL.md → ENTRY.md} +0 -0
  350. /package/skills/ai-research/16-prompt-engineering/dspy/{SKILL.md → ENTRY.md} +0 -0
  351. /package/skills/ai-research/16-prompt-engineering/guidance/{SKILL.md → ENTRY.md} +0 -0
  352. /package/skills/ai-research/16-prompt-engineering/instructor/{SKILL.md → ENTRY.md} +0 -0
  353. /package/skills/ai-research/16-prompt-engineering/outlines/{SKILL.md → ENTRY.md} +0 -0
  354. /package/skills/ai-research/17-observability/langsmith/{SKILL.md → ENTRY.md} +0 -0
  355. /package/skills/ai-research/17-observability/phoenix/{SKILL.md → ENTRY.md} +0 -0
  356. /package/skills/ai-research/18-multimodal/audiocraft/{SKILL.md → ENTRY.md} +0 -0
  357. /package/skills/ai-research/18-multimodal/blip-2/{SKILL.md → ENTRY.md} +0 -0
  358. /package/skills/ai-research/18-multimodal/clip/{SKILL.md → ENTRY.md} +0 -0
  359. /package/skills/ai-research/18-multimodal/cosmos-policy/{SKILL.md → ENTRY.md} +0 -0
  360. /package/skills/ai-research/18-multimodal/llava/{SKILL.md → ENTRY.md} +0 -0
  361. /package/skills/ai-research/18-multimodal/openpi/{SKILL.md → ENTRY.md} +0 -0
  362. /package/skills/ai-research/18-multimodal/openvla-oft/{SKILL.md → ENTRY.md} +0 -0
  363. /package/skills/ai-research/18-multimodal/segment-anything/{SKILL.md → ENTRY.md} +0 -0
  364. /package/skills/ai-research/18-multimodal/stable-diffusion/{SKILL.md → ENTRY.md} +0 -0
  365. /package/skills/ai-research/18-multimodal/whisper/{SKILL.md → ENTRY.md} +0 -0
  366. /package/skills/ai-research/19-emerging-techniques/knowledge-distillation/{SKILL.md → ENTRY.md} +0 -0
  367. /package/skills/ai-research/19-emerging-techniques/long-context/{SKILL.md → ENTRY.md} +0 -0
  368. /package/skills/ai-research/19-emerging-techniques/model-merging/{SKILL.md → ENTRY.md} +0 -0
  369. /package/skills/ai-research/19-emerging-techniques/model-pruning/{SKILL.md → ENTRY.md} +0 -0
  370. /package/skills/ai-research/19-emerging-techniques/moe-training/{SKILL.md → ENTRY.md} +0 -0
  371. /package/skills/ai-research/19-emerging-techniques/speculative-decoding/{SKILL.md → ENTRY.md} +0 -0
  372. /package/skills/ai-research/20-ml-paper-writing/academic-plotting/{SKILL.md → ENTRY.md} +0 -0
  373. /package/skills/ai-research/20-ml-paper-writing/ml-paper-writing/{SKILL.md → ENTRY.md} +0 -0
  374. /package/skills/ai-research/20-ml-paper-writing/presenting-conference-talks/{SKILL.md → ENTRY.md} +0 -0
  375. /package/skills/ai-research/20-ml-paper-writing/systems-paper-writing/{SKILL.md → ENTRY.md} +0 -0
  376. /package/skills/ai-research/21-research-ideation/brainstorming-research-ideas/{SKILL.md → ENTRY.md} +0 -0
  377. /package/skills/ai-research/21-research-ideation/creative-thinking-for-research/{SKILL.md → ENTRY.md} +0 -0
  378. /package/skills/ai-research/22-agent-native-research-artifact/compiler/{SKILL.md → ENTRY.md} +0 -0
  379. /package/skills/ai-research/22-agent-native-research-artifact/research-manager/{SKILL.md → ENTRY.md} +0 -0
  380. /package/skills/ai-research/22-agent-native-research-artifact/rigor-reviewer/{SKILL.md → ENTRY.md} +0 -0
  381. /package/skills/design-library/adaptive-interfaces/skills/colour-independence/{SKILL.md → ENTRY.md} +0 -0
  382. /package/skills/design-library/adaptive-interfaces/skills/flexible-typography/{SKILL.md → ENTRY.md} +0 -0
  383. /package/skills/design-library/adaptive-interfaces/skills/information-density/{SKILL.md → ENTRY.md} +0 -0
  384. /package/skills/design-library/adaptive-interfaces/skills/preference-audit/{SKILL.md → ENTRY.md} +0 -0
  385. /package/skills/design-library/adaptive-interfaces/skills/responsive-accessibility/{SKILL.md → ENTRY.md} +0 -0
  386. /package/skills/design-library/adaptive-interfaces/skills/responsive-review/{SKILL.md → ENTRY.md} +0 -0
  387. /package/skills/design-library/adaptive-interfaces/skills/simplified-views/{SKILL.md → ENTRY.md} +0 -0
  388. /package/skills/design-library/adaptive-interfaces/skills/specify/{SKILL.md → ENTRY.md} +0 -0
  389. /package/skills/design-library/adaptive-interfaces/skills/user-preference-respect/{SKILL.md → ENTRY.md} +0 -0
  390. /package/skills/design-library/cognitive-accessibility/skills/adaptive-personalisation/{SKILL.md → ENTRY.md} +0 -0
  391. /package/skills/design-library/cognitive-accessibility/skills/assess-load/{SKILL.md → ENTRY.md} +0 -0
  392. /package/skills/design-library/cognitive-accessibility/skills/cognitive-load-assessment/{SKILL.md → ENTRY.md} +0 -0
  393. /package/skills/design-library/cognitive-accessibility/skills/contextual-help-design/{SKILL.md → ENTRY.md} +0 -0
  394. /package/skills/design-library/cognitive-accessibility/skills/error-prevention-recovery/{SKILL.md → ENTRY.md} +0 -0
  395. /package/skills/design-library/cognitive-accessibility/skills/focus-attention-design/{SKILL.md → ENTRY.md} +0 -0
  396. /package/skills/design-library/cognitive-accessibility/skills/memory-load-reduction/{SKILL.md → ENTRY.md} +0 -0
  397. /package/skills/design-library/cognitive-accessibility/skills/plain-language-design/{SKILL.md → ENTRY.md} +0 -0
  398. /package/skills/design-library/cognitive-accessibility/skills/review/{SKILL.md → ENTRY.md} +0 -0
  399. /package/skills/design-library/cognitive-accessibility/skills/simplify/{SKILL.md → ENTRY.md} +0 -0
  400. /package/skills/design-library/cognitive-accessibility/skills/wayfinding-navigation/{SKILL.md → ENTRY.md} +0 -0
  401. /package/skills/design-library/design-research/skills/behavioural-analytics/{SKILL.md → ENTRY.md} +0 -0
  402. /package/skills/design-library/design-research/skills/qual-quant-triangulation/{SKILL.md → ENTRY.md} +0 -0
  403. /package/skills/design-library/inclusive-interaction/skills/audit/{SKILL.md → ENTRY.md} +0 -0
  404. /package/skills/design-library/inclusive-interaction/skills/design-flow/{SKILL.md → ENTRY.md} +0 -0
  405. /package/skills/design-library/inclusive-interaction/skills/feedback-and-status/{SKILL.md → ENTRY.md} +0 -0
  406. /package/skills/design-library/inclusive-interaction/skills/gesture-alternatives/{SKILL.md → ENTRY.md} +0 -0
  407. /package/skills/design-library/inclusive-interaction/skills/keyboard-navigation/{SKILL.md → ENTRY.md} +0 -0
  408. /package/skills/design-library/inclusive-interaction/skills/keyboard-review/{SKILL.md → ENTRY.md} +0 -0
  409. /package/skills/design-library/inclusive-interaction/skills/motion-sensitivity/{SKILL.md → ENTRY.md} +0 -0
  410. /package/skills/design-library/inclusive-interaction/skills/multi-modal-input/{SKILL.md → ENTRY.md} +0 -0
  411. /package/skills/design-library/inclusive-interaction/skills/touch-target-design/{SKILL.md → ENTRY.md} +0 -0
  412. /package/skills/design-library/inclusive-interaction/skills/voice-interaction/{SKILL.md → ENTRY.md} +0 -0
  413. /package/skills/design-library/visual-critique/skills/critique-affordance/{SKILL.md → ENTRY.md} +0 -0
  414. /package/skills/design-library/visual-critique/skills/critique-brand-consistency/{SKILL.md → ENTRY.md} +0 -0
  415. /package/skills/design-library/visual-critique/skills/critique-color/{SKILL.md → ENTRY.md} +0 -0
  416. /package/skills/design-library/visual-critique/skills/critique-composition/{SKILL.md → ENTRY.md} +0 -0
  417. /package/skills/design-library/visual-critique/skills/critique-information-density/{SKILL.md → ENTRY.md} +0 -0
  418. /package/skills/design-library/visual-critique/skills/critique-typography/{SKILL.md → ENTRY.md} +0 -0
  419. /package/skills/design-library/visual-critique/skills/critique-visual-hierarchy/{SKILL.md → ENTRY.md} +0 -0
  420. /package/skills/pm-frameworks/intended-vs-implemented/{SKILL.md → ENTRY.md} +0 -0
  421. /package/skills/pm-frameworks/opportunity-solution-tree/{SKILL.md → ENTRY.md} +0 -0
  422. /package/skills/rl-env/generate-nemo-gym-env/{SKILL.md → ENTRY.md} +0 -0
  423. /package/skills/rl-env/generate-openenv-env/{SKILL.md → ENTRY.md} +0 -0
  424. /package/skills/rl-env/generate-ors-env/{SKILL.md → ENTRY.md} +0 -0
  425. /package/skills/rl-env/generate-verifiers-env/{SKILL.md → ENTRY.md} +0 -0
  426. /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
@@ -227,6 +321,7 @@ see a line by hand:
227
321
  tezgah-status /path/to/repo <session-id> # the line for one repo and session
228
322
  tezgah-status /path/to/repo <id> --json # segments: key/state/glyph/text/group
229
323
  tezgah-status /path/to/repo <id> --counters # the evidence ledger's counters
324
+ tezgah-status --rates --since A --until B # the ledger folded between two dates
230
325
  tezgah-status --legend # what each mark means
231
326
  tezgah-status --rule-yield # live gate rules that stopped firing
232
327
  tezgah-status --enforcers # what enforces each always-on rule
@@ -259,6 +354,25 @@ three places: no session id (used marks stay `○`), a surface that passed
259
354
  `--observable=` and so renders dim where you expected a state, or a store a
260
355
  sandboxed host could not write (`hooks/tezgah_paths.py::cache_dir`).
261
356
 
357
+ `--rates --since DATE --until DATE` is the windowed reader over the same
358
+ ledgers (`rates`, `hooks/tezgah_integrity.py::rates`). It folds the rows stamped
359
+ in `[since, until)` per window and per calendar day. The fold carries turns,
360
+ `claim` rows and the Stop classes that blocked them. It also carries the shape
361
+ flags of each judged reply, and denies by rule. The rates are blocks per 100
362
+ turns and denies per 100 sessions. They also carry the claim block and Stop
363
+ shape shares, and blocked claims per 100 sessions by class. `counters_all` still
364
+ totals a lifetime on purpose, and the window is this reader's, so the two cannot
365
+ disagree about a row. The dates are local calendar days. `until` is exclusive,
366
+ which makes two adjacent windows a partition of the span rather than an
367
+ approximation of one. A repeated `--since`/`--until` pair prints one block per
368
+ window. It also prints the pp delta between adjacent windows, the unit the
369
+ observation rows in `.tezgah/plans` state their bars in. A window that read more
370
+ than one row contract prints the split. A delta whose two windows lean on
371
+ different contracts says so. There, `claims` is every judged reply under `v2`
372
+ and only a reply that claimed under `v3` (plan 135). `--json` prints
373
+ `{"windows": [...]}` - one shape for one window and for many. A window that
374
+ cannot be read, or `--since`/`--until` without `--rates`, exits 2.
375
+
262
376
  `--rule-yield` is a corpus report, not a mark: every live gate rule - the labels
263
377
  `hooks/tezgah_gate.py` passes to `_deny`, read from the code with `ast`, so a
264
378
  removed rule drops out on its own - with its fires over the real ledgers written
package/hooks/hooks.json CHANGED
@@ -10,7 +10,7 @@
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
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 } ] },
@@ -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
  ]
@@ -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*"
@@ -89,9 +89,11 @@ EMPTY_IS_NOT_PROOF = (
89
89
  # The task class each generated specialist is for, in the order the steering
90
90
  # line names them. The orchestrator is not here: it is a primary agent, not one
91
91
  # the main thread delegates to.
92
- STEER = (("mechanical edit (tier from `tezgah-route`)", "tezgah-cheap"),
92
+ STEER = (("mechanical edit (tier from `~/.config/tezgah/bin/tezgah-route`)", "tezgah-cheap"),
93
93
  ("bounded code or tests", "tezgah-standard"),
94
- ("design, invariants, unknown-cause debugging", "tezgah-frontier"),
94
+ ("software design, invariants, unknown-cause debugging", "tezgah-frontier"),
95
+ ("UI/screen/component build or redesign (brief loads design-contract)",
96
+ "tezgah-standard"),
95
97
  ("review of a diff", "tezgah-reviewer"),
96
98
  ("running the impacted checks", "tezgah-tester"),
97
99
  ("docs and path:line citations", "tezgah-docs"),
@@ -231,13 +233,18 @@ def _reviewer_body(host):
231
233
  "security, tests and performance) or per file group: when your brief\n"
232
234
  "names a dimension or files, review only those - a sibling owns the rest.\n"
233
235
  "Round two reads only the delta since the sha round one recorded\n"
234
- "(`tezgah-task review` prints it), plus the round-one hunks and direct\n"
235
- "callers of the symbols that delta touches, and marks every round-one\n"
236
+ "(`~/.config/tezgah/bin/tezgah-task review` prints it), plus the\n"
237
+ "round-one hunks and direct callers of the symbols that delta touches,\n"
238
+ "and marks every round-one\n"
236
239
  "finding closed or open: re-reading the whole diff re-reports what was\n"
237
240
  "already triaged. Test results are input, not a task - read the author's\n"
238
241
  "output file; do not run the suite, and run at most one `-k` test when a\n"
239
242
  "specific accusation needs it. The same defect family confirmed in both\n"
240
243
  "rounds is a sign the design needs a pivot, not another patch.\n\n"
244
+ "When the brief carries an OCR rule group, its rule text is the checklist\n"
245
+ "for those files: account for every listed file as reviewed or skipped\n"
246
+ "with a reason, and still apply everything above - OCR output is input,\n"
247
+ "never a verdict.\n\n"
241
248
  "%s" % (_graph_howto(host), _blast_radius(host), EMPTY_IS_NOT_PROOF,
242
249
  decision, decision, _may_use(host)))
243
250
 
@@ -259,6 +266,9 @@ def _worker_body(tier):
259
266
  "progress, but never redefine the work. Never widen or narrow the brief's\n"
260
267
  "scope, budget or question. If the brief cannot be met as written, say\n"
261
268
  "so and stop rather than answering a different question.\n%s\n"
269
+ "A brief that builds or changes UI: read the `design-contract` skill\n"
270
+ "(and `design-library` for critique) and derive/check with\n"
271
+ "`~/.config/tezgah/bin/tezgah-design` before editing.\n"
262
272
  "Never spawn subagents.\n%s" % (tier, tier, scope, WORKER_OUTPUT))
263
273
  return body
264
274
 
@@ -330,19 +340,22 @@ SPECIALISTS = {
330
340
  "shell and browser/device tools; no source edits",
331
341
  "Read the running app, never only its source: a UI claim inferred from\n"
332
342
  "code is not evidence. Measure against `.tezgah/design-contract.md` when\n"
333
- "it exists (`tezgah-design check`). Every finding names the screen,\n"
334
- "breakpoint and state it came from and a 0-4 severity. Report findings;\n"
335
- "do not edit source files."),
343
+ "it exists (`~/.config/tezgah/bin/tezgah-design check`). Every finding\n"
344
+ "names the screen, breakpoint and state it came from and a 0-4 severity.\n"
345
+ "Report findings; do not edit source files."),
336
346
  "tezgah-researcher": (
337
347
  "Runs one research line through OpenResearch: hypotheses, experiments, "
338
348
  "literature, a report - the protocol frozen before the run.",
339
349
  ("research", "ai-research"),
340
- "shell for `orx` and `tezgah-research`; writes only under .tezgah/research",
350
+ "shell for `orx` and `~/.config/tezgah/bin/tezgah-research`; writes only "
351
+ "under .tezgah/research",
341
352
  "Load the OpenResearch manual first (`orx skill`) and follow its\n"
342
353
  "experiment-tree rules. Work inside the one line the brief names; never\n"
343
- "open a second line while one is open (`tezgah-research status`). Freeze\n"
354
+ "open a second line while one is open\n"
355
+ "(`~/.config/tezgah/bin/tezgah-research status`). Freeze\n"
344
356
  "the protocol and the criteria before any run; a correction after a run\n"
345
- "goes in `amendments.md`. Run `tezgah-research check` before reporting.\n"
357
+ "goes in `amendments.md`. Run `~/.config/tezgah/bin/tezgah-research check`\n"
358
+ "before reporting.\n"
346
359
  "If `orx` is not installed, say so and stop."),
347
360
  }
348
361
 
@@ -351,7 +364,7 @@ def _specialist_desc(name):
351
364
  what, skills, tools, _role = SPECIALISTS[name]
352
365
  named = ", ".join(s + (" (host-installed)" if s in HOST_SKILLS else "")
353
366
  for s in skills)
354
- return "%s Skills: %s. Tier: %s (tezgah-route). Tools: %s." % (
367
+ return "%s Skills: %s. Tier: %s (~/.config/tezgah/bin/tezgah-route). Tools: %s." % (
355
368
  what, named or "none", tm.AGENT_SLOT[name], tools)
356
369
 
357
370
 
@@ -386,12 +399,13 @@ ROLES = (
386
399
  ("tezgah-cheap",
387
400
  "Mechanical, fully specified edits on the cheapest model tier: renames, "
388
401
  "fixtures, formatting, version bumps, commit messages, a listed migration. "
389
- "Chosen by `tezgah-route`; answers ESCALATE when the work needs judgement.",
402
+ "Chosen by `~/.config/tezgah/bin/tezgah-route`; answers ESCALATE when the "
403
+ "work needs judgement.",
390
404
  lambda infra: True, _worker_body("cheap"), False),
391
405
  ("tezgah-standard",
392
406
  "Bounded code, tests, search-and-summarise or a small review on the standard "
393
- "model tier. Chosen by `tezgah-route`; answers ESCALATE when the work needs "
394
- "judgement above it.",
407
+ "model tier. Chosen by `~/.config/tezgah/bin/tezgah-route`; answers ESCALATE "
408
+ "when the work needs judgement above it.",
395
409
  lambda infra: True, _worker_body("standard"), False),
396
410
  ("tezgah-frontier",
397
411
  "Design, stored-data or ordering invariants, security-sensitive code, "
@@ -447,23 +461,25 @@ def _orch_body(names):
447
461
  "on its slice id. Never `wait` while a ready step exists. Once every\n"
448
462
  "open item is blocked on a running slice, `wait` or end the turn - the\n"
449
463
  "host wakes you on the result. You integrate the branches in the order\n"
450
- "`tezgah-task slice merge-plan` prints, and own CHANGELOG.md, MANIFEST\n"
451
- "and the citation baseline. The per-turn\n"
464
+ "`~/.config/tezgah/bin/tezgah-task slice merge-plan` prints, and own\n"
465
+ "CHANGELOG.md, MANIFEST and the citation baseline. The per-turn\n"
452
466
  "checks of what changed still run in the turn, in the background; only\n"
453
467
  "the heavy tier (full suite, neuter, e2e) is joined at merge.\n"
454
468
  "A slice commits `wip: <step>` after each step. A stopped slice is\n"
455
- "resumed (`tezgah-task slice resume <id>`) or re-dispatched, never\n"
456
- "silently absorbed inline; run `tezgah-task slice reconcile --prune`\n"
469
+ "resumed (`~/.config/tezgah/bin/tezgah-task slice resume <id>`) or\n"
470
+ "re-dispatched, never silently absorbed inline; run\n"
471
+ "`~/.config/tezgah/bin/tezgah-task slice reconcile --prune`\n"
457
472
  "before the turn that merged slices ends.\n\n"
458
473
  "Route reviews to tezgah-reviewer, with the changed files and symbols in\n"
459
474
  "the brief: where it has no shell it cannot run `git diff` itself. Checks\n"
460
475
  "go to tezgah-tester, docs and citations to tezgah-docs, a security review\n"
461
476
  "to tezgah-security, a running app to tezgah-ui, a research line to\n"
462
477
  "tezgah-researcher. Brief a code-discovery task to a tier worker with the\n"
463
- "codegraph tools; a second opinion (`consult`) stays with the main\n"
464
- "thread. Other work goes to the tier worker\n"
465
- "`tezgah-route \"<brief>\"` names (tezgah-cheap, tezgah-standard,\n"
466
- "tezgah-frontier). A report missing an `Output to orchestrator` field,\n"
478
+ "codegraph tools; a second opinion (`~/.config/tezgah/bin/consult`) stays\n"
479
+ "with the main thread. Other work goes to the tier worker\n"
480
+ "`~/.config/tezgah/bin/tezgah-route \"<brief>\"` names (tezgah-cheap,\n"
481
+ "tezgah-standard, tezgah-frontier). A report missing an\n"
482
+ "`Output to orchestrator` field,\n"
467
483
  "or an ESCALATE, gets one narrower re-brief of the same role naming the\n"
468
484
  "missing field or the escalated judgement; only a second miss is\n"
469
485
  "restarted on tezgah-frontier with the original brief, never continued.\n"
@@ -127,6 +127,10 @@ def _probe_orx():
127
127
  return _tp("orx_bin")()
128
128
 
129
129
 
130
+ def _probe_ocr():
131
+ return _tp("ocr_bin")()
132
+
133
+
130
134
  # The fetch-and-convert step of an embedding row, run by the installer as its
131
135
  # `cmd`, and the probe that answers whether the pinned file is in place.
132
136
  _EMBED = os.path.join(os.path.dirname(os.path.abspath(__file__)), "tezgah_embed.py")
@@ -209,6 +213,20 @@ REGISTRY = (
209
213
  "cmd": ["sh", "-c",
210
214
  "curl -LsSf https://openresearch.sh/install.sh | sh"],
211
215
  "why": "research routing (OpenResearch)"}},
216
+ # Opt-in, not a server: open-code-review's deterministic review spec
217
+ # (`ocr delegate preview|rule`, no model call) for the reviewer brief, and
218
+ # on omp its own loop on omp's model (bin/tezgah-ocr-review). Plan 125.
219
+ {"id": "ocr",
220
+ "name": "ocr",
221
+ "why": "review spec: file selection and per-file rules (open-code-review)",
222
+ "command": None,
223
+ "env": None,
224
+ "default": False,
225
+ "dep": {"name": "ocr", "probe": _probe_ocr, "needs": ("npm",),
226
+ # 1.13.2 is the release under 375f64c (the vendored prompts' commit);
227
+ # its prompts, delegate and rules are identical to 375f64c's
228
+ "cmd": ["npm", "install", "-g", "@alibaba-group/open-code-review@1.13.2"],
229
+ "why": "the review spec in the reviewer brief"}},
212
230
  # Opt-in, not servers: a static embedding model fused with BM25 for the
213
231
  # per-turn lessons and the docs fallback (hooks/tezgah_embed.py). Enabling
214
232
  # one fetches and converts its pinned file; the first selected one is used.
@@ -106,6 +106,10 @@ COMPONENTS = [
106
106
  "skills/feature-audit/SKILL.md", "skills/product-flow/SKILL.md",
107
107
  "hooks/tezgah_product.py"],
108
108
  "switch": "research-off", "editable": True, "revert": "git"},
109
+ {"key": "design", "label": "design",
110
+ "files": ["hooks/tezgah_policy.py", "skills/design-contract/SKILL.md",
111
+ "skills/design-library/SKILL.md", "bin/tezgah-design"],
112
+ "switch": "design-off", "editable": True, "revert": "git"},
109
113
  {"key": "attribution", "label": "attribution",
110
114
  "files": ["hooks/tezgah_policy.py", "hooks/tezgah_gate.py"],
111
115
  "switch": "none", "editable": False, "revert": "git"},