@r1z4x/tezgah 1.5.1 → 1.7.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 (81) hide show
  1. package/CHANGELOG.md +126 -1
  2. package/MANIFEST +11 -0
  3. package/README.md +6 -3
  4. package/bin/consult +13 -10
  5. package/bin/tezgah-docs +18 -16
  6. package/bin/tezgah-doctor +152 -0
  7. package/bin/tezgah-research +286 -12
  8. package/bin/tezgah-route +48 -1
  9. package/bin/tezgah-setup +27 -14
  10. package/bin/tezgah-task +771 -46
  11. package/bin/tezgah-taste +48 -10
  12. package/docs/architecture.md +7 -4
  13. package/docs/citations-baseline.json +1 -1
  14. package/docs/clarity-baseline.json +5 -5
  15. package/docs/contract.md +112 -25
  16. package/docs/evidence.md +201 -28
  17. package/docs/feature-audit.md +25 -4
  18. package/docs/gate.md +70 -33
  19. package/docs/glossary.md +4 -4
  20. package/docs/hosts.md +8 -8
  21. package/docs/index.json +30 -10
  22. package/docs/judge.md +9 -3
  23. package/docs/models.md +35 -2
  24. package/docs/operations.md +103 -3
  25. package/docs/research.md +392 -13
  26. package/docs/skills.md +24 -6
  27. package/docs/status-line.md +5 -5
  28. package/docs/testing.md +2 -2
  29. package/docs/vision.md +12 -4
  30. package/hooks/hooks.json +2 -2
  31. package/hooks/lang/en.json +323 -0
  32. package/hooks/lang/tr.json +344 -0
  33. package/hooks/projects-posttooluse.py +24 -5
  34. package/hooks/projects-pretooluse.py +9 -4
  35. package/hooks/projects-stop.py +28 -16
  36. package/hooks/tezgah_agents.py +29 -9
  37. package/hooks/tezgah_clarity.py +7 -3
  38. package/hooks/tezgah_components.py +2 -1
  39. package/hooks/tezgah_context.py +460 -390
  40. package/hooks/tezgah_gate.py +640 -104
  41. package/hooks/tezgah_integrity.py +1480 -197
  42. package/hooks/tezgah_models.py +337 -15
  43. package/hooks/tezgah_paths.py +103 -10
  44. package/hooks/tezgah_policy.py +286 -130
  45. package/hooks/tezgah_product.py +107 -0
  46. package/hooks/tezgah_rank.py +29 -27
  47. package/hooks/tezgah_replay.py +200 -30
  48. package/hooks/tezgah_research.py +1297 -12
  49. package/hooks/tezgah_skill_pick.py +58 -17
  50. package/hooks/tezgah_stopspec.py +7 -0
  51. package/hooks/tezgah_store.py +74 -27
  52. package/hooks/tezgah_task.py +917 -8
  53. package/hosts/codex/hook.py +9 -10
  54. package/hosts/cursor/hook.py +21 -14
  55. package/hosts/dsh/hooks.json +2 -2
  56. package/hosts/omp/hook.py +44 -23
  57. package/hosts/omp/tezgah-hook.ts.in +93 -7
  58. package/hosts/opencode/plugins/tezgah.js +119 -39
  59. package/output-styles/tezgah.md +76 -42
  60. package/package.json +1 -1
  61. package/skills/analyze-app/SKILL.md +57 -0
  62. package/skills/design-contract/EVALS.md +24 -1
  63. package/skills/design-contract/SKILL.md +17 -1
  64. package/skills/design-contract/data-views.md +86 -0
  65. package/skills/feature-audit/SKILL.md +32 -3
  66. package/skills/i-have-adhd/EVALS.md +22 -2
  67. package/skills/i-have-adhd/SKILL.md +12 -5
  68. package/skills/plan-add/EVALS.md +8 -8
  69. package/skills/plan-add/SKILL.md +22 -21
  70. package/skills/plan-sync/EVALS.md +2 -2
  71. package/skills/plan-sync/SKILL.md +14 -8
  72. package/skills/pm-frameworks/SKILL.md +6 -0
  73. package/skills/ponytail/EVALS.md +21 -2
  74. package/skills/ponytail/SKILL.md +4 -4
  75. package/skills/product-analysis/EVALS.md +23 -1
  76. package/skills/product-analysis/SKILL.md +50 -11
  77. package/skills/product-flow/EVALS.md +81 -0
  78. package/skills/product-flow/SKILL.md +91 -0
  79. package/skills/research/SKILL.md +99 -2
  80. package/skills/tezgah-contract/EVALS.md +52 -7
  81. package/skills/tezgah-contract/SKILL.md +204 -85
