@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
@@ -195,10 +195,12 @@ SESSION_ARGV = {
195
195
  # None of the next three takes a system prompt or drops its tools, so
196
196
  # `_session_request` puts the system prompt in front of the prompt text and
197
197
  # the empty temp cwd is what keeps tools from reaching a repository. Each
198
- # set is from the CLI's own `--help` (checked 2026-10-09). opencode 1.18.31
199
- # `run`: `--pure` "run without external plugins", `--format json` "raw JSON
200
- # events"; it has no flag that skips the session record.
201
- "opencode": ["run", "--pure", "--format", "json"],
198
+ # set is from the CLI's own `--help` (opencode rechecked 2026-10-19):
199
+ # opencode 2.0.32 `run` lists `--format json` and no longer the 1.18
200
+ # `--pure` (it exits 1 "Unrecognized flag: --pure"), so its plugins load
201
+ # again and the inline config below is what keeps its tools denied; no flag
202
+ # skips the session record either.
203
+ "opencode": ["run", "--format", "json"],
202
204
  # cursor-agent 2026.10.01: `-p` print, `--output-format json` (only with
203
205
  # --print), `--mode ask` "Q&A style ... (read-only)", `--trust` "Trust the
204
206
  # current workspace without prompting" - the temp cwd is never trusted.
@@ -55,7 +55,7 @@ READ_ON = "2026-09-30"
55
55
  STALE_DAYS = 60
56
56
  OVERLAY = os.path.join(tp.CONFIG_DIR, "models.json")
57
57
  OPENROUTER_MODELS = "https://openrouter.ai/api/v1/models"
58
- MODES = ("auto", "anthropic", "zai", "any", "openai", "off")
58
+ MODES = ("auto", "anthropic", "zai", "any", "experientiallabs", "openai", "off")
59
59
  # The two status markers `bin/tezgah-setup` classifies an `apply_omp()` line by:
60
60
  # a skip is not a write and not a failure - the user's omp is left untouched, and
61
61
  # nothing is left to repair, which is why the status report excuses it rather
@@ -84,18 +84,24 @@ TIERS = ("cheap", "standard", "frontier")
84
84
  # against GLM-5.3's 95.4 at $0.34 (vals.ai, artifacts/model-table.json), so the
85
85
  # cheap slots take the flash id and standard the plain one.
86
86
  SLOTS = {
87
+ # The experientiallabs column: the gateway's uncensored DeepSeek V4.1 Flash
88
+ # serves efforts none/low/high/max only, so cheap and explore carry `low`
89
+ # where the Anthropic column carries `medium`.
87
90
  "cheap": {"anthropic": ("claude-opus-5-5", "low"),
88
91
  "openai": ("gpt-6.1-sol", "low"),
89
92
  "zai": ("zai/glm-5.3-flash", None),
90
- "any": ("z-ai/glm-5.3-flash", None)},
93
+ "any": ("z-ai/glm-5.3-flash", None),
94
+ "experientiallabs": ("deepseek-v4.1-flash-uncensored", "low")},
91
95
  "explore": {"anthropic": ("claude-opus-5-5", "medium"),
92
96
  "openai": ("gpt-6.1-sol", "low"),
93
97
  "zai": ("zai/glm-5.3-flash", None),
94
- "any": ("deepseek/deepseek-v4.1-flash", None)},
98
+ "any": ("deepseek/deepseek-v4.1-flash", None),
99
+ "experientiallabs": ("deepseek-v4.1-flash-uncensored", "low")},
95
100
  "standard": {"anthropic": ("claude-opus-5-5", "medium"),
96
101
  "openai": ("gpt-6.1-sol", "high"),
97
102
  "zai": ("zai/glm-5.3", None),
98
- "any": ("openai/gpt-6.1-sol", "high")},
103
+ "any": ("openai/gpt-6.1-sol", "high"),
104
+ "experientiallabs": ("deepseek-v4.1-flash-uncensored", "high")},
99
105
  # The frontier row names a concrete model on every family: the strongest
100
106
  # Anthropic run the snapshot prices (Opus 5.5 @high, 56.6 Terminal-Bench 4.0
101
107
  # at $1.82/task on AA v4.3), OpenAI's own frontier id, and the same Opus 5.5
@@ -103,7 +109,8 @@ SLOTS = {
103
109
  "frontier": {"anthropic": ("claude-opus-5-5", "high"),
104
110
  "openai": ("gpt-6-astra", "high"),
105
111
  "zai": ("zai/glm-5.3", None),
106
- "any": ("anthropic/claude-opus-5.5", "high")},
112
+ "any": ("anthropic/claude-opus-5.5", "high"),
113
+ "experientiallabs": ("deepseek-v4.1-flash-uncensored", "high")},
107
114
  }