package/docs/vision.md CHANGED
@@ -25,8 +25,10 @@ the workspace's own records; every number below names where it came from.
25
25
  3. **One review per plan, two rounds, fanned out.** Reviewers read the plan's
26
26
  whole diff once, in its verification phase. Round one spawns them together,
27
27
  one per dimension. Only a confirmed critical or major finding opens round two,
28
- and round two reads the fix's delta. After round two the user gets what is
29
- left, or the plan lists it as fix-later. `tezgah-task review` refuses a third
28
+ and round two reads the fix's delta. The session fixes a minor or suggestion
29
+ finding without a new round. The plan lists one fix-later only when it waits
30
+ on a user decision (KARAR). After round two the session fixes what is left,
31
+ or the plan lists it fix-later only with KARAR. `tezgah-task review` refuses a third
30
32
  round (`hooks/tezgah_agents.py::_reviewer_body`, `bin/tezgah-task::cmd_review`).
31
33
  (Measured: the old loop opened a round on any finding and ended only on a
32
34
  clean round. It reviewed one finished plan round after round. In another plan,
@@ -46,10 +48,16 @@ the workspace's own records; every number below names where it came from.
46
48
  | Tier | Command | Wall time |
47
49
  |---|---|---|
48
50
  | edit loop | `tests/impacted.py --run <changed paths>` | 0.1-95 s (integrity+gate: 18 modules, 93.8 s) |
49
- | pre-commit | that set + compileall + ruff (+ `--citations` when hooks/ or bin/ moved) | +~5 s |
50
- | pre-merge, once | `tests/impacted.py --all` + the two e2e scripts | 103.5 s (8 shards; 566.9 s serial) |
51
+ | pre-commit | that set + compileall + ruff | +~5 s |
52
+ | merge step, once | `tests/impacted.py --all` + neuter + `tezgah-docs --citations` and `--clarity` + `render_table.py --acceptance --strict` + the two e2e scripts | 103.5 s for the suite (8 shards; 566.9 s serial), the rest not timed here |
51
53
  | CI | the same, on the matrix in `.github/workflows/ci.yml` | unchanged |
52
54
 
55
+ Nothing in the merge-step row runs inside a turn (`AGENTS.md`, "Checks, by
56
+ tier", and `hooks/tezgah_policy.py::CORE`). The cut came from a replay of 522 turns
57
+ (the check-loop-cost research line, variant D). It kept 0.5958 of the in-turn
58
+ checks and lost no failure the status quo caught. A third of those failures
59
+ surface at the merge step or in CI instead of in the turn.
60
+
53
61
  A path the map does not know runs everything (`tests/impacted.py::modules_for`): `tests/support.py`,
54
62
  `hooks/tezgah_paths.py` and anything new. `tests/test_impacted.py` refuses a
55
63
  change that would silently run nothing.
package/hooks/hooks.json CHANGED
@@ -13,12 +13,12 @@
13
13
  { "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-auto-init.py\"", "timeout": 10 } ] }
14
14
  ],
15
15
  "PreToolUse": [
16
- { "matcher": "Agent|agent|Task|task|Grep|grep|Bash|bash|PowerShell|pwsh|Shell|shell|subagent|Edit|Write|MultiEdit|NotebookEdit", "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-pretooluse.py\"", "timeout": 5 } ] },
16
+ { "matcher": "Agent|agent|Task|task|Grep|grep|Bash|bash|PowerShell|pwsh|Shell|shell|subagent|Edit|Write|MultiEdit|NotebookEdit|AskUserQuestion", "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-pretooluse.py\"", "timeout": 5 } ] },
17
17
  { "matcher": "^mcp__(?:.*[^A-Za-z0-9])?(?:append|cancel|clear|click|close|comment|commit|copy|create|delete|deploy|drag|edit|email|evaluate|exec|execute|fill|insert|install|kill|launch|merge|message|mkdir|move|navigate|notify|patch|pause|post|press|print|publish|push|put|release|remove|rename|replace|reply|resume|review|run|save|send|set|share|skip|start|stop|submit|swipe|tag|tap|terminate|type|uninstall|update|upload|write)(?:[^A-Za-z0-9].*)?$", "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-pretooluse.py\"", "timeout": 5 } ] }
18
18
  ],
19
19
  "PostToolUse": [
20
20
  { "matcher": "Edit|edit|Write|write|MultiEdit|NotebookEdit|Bash|bash|PowerShell|pwsh|str_replace_editor|WebFetch|WebSearch|web_fetch|web_search|fetch|mcp__.*", "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-posttooluse.py\"", "timeout": 5 } ] },
21
- { "matcher": "Agent|Task|Skill", "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-posttooluse.py\"", "timeout": 5 } ] }
21
+ { "matcher": "Agent|Task|Skill|TodoWrite", "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-posttooluse.py\"", "timeout": 5 } ] }
22
22
  ],
23
23
  "PostToolUseFailure": [
24
24
  { "matcher": "Edit|edit|Write|write|MultiEdit|NotebookEdit|Bash|bash|PowerShell|pwsh|str_replace_editor|WebFetch|WebSearch|web_fetch|web_search|fetch|mcp__.*", "hooks": [ { "type": "command", "command": "\"${TEZGAH_PYTHON:-python3}\" \"${CLAUDE_PLUGIN_ROOT}/hooks/projects-posttooluse.py\"", "timeout": 5 } ] }
@@ -0,0 +1,323 @@
1
+ {
2
+ "name": "English",
3
+ "done": [
4
+ "done|complete[d]?|finished|implemented|fixed|shipped|landed|merged|wired up|wired into|all tests? pass|all checks? pass|(?:tests?|checks?|suite) (?:is |are )?(?:green|passing)|build (?:passes|is green)"
5
+ ],
6
+ "verified": [
7
+ "tested|verified|i ran|ran the (?:tests?|suite|build|lint|checks?)"
8
+ ],
9
+ "negated": [
10
+ "unverified|not verified|could ?n[o']t verify|verification (?:was )?skipped"
11
+ ],
12
+ "admitted": [
13
+ "contradict|unsatisfiable|(?:can ?not|can't|can ?never|never) pass|impossible"
14
+ ],
15
+ "sycophant": {
16
+ "interjection": [
17
+ "yes|ah|oh|hmm"
18
+ ],
19
+ "opener": [
20
+ "you'?re (?:absolutely )?right|you are right|absolutely right|good catch|great catch|i didn'?t look closely|i should have checked|my mistake|my bad|sorry, i|great question|let me\\b|i['’]ll\\b|sure[!,.]|looking at your\\b"
21
+ ]
22
+ },
23
+ "closer": [
24
+ "let me know if you need anything else|hope (?:this|that) helps|happy to clarify"
25
+ ],
26
+ "next_action": [
27
+ "next (?:step|action|up)|next:"
28
+ ],
29
+ "preamble": [
30
+ "here(?:'s| is| are)\\b|below\\b|the following\\b"
31
+ ],
32
+ "markers": {
33
+ "letters": [],
34
+ "words": []
35
+ },
36
+ "negation_before": [
37
+ "\\bnot|n't|\\bnever"
38
+ ],
39
+ "question_particle": [],
40
+ "question_end": [],
41
+ "clause_join": [
42
+ "so|and|but"
43
+ ],
44
+ "external_state": [
45
+ "missing|absent|unpublished|exists?|not (?:published|released|found|there|listed|present)|published|released|deprecated|outdated|stale"
46
+ ],
47
+ "external_ci_state": [
48
+ "green|red|passing|passes|passed|failing|fails|failed|behind|flaky"
49
+ ],
50
+ "publish_state": [
51
+ "missing|absent|unpublished|exists?|published|released"
52
+ ],
53
+ "residual_label": [
54
+ "open (?:items?|issues?|questions?|points?|work)|remaining\\b|what(?:'s| is) left|left to do|pending\\b|outstanding\\b|not (?:done|verified|tested|run|checked|covered|looked at)|unverified|untested|unresolved|still open|could(?:n't| not) (?:verify|check|run)|unable to|unchecked|to[ -]?do(?=\\s*(?:\\(|$))|next\\s+(?:steps?|up|actions?)\\b|next(?=\\s*(?:\\(|$))|out of scope|follow[- ]?ups?\\b|deferred|skipped|known (?:issues?|limitations?|bugs?|gaps?)|future (?:work|improvements?)|tech(?:nical)? debt|suggested improvements?|manual (?:verification|checks?|testing)|blockers?\\b|partially"
55
+ ],
56
+ "residual_first": [],
57
+ "label_done": [
58
+ "resolved|addressed|closed"
59
+ ],
60
+ "partial": [
61
+ "partially"
62
+ ],
63
+ "nothing_left": [
64
+ "\\bnone|\\bnothing"
65
+ ],
66
+ "nothing_lead": [
67
+ "no|none|nothing"
68
+ ],
69
+ "empty_item": [
70
+ "none|nothing|n/a"
71
+ ],
72
+ "blockers": {
73
+ "decision": {
74
+ "pattern": "DECISION"
75
+ },
76
+ "irreversible": {
77
+ "pattern": "IRREVERSIBLE"
78
+ },
79
+ "access": {
80
+ "pattern": "ACCESS"
81
+ },
82
+ "env": {
83
+ "pattern": "ENV(?:IRONMENTS?)?"
84
+ },
85
+ "said_not": [
86
+ "not\\b|none\\b|isn"
87
+ ],
88
+ "tried_not": [],
89
+ "absent": []
90
+ },
91
+ "blocker_labels": [
92
+ "blocker"
93
+ ],
94
+ "blockers_only": [
95
+ "blockers?"
96
+ ],
97
+ "env_error": [
98
+ "not found|no such|cannot find|can'?t find|could not find|does(?:n'?t| not) exist|no module named|ModuleNotFound|not installed|not available|unavailable|missing|not set|ENOENT|\\b12[67]\\b|quota|limit exceeded|rate.?limit|\\b429\\b"
99
+ ],
100
+ "access_error": [
101
+ "permission denied|access denied|not permitted|EACCES|\\b40[13]\\b|quota|limit exceeded|rate.?limit|\\b429\\b"
102
+ ],
103
+ "spawn_words": [
104
+ "sub-?agent|\\bagent|provider|\\bmodel|spawn"
105
+ ],
106
+ "was_exclude": [],
107
+ "was": [],
108
+ "now": [],
109
+ "future": [],
110
+ "word_order": "verb_first",
111
+ "ui_objects": [
112
+ "components?|ui|ux|css|layout|styles?|tokens?|themes?|buttons?|cards?|icons?|labels?|elements?|widgets?|containers?|headers?|footers?|sidebars?|toolbars?|navbars?|nav|menu|modals?|dialogs?|dropdowns?|popovers?|tooltips?|badges?|avatars?|spinners?|skeletons?|inputs?|fields?|forms?|headings?|images?|logos?|grids?|panels?|columns?|screens?|pages?|views?|dashboards?|viewport|tables?|app"
113
+ ],
114
+ "ui_quality": [
115
+ "look\\w*|feels?\\w*|seems?\\w*|renders?\\w*"
116
+ ],
117
+ "hints": {
118
+ "spec": [
119
+ "normal (user )?behaviou?r|clean ui|nicer|more intuitive|un?professional|polish(ed)?|improve the (ui|ux)|make it (better|usable|look)|look(s)? better",
120
+ "refactor\\w* (the |this |our )?(\\w+ ){0,2}(components?|ui|ux|css|layout|screens?|pages?|styles?|theme|forms?|fields?|inputs?|views?|widgets?|buttons?|modals?|dialogs?)|ui|ux|css|tailwind|layout|responsive|hover|focus[- ](?:state|ring|outline|visible|indicator|style)|spacing|typography|component\\w*|dark mode|dark theme|light theme",
121
+ {
122
+ "ui_ask": "theme\\w*"
123
+ },
124
+ "animations?|accessib\\w*|wireframe|mockup|align[- ]?(?:items|self|content)|text-align|alignment\\w*|misalign\\w*|padding",
125
+ {
126
+ "ui_ask": "cent(er|re)\\w*"
127
+ },
128
+ {
129
+ "ui_ask": "margins?"
130
+ },
131
+ "gutter\\w*|line-?height|letter-?spacing|drop-?shadow|box-?shadow|border-?radius|corner radius|fonts?[- ](?:size|family|weight|face|stack|scale)\\w*|type ?scale|colou?r[- ](?:role|scheme|palette|token|contrast)|palette|cards?[- ](?:component\\w*|layout|grid|list|view|title|body|footer|header)|sidebars?|toolbars?|modals?|dialogs?|dropdowns?|popovers?|accordions?|tooltips?|toasts?|avatars?",
132
+ {
133
+ "ui_ask": "badges?"
134
+ },
135
+ "breadcrumbs?",
136
+ {
137
+ "ui_ask": "pagination"
138
+ },
139
+ "tab ?bar|steppers?|spinners?",
140
+ {
141
+ "ui_ask": "skeletons?"
142
+ },
143
+ "disabled\\w*|pressed|active state|selected state|empty state|breakpoints?\\w*|viewport|media quer\\w*|design (system|token|guide|library|language)\\w*|style guides?|wcag\\w*|a11y|aria-?\\w*|screen readers?|tab order|keyboard naviga\\w*|contrast (ratio|level|check|issue)|screenshots?|visual (review|regression|diff|check)|redesign\\w*|revamp\\w*|restyle\\w*|makeover",
144
+ {
145
+ "ui_ask": "cluttered"
146
+ },
147
+ "outdated|cohesive"
148
+ ],
149
+ "consult": [
150
+ "architect(ure|ural)|root cause|migrat(e|ion)|deploy|security|trade-?off|which approach|design decision|irreversible|rollback|schema change|re-?architect\\w*|restructur\\w*|rewrite\\w*|(refactor\\w*|rewrite\\w*) (the |this |our )?(\\w+ ){0,2}(module|subsystem|service|system|layer|engine|architecture|data ?model|code ?base|ingest\\w*)|breaking change\\w*|backwards?[- ]incompatib\\w*|api version\\w*|version(ing)? the api|backfill\\w*|revert\\w*|rollback|performance budget|perf budget|latency budget|hot ?path|threat model\\w*|security review\\w*|cve\\b|concurren\\w*|race condition\\w*|deadlock\\w*|capacit\\w* (plan|budget|test|limit)\\w*|scal(e|ing) (plan|strategy|limit|test)\\w*|load test\\w*|adrs?\\b|architecture decision record\\w*|design doc\\w*|rollout"
151
+ ],
152
+ "research": [
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
+ ],
155
+ "product": [
156
+ "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
+ "ui_ask": "(?:admin|users?) table"
159
+ }
160
+ ],
161
+ "graph": [
162
+ "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
+ ]
164
+ },
165
+ "fan_verbs": [
166
+ "fix|add|update|write|remove|delete|rename|move|refactor|document|bump|create|implement|migrate|replace"
167
+ ],
168
+ "fan_join": [
169
+ "and"
170
+ ],
171
+ "fan_ordinals": [
172
+ "first(?:ly)?",
173
+ "second(?:ly)?"
174
+ ],
175
+ "fan_directives": [
176
+ "in parallel|sub-?agent\\w*|worktrees?|fan[- ]?out|orchestrat\\w*"
177
+ ],
178
+ "data_ask": [
179
+ "(?:design|create|make|build|sketch|propose|need|want)\\w* (?:\\w+ ){0,4}(?:dashboard|charts?|visuali[sz]ation)|(?:metri[ck]s?|kpis?|data|sales|revenue) (?:\\w+ ){0,2}dashboard|(?:what|which) (?:\\w+ ){0,3}(?:metri[ck]s|kpis|charts?) (?:\\w+ ){0,3}(?:should|to|do|matter|would)|what should (?:\\w+ ){0,3}dashboard show|(?:choose|pick|define|track|design)(?:s|ing)? (?:\\w+ ){0,3}(?:metri[ck]s|kpis)|(?:metri[ck]s|kpis) (?:should|to|do|would) (?:\\w+ ){0,2}(?:track|measure|use|watch)|success metrics?|(?:suggest|recommend)\\w* (?:\\w+ ){0,3}charts?|visuali[sz]\\w* (?:\\w+ ){0,3}(?:data|numbers)|data visuali[sz]ation"
180
+ ],
181
+ "code_sense": [
182
+ "\\w\\.(?:py|tsx?|jsx?|json|go|rs|ya?ml|sql|java|rb|css|html)\\b|\\b\\w+_\\w+\\b|/metrics\\b|\\bselect\\b.{0,200}?\\bfrom\\b",
183
+ "\\b(?:tables?|columns?|schema|sql|queries|query|bundle|webpack|vite|tests?|ci|counters?|registry|pipeline|backend|handlers?|structs?|endpoints?|exporters?|export\\w*|servers?|librar\\w*|packages?|modules?|database|index\\w*|middleware|debugger|data (?:structure|flow)s?|clipboard|spinner|threads?|commit|git|functions?|class|component|prop|hooks?|prometheus|grafana|kibana|statsd|opentelemetry|config\\w*|provision\\w*|api|routes?|snake_case)\\b"
184
+ ],
185
+ "constraint": {
186
+ "dont": [
187
+ "(?:do not|don'?t|never)\\s+(?:touch|modify|edit|change|delete|remove|rename|push|commit|merge|deploy|publish|release)\\s+(?:(?:the|any|my|this|that|to|a|an)\\s+)?[`\\\"“]?(?P<obj>[\\w~@/-](?:[\\w./@~-]*[\\w@~/-])?)"
188
+ ],
189
+ "ask": [
190
+ "ask\\s+(?:me\\s+)?(?:first\\s+)?before\\s+(?P<ask>\\w+)"
191
+ ],
192
+ "grant": [
193
+ "without asking(?: me)?|no need to ask|(?:you have|you've got) my (?:approval|permission|go-ahead)|\\bi approve\\b|(?:you are|you're) (?:approved|cleared|authori[sz]ed) to|go ahead and (?:push|release|publish|tag|open)\\w*|don'?t ask (?:me )?(?:again|for (?:approval|permission))"
194
+ ],
195
+ "lift": [
196
+ "ask (?:me )?(?:again|first from now on)|from now on,? ask (?:me )?(?:first|before)|(?:revoke|withdraw)\\w* (?:my |the )?(?:approval|permission|grant)"
197
+ ],
198
+ "lift_outward": [
199
+ "(?:don'?t|do not|stop|hold off(?: on)?|never)\\s+(?:\\w+\\s+){0,2}?(?:push|release|publish|tag|deploy|open (?:a |the )?pr)\\w*"
200
+ ],
201
+ "grant_not": [
202
+ "\\b(?:don'?t|do not|never|stop|didn'?t|did not|why did you)\\b"
203
+ ],
204
+ "grant_not_verb": [],
205
+ "grant_not_soft": []
206
+ },
207
+ "ask": {
208
+ "process": [
209
+ "\\b(?:shall|should|can|may) i (?:now |just |also )?(?:proceed|continue|go on|go ahead|start|begin|keep going|move on|carry on|open (?:a|the) plan|commit|merge|run (?:the )?(?:tests?|checks?|suite))\\b|\\b(?:do you want|would you like|want) me to (?:now |also |just )?(?:proceed|continue|go on|go ahead|start|begin|keep going|move on|carry on|commit|merge|open (?:a|the) plan|run (?:the )?(?:tests?|checks?|suite))\\b|\\bwhich (?:one |step |item |part |task )?(?:first|next)\\b|\\bwhere (?:should i|do i|to) start\\b|\\b(?:ok|okay|ready) to (?:proceed|continue|go ahead|start)\\b"
210
+ ],
211
+ "never_default": [
212
+ "force[- ]?push\\w*|--force\\b|rewrit\\w* (?:the )?history|reset --hard|\\bdelet\\w*|\\bdrop (?:the )?(?:table|database|volume)s?|unpublish\\w*|deprecat\\w*|production|\\bprod\\b|migrat\\w*|credential\\w*|password\\w*|secret\\w*|api key|\\baccount\\w*|e-?mail|send (?:it |this |them )?to\\b"
213
+ ],
214
+ "spend": [
215
+ "spend\\w*|\\bpaid\\b|billing|\\bcost\\w*|\\bbudget\\w*|\\busd\\b|\\$\\s?\\d"
216
+ ],
217
+ "default_mark": [
218
+ "recommend\\w*|\\bdefault\\b|i(?:'d| would) (?:pick|go with|choose)|\\bmy pick\\b"
219
+ ],
220
+ "options": [
221
+ "\\bor\\b|\\boptions?\\b|\\balternatives?\\b|\\bvs\\.?(?=\\s)|\\s/\\s|\\b(?:a|1)\\)?\\s.+?,\\s*(?:b|2)\\)?\\s"
222
+ ],
223
+ "cheap_answer": [
224
+ "yes|yep|yeah|ok(?:ay)?|sure|go(?: on| ahead)?|continue|proceed|do it|carry on|keep going|approved"
225
+ ],
226
+ "outward": {
227
+ "push": "\\bpush\\w*",
228
+ "release": "\\brelease\\w*|\\btag(?:s|ged|ging)?\\b|version bump|bump the version",
229
+ "publish": "\\bpublish\\w*|\\bnpm\\b|homebrew|pypi",
230
+ "pr": "pull request|\\bprs?\\b"
231
+ }
232
+ },
233
+ "needle_stop": [
234
+ "while",
235
+ "in",
236
+ "on",
237
+ "at",
238
+ "without",
239
+ "until",
240
+ "unless",
241
+ "and",
242
+ "or",
243
+ "for",
244
+ "to",
245
+ "with",
246
+ "before",
247
+ "after",
248
+ "from",
249
+ "into",
250
+ "of",
251
+ "but"
252
+ ],
253
+ "rank_stopwords": [
254
+ "the",
255
+ "and",
256
+ "that",
257
+ "this",
258
+ "with",
259
+ "for",
260
+ "from",
261
+ "are",
262
+ "was",
263
+ "were",
264
+ "not",
265
+ "but",
266
+ "its",
267
+ "into",
268
+ "than",
269
+ "then",
270
+ "they",
271
+ "them",
272
+ "their",
273
+ "have",
274
+ "has",
275
+ "had",
276
+ "will",
277
+ "would",
278
+ "can",
279
+ "could",
280
+ "should",
281
+ "you",
282
+ "your",
283
+ "what",
284
+ "when",
285
+ "which",
286
+ "who",
287
+ "how",
288
+ "all",
289
+ "any",
290
+ "out"
291
+ ],
292
+ "fold": [],
293
+ "say": {
294
+ "unverified": "unverified",
295
+ "reply_lang": "English",
296
+ "reply_in": "in English, even when the user\nwrites another language",
297
+ "reply_split": "in English, even when the user writes another language",
298
+ "reply_short": "reply English",
299
+ "gap_example": "\"I did not verify this before the deploy; this is how I weighed the risk: ...\"",
300
+ "blocker_tokens": "DECISION, ACCESS, IRREVERSIBLE, ENV",
301
+ "agree_word": "\"you're right\"",
302
+ "opener_short": "\"you're right\", \"good catch\", \"I didn't look closely\"",
303
+ "decision_gloss": "",
304
+ "access_gloss": "",
305
+ "irreversible_gloss": "",
306
+ "env_gloss": "",
307
+ "blockers_heading": "Blockers",
308
+ "decision": "DECISION",
309
+ "access": "ACCESS",
310
+ "irreversible": "IRREVERSIBLE",
311
+ "env": "ENV",
312
+ "done_claim": "done",
313
+ "opener_examples": "\"you're right\", \"absolutely right\", \"good catch\", \"I didn't look closely\", \"I should have checked\"",
314
+ "opener_ban": "never \"you're right\" / \"I didn't look closely\" / an apology",
315
+ "residual_lead": "",
316
+ "slice_lead": "",
317
+ "ready_lead": "",
318
+ "ask_lead": "",
319
+ "approval_heading": "Approval questions",
320
+ "recommended": "Recommended",
321
+ "grant_examples": "\"push without asking\", \"I approve\""
322
+ }
323
+ }