108
115
  # omp's own OpenAI column (plan 107): omp reaches OpenAI through its
109
116
  # `openai-codex` provider (a ChatGPT login), which on 2026-10-13 listed
@@ -124,6 +131,10 @@ SNAPSHOT = {"anthropic/claude-opus-5.5": (4.0, 20.0),
124
131
  "openai/gpt-6-astra": (10.0, 50.0),
125
132
  "z-ai/glm-5.3-flash": (0.15, 0.5),
126
133
  "deepseek/deepseek-v4.1-flash": (0.0198, 0.396)}
134
+ # `experientiallabs` has no SNAPSHOT row on purpose: SNAPSHOT holds OpenRouter
135
+ # ids, and `refresh` reads its list - a custom-provider id here would be a
136
+ # permanent false "no longer in the OpenRouter list" flag. Its prices live in
137
+ # ~/.omp/agent/models.yml `cost`.
127
138
 
128
139
  # ---------------------------------------------------------------- overlay ----
129
140
 
@@ -211,12 +222,13 @@ def openrouter_ready():
211
222
  # provider lists none of the column's ids on this machine (`omp models
212
223
  # openai-codex`, 2026-10-01: gpt-5.5, gpt-5.6-luna/-terra, gpt-6-luna), so a
213
224
  # pattern for it would never resolve.
214
- OMP_FAMILIES = ("anthropic", "zai", "any")
225
+ OMP_FAMILIES = ("anthropic", "zai", "any", "experientiallabs")
215
226
  # family -> (omp's auth-store provider id, the env names omp reads for it)
216
227
  # (omp://providers.md:39, omp://environment-variables.md:39-40,71,73).
217
228
  OMP_AUTH = {"anthropic": ("anthropic", ("ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY")),
218
229
  "zai": ("zai", ("ZAI_API_KEY",)),
219
230
  "any": ("openrouter", ("OPENROUTER_API_KEY",)),
231
+ "experientiallabs": ("experientiallabs", ("EXPERIMENTALLABS_API_KEY",)),
220
232
  "openai": ("openai-codex", ("OPENAI_CODEX_OAUTH_TOKEN",))}
221
233
  # Every family `--mode` can pin. `openai` is no fallback for the others: it is
222
234
  # its own subscription with its own limit, and the owner's fallback ask
@@ -573,16 +585,16 @@ def start_health():
573
585
 
574
586
 
575
587
  def omp_mode(default_selector=None):
576
- """`anthropic`, `zai`, `openai` or `any`: the saved mode, else the
577
- default's own family.
588
+ """`anthropic`, `zai`, `openai`, `experientiallabs` or `any`: the saved
589
+ mode, else the default's own family.
578
590
 
579
591
  A default of no listed family reads as `any`, never as a silent fall back
580
592
  to the Anthropic column - the caller decides what to do when the credential
581
593
  the selectors need is missing (`apply_omp` writes nothing and says so)."""
582
594
  mode = overlay().get("mode")
583
- if mode in ("anthropic", "zai", "any", "openai", "off"):
595
+ if mode in MODES and mode != "auto":
584
596
  return mode
585
- for family in ("anthropic", "zai", "openai"):
597
+ for family in ("anthropic", "zai", "openai", "experientiallabs"):
586
598
  if str(default_selector or "").startswith(FAMILY_PREFIX[family] or family + "/"):
587
599
  return family
588
600
  return "any"
@@ -597,8 +609,10 @@ OMP_ROLES = ("plan", "slow")
597
609
 
598
610
  # The prefix each family's stored id needs to become an omp selector. `zai` needs
599
611
  # none: its id already is `<provider>/<model>`, the shape omp's own config uses.
612
+ # `experientiallabs` is a custom models.yml provider, so its prefix is that
613
+ # provider's own id (~/.omp/agent/models.yml).
600
614
  FAMILY_PREFIX = {"anthropic": "anthropic/", "zai": "", "any": "openrouter/",
601
- "openai": "openai-codex/"}
615
+ "experientiallabs": "experientiallabs/", "openai": "openai-codex/"}
602
616
 
603
617
 
604
618
  def _row(family, slot):
@@ -1102,7 +1116,7 @@ WRITES = re.compile(r"\b(?:fix|implement|edit|write|add|refactor|patch|migrate|"
1102
1116
  r"rename|delete|remove|rotate)\w*\b", re.I)
1103
1117
 
1104
1118
 
1105
- def route(brief, phase=None, ask=None):
1119
+ def route(brief, phase=None, ask=None, cwd=None):
1106
1120
  """{"agent", "tier", "why", "via", "judge", "judged"} for one delegation
1107
1121
  brief; `via` is what set the tier: `rule`, `jev`, `phase` or `default`, and
1108
1122
  `judge` is the `provider/model` that answered when a judgement set it.
@@ -1112,7 +1126,10 @@ def route(brief, phase=None, ask=None):
1112
1126
  goes out redacted (`ti.redact`, the reader the ledger uses) and only when no
1113
1127
  override matched: a brief matching the override vocabulary never leaves the
1114
1128
  machine. Answers are read through the seam's own accessors, so a malformed
1115
- reply is the same as no reply and this never raises."""
1129
+ reply is the same as no reply and this never raises.
1130
+
1131
+ The repository's own `agents` (`_repo_route`) are read last, at `cwd`
1132
+ (None: this process's directory, the shell `tezgah-route` runs in)."""
1116
1133
  hit = OVERRIDE.search(brief or "")
1117
1134
  if hit:
1118
1135
  if REVIEW_ONLY.search(brief) and not WRITES.search(brief):
@@ -1131,14 +1148,37 @@ def route(brief, phase=None, ask=None):
1131
1148
  out["judge"] = "%s/%s" % (result.get("provider") or "-",
1132
1149
  result.get("model") or "-")
1133
1150
  out["judged"] = result
1134
- return out
1151
+ return _repo_route(out, brief, cwd)
1135
1152
  if phase in PHASE_AGENT:
1136
- return _agent(PHASE_AGENT[phase], "no judgement; phase %s names it" % phase,
1137
- "phase")
1138
- if phase in PHASE_TIER:
1139
- return _pick(PHASE_TIER[phase], "no judgement; static table for phase %s" % phase,
1153
+ out = _agent(PHASE_AGENT[phase], "no judgement; phase %s names it" % phase,
1140
1154
  "phase")
1141
- return _pick("standard", "no judgement and no phase; the middle tier", "default")
1155
+ elif phase in PHASE_TIER:
1156
+ out = _pick(PHASE_TIER[phase], "no judgement; static table for phase %s" % phase,
1157
+ "phase")
1158
+ else:
1159
+ out = _pick("standard", "no judgement and no phase; the middle tier", "default")
1160
+ return _repo_route(out, brief, cwd)
1161
+
1162
+
1163
+ def _repo_route(out, brief, cwd):
1164
+ """`out` with the repository's declared agent in place of tezgah's when one
1165
+ of the manifest's `agents` matches the brief (`tezgah_extension.repo_agent`).
1166
+
1167
+ Read after the harness judgement and never before it: the tier, `via` and
1168
+ the judge stay the harness's, only the agent that runs it is the repo's.
1169
+ The override rule returns before this is reached, so a brief the harness
1170
+ pinned by rule keeps its agent. A broken manifest, a missing module or a
1171
+ vanished cwd keeps `out` as it was."""
1172
+ try:
1173
+ import tezgah_extension
1174
+ found = tezgah_extension.repo_agent(brief, cwd or os.getcwd())
1175
+ except Exception:
1176
+ found = None
1177
+ if not found:
1178
+ return out
1179
+ agent, pattern = found
1180
+ return dict(out, agent=agent,
1181
+ why="%s; repo agent %s (match %r)" % (out["why"], agent, pattern))
1142
1182
 
1143
1183
 
1144
1184
  def _agent(agent, why, via):
@@ -116,7 +116,7 @@ def context_line(env=None):
116
116
  "`git worktree add`, which Orca does not list. A long job runs in "
117
117
  "`orca terminal create --worktree <selector> --command <cmd> --json`, "
118
118
  "not a background shell. Track with `orca worktree ps --json` and "
119
- "`tezgah-status --orca`; mark checkpoints with `orca worktree set "
119
+ "`~/.config/tezgah/bin/tezgah-status --orca`; mark checkpoints with `orca worktree set "
120
120
  "--worktree active --comment <text>`. Full guide: `orca skills get "
121
121
  "orca-cli`." % where)
122
122
 
@@ -69,13 +69,13 @@ OFF_DIRS = (CONFIG_DIR, os.path.join(HOME, ".claude"))
69
69
  # (bin/tezgah-setup OFF_SWITCH_NAMES), the context's off-note (`switches()`),
70
70
  # the opencode plugin's own `off()` and the gate's control rule all answer from
71
71
  # it, and tests/test_paths.py fails when any of them names a switch it lacks.
72
- # CORE_SWITCHES are the sixteen the always-on contract names. ADR 007 leaves
72
+ # CORE_SWITCHES are the seventeen the always-on contract names. ADR 007 leaves
73
73
  # UNCLASSIFIED_SWITCHES open - three `off()` names CORE does not list (the
74
74
  # third, `slices-off`, stops the slice journal: hooks/tezgah_task.py) and two
75
75
  # opt-in markers read with `armed()` - and until the owner classifies them the
76
76
  # control rule protects them like the rest (bin/tezgah-docs carries the same
77
77
  # set for its inventory check; the test pins the two equal).
78
- CORE_SWITCHES = ("adhd-off", "consult-off", "docs-judge-off", "exec-mode.off",
78
+ CORE_SWITCHES = ("adhd-off", "consult-off", "design-off", "docs-judge-off", "exec-mode.off",
79
79
  "judge-off", "lang-off", "orchestrate-off", "ponytail-auto.off",
80
80
  "pretooluse-off", "reminder-off", "research-off", "spec-off",
81
81
  "task-off", "triage-off", "verify-off", "workspace-off")
@@ -245,15 +245,84 @@ def root_for(path):
245
245
  rs = roots()
246
246
  for r in rs:
247
247
  if real == r or real.startswith(r + os.sep):
248
- return r
248
+ # Read lazily, in the branch where the root already matched: a path
249
+ # outside every configured root pays nothing for the marker.
250
+ return None if harness_excluded(real) else r
249
251
  top = worktree_top(real)
250
252
  if top:
251
253
  main = _linked_main_at(top)
252
254
  if main and any(main == r or main.startswith(r + os.sep) for r in rs):
253
- return top
255
+ return None if harness_excluded(top) else top
254
256
  return None
255
257
 
256
258
 
259
+ # --- the owner marker: a repository that says who owns its workspace --------
260
+ # Every repository under a configured root is armed, because `roots()` is the
261
+ # only switch and the kill switches are global (`~/.config/tezgah/*.off`) or
262
+ # per-feature (`<repo>/.no-ponytail`). A project whose workspace is not this
263
+ # harness's has no way to say so - and one measured consequence is a review of
264
+ # an authorized offensive-security workspace where the harness's development
265
+ # plan/task machine drove a lab engagement: three `tezgah-task` writes inside
266
+ # the run and the per-turn phase line reaching a read-only review subagent
267
+ # (that repository's `.tezgah/analysis/harness-review-and-gaps.md`, the plan-011
268
+ # section; the line range is left out because a citation into another
269
+ # repository's workspace cannot be judged against this tree).
270
+ # The marker is that way: a file the repository owns, committed, reviewable in a
271
+ # diff, and not produced by `tezgah-setup`, so a config rewrite cannot resurrect
272
+ # the collision. Two settings, because they cost different things:
273
+ # tasks: off - the plan/task machine and the per-turn task line stop;
274
+ # the scope gate, research and lessons keep working.
275
+ # harness: excluded - `root_for` answers None and the harness is inert here
276
+ # entirely: no workspace init, no plan/task/lesson record,
277
+ # no gate envelope, no per-turn contract clause.
278
+ OWNER_MARKER = "tezgah.owner"
279
+ OWNER_KEYS = ("owner", "tasks", "harness")
280
+ _OWNER_OFF = ("off", "false", "no")
281
+
282
+
283
+ def owner_marker(path):
284
+ """The owner marker's fields for the repository holding `path`, or {}.
285
+
286
+ Read from the nearest `.git` top level at or above `path` (`_toplevel`), so a
287
+ path inside a workspace reads its project's marker and a repository cloned
288
+ inside that workspace answers for itself. A missing or unreadable file, a
289
+ line with no `:`, an unknown key and a blank value all answer {} rather than
290
+ raise: this runs inside `root_for`, which every gate call and every session
291
+ start reaches, and a marker that cannot be read must decide nothing."""
292
+ top = _toplevel(os.path.realpath(path))
293
+ if not top:
294
+ return {}
295
+ try:
296
+ with open(os.path.join(top, OWNER_MARKER), encoding="utf-8") as fh:
297
+ text = fh.read(4096)
298
+ except (OSError, UnicodeDecodeError):
299
+ return {}
300
+ out = {}
301
+ for line in text.splitlines():
302
+ key, _, value = line.split("#", 1)[0].partition(":")
303
+ key, value = key.strip().lower(), value.strip().lower()
304
+ if key in OWNER_KEYS and value:
305
+ out[key] = value
306
+ return out
307
+
308
+
309
+ def harness_excluded(path):
310
+ """True when the repository holding `path` declares `harness: excluded`,
311
+ the state in which `root_for` answers None and nothing here is armed."""
312
+ return owner_marker(path).get("harness") == "excluded"
313
+
314
+
315
+ def tasks_disabled(path):
316
+ """True when `path`'s repository says the plan/task machine must not run from
317
+ its plans: `tasks: off`, or `harness: excluded`, which implies it.
318
+
319
+ The narrower of the two settings, and the one a project takes first: the
320
+ task rule turns off while the seams a repository still wants - the scope
321
+ gate, `bin/run-tool`, research, lessons - keep reading its workspace."""
322
+ fields = owner_marker(path)
323
+ return fields.get("harness") == "excluded" or fields.get("tasks") in _OWNER_OFF
324
+
325
+
257
326
  def _toplevel(real):
258
327
  """The nearest directory at or above `real` holding a `.git` entry, else
259
328
  None - the project for a path inside its `.tezgah` (`project_top`)."""
@@ -492,7 +561,10 @@ CONSULT_CLIS = {
492
561
  "--model", "Anthropic Claude"),
493
562
  "codex": (["codex", "exec", "--skip-git-repo-check", "--ephemeral",
494
563
  "-s", "read-only", "--color", "never"], "-m", "OpenAI GPT"),
495
- "opencode": (["opencode", "run", "--pure"], "-m",
564
+ # opencode 2.0.32 dropped the 1.18 `--pure` (`run` exits 1 "Unrecognized
565
+ # flag: --pure") and no flag replaces it, so the member runs the way the
566
+ # user's own `opencode run` does
567
+ "opencode": (["opencode", "run"], "-m",
496
568
  "whichever provider/model opencode is configured for"),
497
569
  "cursor-agent": (["cursor-agent", "-p", "--output-format", "text"],
498
570
  "--model", "whichever model Cursor is configured for"),
@@ -750,6 +822,16 @@ def orx_bin():
750
822
  return which_user(os.environ.get("TEZGAH_ORX_BIN") or ORX)
751
823
 
752
824
 
825
+ def ocr_bin():
826
+ """The open-code-review `ocr` executable, or None when it is not installed.
827
+
828
+ TEZGAH_OCR_BIN points at a specific binary (tests, CI); otherwise the first
829
+ `ocr` on PATH wins, then a known per-user bin dir - the lookup `orx_bin()`
830
+ makes. Optional: without it the reviewer brief is today's (plan 125)."""
831
+ return which_user(os.environ.get("TEZGAH_OCR_BIN") or "ocr")
832
+
833
+
834
+
753
835
  def omp_bin():
754
836
  """The omp CLI, or None when it is not installed.
755
837
 
@@ -1282,10 +1364,24 @@ def ensure_workspace(repo):
1282
1364
  (its worktrees' links are excluded by `link_workspace`). A second call costs
1283
1365
  three stats and one file read: the subprocess runs only when `.tezgah/.git`
1284
1366
  does not exist yet. Fail-open: a read-only tree returns None and the session
1285
- goes on."""
1367
+ goes on.
1368
+
1369
+ A linked worktree never gets a workspace of its own (plan 121): it gets the
1370
+ main checkout's as a link, the same link `link_workspace` makes, so research,
1371
+ migrate and the session start all land in the one store instead of forking a
1372
+ second `.tezgah` that `git worktree remove` deletes."""
1286
1373
  bare = _bare_repo(repo)
1287
1374
  if not bare and not os.path.exists(os.path.join(repo, ".git")):
1288
1375
  return None
1376
+ main = linked_main(repo)
1377
+ if main and main != repo:
1378
+ target = ensure_workspace(main)
1379
+ # A `.tezgah` already on disk - the project's own or a fork an older
1380
+ # tezgah made - is `link_workspace`'s to leave alone; the main
1381
+ # checkout's is what every reader is handed either way.
1382
+ if target and not os.path.lexists(workspace(repo)):
1383
+ link_workspace(repo, main)
1384
+ return target or None
1289
1385
  ws = workspace(repo)
1290
1386
  # A `.tezgah` that is a symlink (or anything but a directory) came with the
1291
1387
  # repository: following it would `git init` inside the target the clone