@event4u/agent-config 1.15.0 → 1.17.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 (354) hide show
  1. package/.agent-src/commands/{agents-audit.md → agents/audit.md} +4 -3
  2. package/.agent-src/commands/{agents-cleanup.md → agents/cleanup.md} +12 -6
  3. package/.agent-src/commands/{agents-prepare.md → agents/prepare.md} +4 -3
  4. package/.agent-src/commands/agents.md +46 -0
  5. package/.agent-src/commands/bug-fix.md +1 -1
  6. package/.agent-src/commands/bug-investigate.md +2 -2
  7. package/.agent-src/commands/{chat-history-checkpoint.md → chat-history/checkpoint.md} +5 -5
  8. package/.agent-src/commands/{chat-history-clear.md → chat-history/clear.md} +5 -5
  9. package/.agent-src/commands/{chat-history-resume.md → chat-history/resume.md} +4 -4
  10. package/.agent-src/commands/chat-history/show.md +107 -0
  11. package/.agent-src/commands/chat-history.md +33 -89
  12. package/.agent-src/commands/check-current-md.md +1 -1
  13. package/.agent-src/commands/{commit-in-chunks.md → commit/in-chunks.md} +15 -13
  14. package/.agent-src/commands/commit.md +22 -2
  15. package/.agent-src/commands/{context-create.md → context/create.md} +4 -3
  16. package/.agent-src/commands/{context-refactor.md → context/refactor.md} +4 -3
  17. package/.agent-src/commands/context.md +44 -0
  18. package/.agent-src/commands/{copilot-agents-init.md → copilot-agents/init.md} +4 -3
  19. package/.agent-src/commands/{copilot-agents-optimize.md → copilot-agents/optimize.md} +4 -3
  20. package/.agent-src/commands/copilot-agents.md +44 -0
  21. package/.agent-src/commands/council/default.md +221 -0
  22. package/.agent-src/commands/council/design.md +97 -0
  23. package/.agent-src/commands/council/optimize.md +116 -0
  24. package/.agent-src/commands/council/pr.md +124 -0
  25. package/.agent-src/commands/council.md +54 -0
  26. package/.agent-src/commands/{create-pr-description.md → create-pr/description-only.md} +4 -2
  27. package/.agent-src/commands/create-pr.md +49 -5
  28. package/.agent-src/commands/e2e-heal.md +1 -1
  29. package/.agent-src/commands/e2e-plan.md +1 -1
  30. package/.agent-src/commands/{feature-dev.md → feature/dev.md} +6 -3
  31. package/.agent-src/commands/{feature-explore.md → feature/explore.md} +5 -4
  32. package/.agent-src/commands/{feature-plan.md → feature/plan.md} +32 -5
  33. package/.agent-src/commands/{feature-refactor.md → feature/refactor.md} +4 -3
  34. package/.agent-src/commands/{feature-roadmap.md → feature/roadmap.md} +7 -6
  35. package/.agent-src/commands/feature.md +52 -0
  36. package/.agent-src/commands/{fix-ci.md → fix/ci.md} +4 -3
  37. package/.agent-src/commands/{fix-portability.md → fix/portability.md} +4 -3
  38. package/.agent-src/commands/{fix-pr-bot-comments.md → fix/pr-bots.md} +4 -3
  39. package/.agent-src/commands/{fix-pr-developer-comments.md → fix/pr-developers.md} +4 -3
  40. package/.agent-src/commands/{fix-pr-comments.md → fix/pr.md} +7 -6
  41. package/.agent-src/commands/{fix-references.md → fix/refs.md} +4 -3
  42. package/.agent-src/commands/{fix-seeder.md → fix/seeder.md} +4 -3
  43. package/.agent-src/commands/fix.md +54 -0
  44. package/.agent-src/commands/jira-ticket.md +1 -1
  45. package/.agent-src/commands/{do-and-judge.md → judge/on-diff.md} +7 -6
  46. package/.agent-src/commands/judge/solo.md +90 -0
  47. package/.agent-src/commands/{do-in-steps.md → judge/steps.md} +8 -7
  48. package/.agent-src/commands/judge.md +35 -70
  49. package/.agent-src/commands/{memory-add.md → memory/add.md} +7 -6
  50. package/.agent-src/commands/{memory-full.md → memory/load.md} +6 -5
  51. package/.agent-src/commands/{memory-promote.md → memory/promote.md} +6 -5
  52. package/.agent-src/commands/{propose-memory.md → memory/propose.md} +6 -5
  53. package/.agent-src/commands/memory.md +48 -0
  54. package/.agent-src/commands/mode.md +5 -5
  55. package/.agent-src/commands/{module-create.md → module/create.md} +4 -3
  56. package/.agent-src/commands/{module-explore.md → module/explore.md} +4 -3
  57. package/.agent-src/commands/module.md +44 -0
  58. package/.agent-src/commands/onboard.md +3 -3
  59. package/.agent-src/commands/{optimize-agents.md → optimize/agents.md} +5 -4
  60. package/.agent-src/commands/{optimize-augmentignore.md → optimize/augmentignore.md} +4 -4
  61. package/.agent-src/commands/{optimize-rtk-filters.md → optimize/rtk.md} +4 -3
  62. package/.agent-src/commands/{optimize-skills.md → optimize/skills.md} +5 -4
  63. package/.agent-src/commands/optimize.md +48 -0
  64. package/.agent-src/commands/{override-create.md → override/create.md} +4 -3
  65. package/.agent-src/commands/{override-manage.md → override/manage.md} +4 -3
  66. package/.agent-src/commands/override.md +44 -0
  67. package/.agent-src/commands/review-changes.md +26 -1
  68. package/.agent-src/commands/review-routing.md +1 -1
  69. package/.agent-src/commands/{roadmap-create.md → roadmap/create.md} +33 -5
  70. package/.agent-src/commands/{roadmap-execute.md → roadmap/execute.md} +4 -3
  71. package/.agent-src/commands/roadmap.md +44 -0
  72. package/.agent-src/commands/set-cost-profile.md +3 -3
  73. package/.agent-src/commands/sync-agent-settings.md +2 -2
  74. package/.agent-src/commands/{tests-create.md → tests/create.md} +5 -4
  75. package/.agent-src/commands/{tests-execute.md → tests/execute.md} +4 -3
  76. package/.agent-src/commands/tests.md +44 -0
  77. package/.agent-src/commands/upstream-contribute.md +1 -1
  78. package/.agent-src/contexts/authority/commit-mechanics.md +57 -0
  79. package/.agent-src/contexts/authority/destructive-mechanics.md +66 -0
  80. package/.agent-src/contexts/authority/scope-mechanics.md +87 -0
  81. package/.agent-src/contexts/communication/rules-auto/artifact-engagement-recording-mechanics.md +72 -0
  82. package/.agent-src/contexts/communication/rules-auto/augment-portability-mechanics.md +79 -0
  83. package/.agent-src/contexts/communication/rules-auto/augment-source-of-truth-mechanics.md +98 -0
  84. package/.agent-src/contexts/communication/rules-auto/cli-output-handling-mechanics.md +87 -0
  85. package/.agent-src/contexts/communication/rules-auto/command-suggestion-policy-mechanics.md +62 -0
  86. package/.agent-src/contexts/communication/rules-auto/docs-sync-mechanics.md +78 -0
  87. package/.agent-src/contexts/communication/rules-auto/package-ci-checks-mechanics.md +85 -0
  88. package/.agent-src/contexts/communication/rules-auto/review-routing-awareness-mechanics.md +65 -0
  89. package/.agent-src/contexts/communication/rules-auto/roadmap-progress-sync-mechanics.md +78 -0
  90. package/.agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +62 -0
  91. package/.agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +55 -0
  92. package/.agent-src/contexts/communication/rules-auto/ui-audit-gate-mechanics.md +53 -0
  93. package/.agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +77 -0
  94. package/.agent-src/contexts/execution/autonomy-detection.md +54 -0
  95. package/.agent-src/contexts/execution/autonomy-examples.md +90 -0
  96. package/.agent-src/contexts/execution/autonomy-mechanics.md +29 -0
  97. package/.agent-src/contexts/execution/verification-mechanics.md +80 -0
  98. package/.agent-src/contexts/judges/no-consolidate-rationale.md +102 -0
  99. package/.agent-src/contexts/judges/persona-voice-rubric.md +140 -0
  100. package/.agent-src/personas/README.md +1 -1
  101. package/.agent-src/rules/agent-authority.md +24 -0
  102. package/.agent-src/rules/architecture.md +1 -1
  103. package/.agent-src/rules/artifact-drafting-protocol.md +1 -1
  104. package/.agent-src/rules/artifact-engagement-recording.md +14 -70
  105. package/.agent-src/rules/ask-when-uncertain.md +28 -43
  106. package/.agent-src/rules/augment-portability.md +15 -61
  107. package/.agent-src/rules/augment-source-of-truth.md +27 -93
  108. package/.agent-src/rules/autonomous-execution.md +78 -114
  109. package/.agent-src/rules/capture-learnings.md +1 -1
  110. package/.agent-src/rules/chat-history-cadence.md +3 -3
  111. package/.agent-src/rules/chat-history-ownership.md +3 -3
  112. package/.agent-src/rules/chat-history-visibility.md +3 -3
  113. package/.agent-src/rules/cli-output-handling.md +10 -76
  114. package/.agent-src/rules/command-suggestion-policy.md +93 -0
  115. package/.agent-src/rules/commit-conventions.md +17 -14
  116. package/.agent-src/rules/commit-policy.md +14 -42
  117. package/.agent-src/rules/context-hygiene.md +3 -3
  118. package/.agent-src/rules/direct-answers.md +34 -49
  119. package/.agent-src/rules/docker-commands.md +5 -5
  120. package/.agent-src/rules/docs-sync.md +16 -70
  121. package/.agent-src/rules/e2e-testing.md +1 -1
  122. package/.agent-src/rules/guidelines.md +4 -4
  123. package/.agent-src/rules/improve-before-implement.md +2 -2
  124. package/.agent-src/rules/language-and-tone.md +50 -133
  125. package/.agent-src/rules/minimal-safe-diff.md +3 -3
  126. package/.agent-src/rules/missing-tool-handling.md +28 -22
  127. package/.agent-src/rules/model-recommendation.md +4 -4
  128. package/.agent-src/rules/no-cheap-questions.md +82 -0
  129. package/.agent-src/rules/no-roadmap-references.md +73 -0
  130. package/.agent-src/rules/non-destructive-by-default.md +15 -49
  131. package/.agent-src/rules/onboarding-gate.md +5 -5
  132. package/.agent-src/rules/package-ci-checks.md +21 -61
  133. package/.agent-src/rules/preservation-guard.md +64 -29
  134. package/.agent-src/rules/review-routing-awareness.md +26 -45
  135. package/.agent-src/rules/roadmap-progress-sync.md +28 -96
  136. package/.agent-src/rules/role-mode-adherence.md +2 -2
  137. package/.agent-src/rules/scope-control.md +65 -46
  138. package/.agent-src/rules/security-sensitive-stop.md +9 -9
  139. package/.agent-src/rules/size-enforcement.md +1 -1
  140. package/.agent-src/rules/skill-quality.md +16 -48
  141. package/.agent-src/rules/{slash-commands.md → slash-command-routing-policy.md} +7 -4
  142. package/.agent-src/rules/think-before-action.md +55 -45
  143. package/.agent-src/rules/token-efficiency.md +4 -4
  144. package/.agent-src/rules/tool-safety.md +19 -16
  145. package/.agent-src/rules/{ui-audit-before-build.md → ui-audit-gate.md} +27 -41
  146. package/.agent-src/rules/user-interaction.md +16 -71
  147. package/.agent-src/rules/verify-before-complete.md +12 -67
  148. package/.agent-src/scripts/update_roadmap_progress.py +9 -4
  149. package/.agent-src/skills/ai-council/SKILL.md +335 -0
  150. package/.agent-src/skills/api-endpoint/SKILL.md +2 -2
  151. package/.agent-src/skills/api-testing/SKILL.md +1 -1
  152. package/.agent-src/skills/blade-ui/SKILL.md +1 -1
  153. package/.agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
  154. package/.agent-src/skills/bug-analyzer/SKILL.md +1 -1
  155. package/.agent-src/skills/check-refs/SKILL.md +59 -40
  156. package/.agent-src/skills/command-routing/SKILL.md +1 -1
  157. package/.agent-src/skills/command-writing/SKILL.md +1 -1
  158. package/.agent-src/skills/conventional-commits-writing/SKILL.md +86 -28
  159. package/.agent-src/skills/copilot-agents-optimization/SKILL.md +7 -7
  160. package/.agent-src/skills/developer-like-execution/SKILL.md +6 -6
  161. package/.agent-src/skills/finishing-a-development-branch/SKILL.md +101 -65
  162. package/.agent-src/skills/flux/SKILL.md +31 -11
  163. package/.agent-src/skills/git-workflow/SKILL.md +1 -1
  164. package/.agent-src/skills/github-ci/SKILL.md +2 -2
  165. package/.agent-src/skills/guideline-writing/SKILL.md +11 -11
  166. package/.agent-src/skills/judge-code-quality/SKILL.md +7 -8
  167. package/.agent-src/skills/judge-security-auditor/SKILL.md +4 -5
  168. package/.agent-src/skills/judge-test-coverage/SKILL.md +3 -4
  169. package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +4 -4
  170. package/.agent-src/skills/lint-skills/SKILL.md +57 -39
  171. package/.agent-src/skills/livewire/SKILL.md +1 -1
  172. package/.agent-src/skills/md-language-check/SKILL.md +61 -39
  173. package/.agent-src/skills/override-management/SKILL.md +7 -7
  174. package/.agent-src/skills/php-coder/SKILL.md +1 -1
  175. package/.agent-src/skills/playwright-testing/SKILL.md +2 -2
  176. package/.agent-src/skills/quality-tools/SKILL.md +2 -2
  177. package/.agent-src/skills/react-shadcn-ui/SKILL.md +116 -43
  178. package/.agent-src/skills/readme-reviewer/SKILL.md +31 -30
  179. package/.agent-src/skills/readme-writing/SKILL.md +79 -54
  180. package/.agent-src/skills/readme-writing-package/SKILL.md +51 -48
  181. package/.agent-src/skills/receiving-code-review/SKILL.md +53 -48
  182. package/.agent-src/skills/refine-prompt/SKILL.md +0 -1
  183. package/.agent-src/skills/requesting-code-review/SKILL.md +35 -30
  184. package/.agent-src/skills/review-routing/SKILL.md +2 -2
  185. package/.agent-src/skills/rule-writing/SKILL.md +1 -1
  186. package/.agent-src/skills/security/SKILL.md +7 -2
  187. package/.agent-src/skills/security-audit/SKILL.md +7 -3
  188. package/.agent-src/skills/skill-reviewer/SKILL.md +1 -1
  189. package/.agent-src/skills/skill-writing/SKILL.md +3 -3
  190. package/.agent-src/skills/subagent-orchestration/SKILL.md +1 -0
  191. package/.agent-src/skills/systematic-debugging/SKILL.md +69 -61
  192. package/.agent-src/skills/test-driven-development/SKILL.md +59 -57
  193. package/.agent-src/skills/test-performance/SKILL.md +0 -1
  194. package/.agent-src/skills/traefik/SKILL.md +4 -4
  195. package/.agent-src/skills/upstream-contribute/SKILL.md +1 -1
  196. package/.agent-src/skills/validate-feature-fit/SKILL.md +2 -2
  197. package/.agent-src/skills/{verify-before-complete → verify-completion-evidence}/SKILL.md +30 -28
  198. package/.agent-src/templates/agent-settings.md +8 -8
  199. package/.agent-src/templates/contexts/auth-model.md +1 -1
  200. package/.agent-src/templates/scripts/README.md +2 -2
  201. package/.agent-src/templates/scripts/telemetry/aggregator.py +16 -1
  202. package/.agent-src/templates/scripts/telemetry/engagement.py +59 -0
  203. package/.agent-src/templates/scripts/telemetry/report_renderer.py +28 -1
  204. package/.agent-src/templates/scripts/telemetry_record.py +14 -1
  205. package/.claude-plugin/marketplace.json +31 -12
  206. package/AGENTS.md +11 -9
  207. package/CHANGELOG.md +213 -2
  208. package/README.md +43 -44
  209. package/config/agent-settings.template.yml +58 -1
  210. package/config/gitignore-block.txt +3 -0
  211. package/docs/architecture.md +5 -7
  212. package/docs/catalog.md +359 -0
  213. package/docs/contracts/STABILITY.md +46 -1
  214. package/docs/contracts/adr-chat-history-split.md +1 -3
  215. package/docs/contracts/adr-command-suggestion.md +3 -5
  216. package/docs/contracts/adr-implement-ticket-runtime.md +1 -2
  217. package/docs/contracts/adr-product-ui-track.md +5 -8
  218. package/docs/contracts/adr-prompt-driven-execution.md +3 -4
  219. package/docs/contracts/agent-memory-contract.md +8 -13
  220. package/docs/contracts/artifact-engagement-flow.md +7 -10
  221. package/docs/contracts/command-clusters.md +56 -46
  222. package/docs/contracts/command-suggestion-flow.md +4 -6
  223. package/docs/contracts/context-paths.md +99 -0
  224. package/docs/contracts/file-ownership-matrix.json +6722 -0
  225. package/docs/contracts/file-ownership-matrix.md +134 -0
  226. package/docs/contracts/implement-ticket-flow.md +8 -11
  227. package/docs/contracts/linear-ai-rules-inclusion.md +1 -2
  228. package/docs/contracts/linear-ai-three-layers.md +0 -2
  229. package/docs/contracts/load-context-budget-model.md +178 -0
  230. package/docs/contracts/load-context-schema.md +184 -0
  231. package/docs/contracts/rule-interactions.md +0 -1
  232. package/docs/contracts/rule-interactions.yml +96 -0
  233. package/docs/contracts/rule-priority-hierarchy.md +87 -0
  234. package/docs/contracts/ui-track-flow.md +8 -18
  235. package/docs/customization.md +16 -0
  236. package/docs/end-to-end-walkthroughs.md +165 -0
  237. package/docs/getting-started.md +29 -10
  238. package/docs/github-topics.md +12 -3
  239. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +100 -0
  240. package/docs/guidelines/agent-infra/language-and-tone-examples.md +79 -0
  241. package/{.agent-src → docs}/guidelines/docs/readme-size-and-splitting.md +26 -25
  242. package/docs/guidelines/php/git.md +164 -0
  243. package/docs/migrations/commands-1.15.0.md +1 -1
  244. package/docs/showcase.md +9 -4
  245. package/docs/skills-catalog.md +14 -8
  246. package/docs/ui-track-mental-model.md +2 -2
  247. package/llms.txt +13 -7
  248. package/package.json +1 -1
  249. package/scripts/_one_off_phase4_dispatch_latency.py +108 -0
  250. package/scripts/_one_off_phase6_trigger_jaccard.py +92 -0
  251. package/scripts/_phase2_shim_helper.py +109 -0
  252. package/scripts/agent-config +33 -0
  253. package/scripts/ai_council/__init__.py +39 -0
  254. package/scripts/ai_council/_default_prices.py +41 -0
  255. package/scripts/ai_council/_one_off_2a4_acceptance.py +208 -0
  256. package/scripts/ai_council/_one_off_context_layer_v1_estimate.py +67 -0
  257. package/scripts/ai_council/_one_off_context_layer_v1_review.py +292 -0
  258. package/scripts/ai_council/_one_off_followups_review.py +259 -0
  259. package/scripts/ai_council/_one_off_nondestructive_inline_audit.py +209 -0
  260. package/scripts/ai_council/_one_off_phase_2a_budget_rebalance.py +257 -0
  261. package/scripts/ai_council/_one_off_phase_2a_post_revert.py +197 -0
  262. package/scripts/ai_council/_one_off_rebalancing_audit.py +149 -0
  263. package/scripts/ai_council/_one_off_roundtrip.py +106 -0
  264. package/scripts/ai_council/_one_off_rule_hardening_v1.py +251 -0
  265. package/scripts/ai_council/_one_off_structural_open_questions.py +232 -0
  266. package/scripts/ai_council/_one_off_structural_optimization.py +144 -0
  267. package/scripts/ai_council/_one_off_structural_v3_gaps.py +252 -0
  268. package/scripts/ai_council/_one_off_structural_v3_review.py +240 -0
  269. package/scripts/ai_council/budget_guard.py +172 -0
  270. package/scripts/ai_council/bundler.py +261 -0
  271. package/scripts/ai_council/clients.py +381 -0
  272. package/scripts/ai_council/modes.py +127 -0
  273. package/scripts/ai_council/orchestrator.py +350 -0
  274. package/scripts/ai_council/pricing.py +213 -0
  275. package/scripts/ai_council/project_context.py +159 -0
  276. package/scripts/ai_council/prompts.py +232 -0
  277. package/scripts/ai_council/session.py +144 -0
  278. package/scripts/check_always_budget.py +444 -0
  279. package/scripts/check_augmentignore.py +69 -0
  280. package/scripts/check_cluster_patterns.py +159 -0
  281. package/scripts/check_command_count_messaging.py +127 -0
  282. package/scripts/check_context_paths.py +201 -0
  283. package/scripts/check_no_roadmap_refs.py +155 -0
  284. package/scripts/check_phase_coupling.py +148 -0
  285. package/scripts/check_portability.py +57 -0
  286. package/scripts/check_public_catalog_links.py +122 -0
  287. package/scripts/check_references.py +33 -3
  288. package/scripts/check_roadmap_trackable.py +111 -0
  289. package/scripts/check_safety_floor_untouched.py +125 -0
  290. package/scripts/command_suggester/cooldown.py +1 -1
  291. package/scripts/command_suggester/loader.py +4 -1
  292. package/scripts/compress.py +59 -13
  293. package/scripts/generate_index.py +270 -0
  294. package/scripts/generate_ownership_matrix.py +323 -0
  295. package/scripts/hooks/augment-roadmap-progress.sh +57 -0
  296. package/scripts/install.py +49 -28
  297. package/scripts/install_anthropic_key.sh +5 -0
  298. package/scripts/install_openai_key.sh +106 -0
  299. package/scripts/lint_load_context.py +163 -0
  300. package/scripts/lint_no_new_atomic_commands.py +12 -11
  301. package/scripts/requirements-evals.txt +1 -0
  302. package/scripts/roadmap_progress_hook.py +159 -0
  303. package/scripts/schemas/command.schema.json +22 -1
  304. package/scripts/schemas/rule.schema.json +10 -0
  305. package/scripts/skill_linter.py +13 -4
  306. package/scripts/sync_agent_settings.py +26 -3
  307. package/scripts/update_counts.py +16 -4
  308. package/scripts/update_prices.py +124 -0
  309. package/.agent-src/guidelines/php/git.md +0 -96
  310. package/.agent-src/rules/command-suggestion.md +0 -134
  311. /package/{.agent-src → docs}/guidelines/agent-infra/agent-interaction-and-decision-quality.md +0 -0
  312. /package/{.agent-src → docs}/guidelines/agent-infra/break-glass-usage.md +0 -0
  313. /package/{.agent-src → docs}/guidelines/agent-infra/developer-judgment.md +0 -0
  314. /package/{.agent-src → docs}/guidelines/agent-infra/engineering-memory-data-format.md +0 -0
  315. /package/{.agent-src → docs}/guidelines/agent-infra/layered-settings.md +0 -0
  316. /package/{.agent-src → docs}/guidelines/agent-infra/memory-access.md +0 -0
  317. /package/{.agent-src → docs}/guidelines/agent-infra/naming.md +0 -0
  318. /package/{.agent-src → docs}/guidelines/agent-infra/output-patterns.md +0 -0
  319. /package/{.agent-src → docs}/guidelines/agent-infra/review-routing-data-format.md +0 -0
  320. /package/{.agent-src → docs}/guidelines/agent-infra/role-contracts.md +0 -0
  321. /package/{.agent-src → docs}/guidelines/agent-infra/role-mode-router.md +0 -0
  322. /package/{.agent-src → docs}/guidelines/agent-infra/runtime-layer.md +0 -0
  323. /package/{.agent-src → docs}/guidelines/agent-infra/self-improvement-pipeline.md +0 -0
  324. /package/{.agent-src → docs}/guidelines/agent-infra/size-and-scope.md +0 -0
  325. /package/{.agent-src → docs}/guidelines/agent-infra/tool-integration.md +0 -0
  326. /package/{.agent-src → docs}/guidelines/e2e/playwright.md +0 -0
  327. /package/{.agent-src → docs}/guidelines/php/api-design.md +0 -0
  328. /package/{.agent-src → docs}/guidelines/php/artisan-commands.md +0 -0
  329. /package/{.agent-src → docs}/guidelines/php/blade-ui.md +0 -0
  330. /package/{.agent-src → docs}/guidelines/php/controllers.md +0 -0
  331. /package/{.agent-src → docs}/guidelines/php/database.md +0 -0
  332. /package/{.agent-src → docs}/guidelines/php/eloquent.md +0 -0
  333. /package/{.agent-src → docs}/guidelines/php/flux.md +0 -0
  334. /package/{.agent-src → docs}/guidelines/php/general.md +0 -0
  335. /package/{.agent-src → docs}/guidelines/php/jobs.md +0 -0
  336. /package/{.agent-src → docs}/guidelines/php/livewire.md +0 -0
  337. /package/{.agent-src → docs}/guidelines/php/logging.md +0 -0
  338. /package/{.agent-src → docs}/guidelines/php/naming.md +0 -0
  339. /package/{.agent-src → docs}/guidelines/php/patterns/dependency-injection.md +0 -0
  340. /package/{.agent-src → docs}/guidelines/php/patterns/dtos.md +0 -0
  341. /package/{.agent-src → docs}/guidelines/php/patterns/events.md +0 -0
  342. /package/{.agent-src → docs}/guidelines/php/patterns/factory.md +0 -0
  343. /package/{.agent-src → docs}/guidelines/php/patterns/pipelines.md +0 -0
  344. /package/{.agent-src → docs}/guidelines/php/patterns/policies.md +0 -0
  345. /package/{.agent-src → docs}/guidelines/php/patterns/repositories.md +0 -0
  346. /package/{.agent-src → docs}/guidelines/php/patterns/service-layer.md +0 -0
  347. /package/{.agent-src → docs}/guidelines/php/patterns/strategy.md +0 -0
  348. /package/{.agent-src → docs}/guidelines/php/patterns.md +0 -0
  349. /package/{.agent-src → docs}/guidelines/php/performance.md +0 -0
  350. /package/{.agent-src → docs}/guidelines/php/resources.md +0 -0
  351. /package/{.agent-src → docs}/guidelines/php/security.md +0 -0
  352. /package/{.agent-src → docs}/guidelines/php/sql.md +0 -0
  353. /package/{.agent-src → docs}/guidelines/php/validations.md +0 -0
  354. /package/{.agent-src → docs}/guidelines/php/websocket.md +0 -0
@@ -136,9 +136,7 @@ def read_text(path: Path) -> str:
136
136
  # --- Role-contract anchor cache (see road-to-role-modes Phase 1) ---
137
137
  # Populated lazily so the linter stays fast when the guideline is absent.
138
138
  _ROLE_CONTRACT_CANDIDATES = (
139
- Path(".agent-src.uncompressed/guidelines/agent-infra/role-contracts.md"),
140
- Path(".agent-src/guidelines/agent-infra/role-contracts.md"),
141
- Path(".augment/guidelines/agent-infra/role-contracts.md"),
139
+ Path("docs/guidelines/agent-infra/role-contracts.md"),
142
140
  )
143
141
  _ROLE_CONTRACT_SLUGS_CACHE: Optional[set[str]] = None
144
142
 
@@ -373,7 +371,8 @@ def lint_skill(path: Path, text: str) -> LintResult:
373
371
 
374
372
  if description:
375
373
  if len(description) > 200:
376
- issues.append(Issue("warning", "description_too_long", "Description is longer than 200 characters"))
374
+ issues.append(Issue("error", "description_too_long",
375
+ f"Description is {len(description)} chars (hard cap: 200) — see road-to-governance-cleanup F6"))
377
376
  for pattern in TRIGGER_WARNING_PATTERNS:
378
377
  if re.search(pattern, description, re.IGNORECASE):
379
378
  issues.append(Issue("warning", "weak_trigger", f"Description looks too generic: {description}"))
@@ -716,6 +715,12 @@ def lint_rule(path: Path, text: str) -> LintResult:
716
715
  if not description:
717
716
  issues.append(Issue("error", "auto_missing_description", "Auto rules require a 'description' field for matching"))
718
717
 
718
+ # description length cap (F6 — 200-char hard cap, see road-to-governance-cleanup)
719
+ rule_description = extract_description(text)
720
+ if rule_description and len(rule_description) > 200:
721
+ issues.append(Issue("error", "description_too_long",
722
+ f"Description is {len(rule_description)} chars (hard cap: 200) — see road-to-governance-cleanup F6"))
723
+
719
724
  # always-rules that look like auto candidates (rule-type-governance check)
720
725
  if rule_type == "always":
721
726
  description = extract_description(text) or ""
@@ -863,6 +868,9 @@ def lint_command(path: Path, text: str) -> LintResult:
863
868
  description = extract_description(text)
864
869
  if not description:
865
870
  issues.append(Issue("warning", "missing_description", "Frontmatter description is missing"))
871
+ elif len(description) > 200:
872
+ issues.append(Issue("error", "description_too_long",
873
+ f"Description is {len(description)} chars (hard cap: 200) — see road-to-governance-cleanup F6"))
866
874
 
867
875
  # suggestion block (road-to-context-aware-command-suggestion Phase 2)
868
876
  issues.extend(_lint_command_suggestion_block(text))
@@ -878,6 +886,7 @@ def lint_command(path: Path, text: str) -> LintResult:
878
886
  "error", "shim_missing_warning",
879
887
  "Deprecation shim must contain a one-line warning matching "
880
888
  "'⚠️ /<old-name> is deprecated; use /<cluster> <sub> instead.'"
889
+ " (or '/<cluster> --<flag>' for flag-clusters)"
881
890
  " (see docs/contracts/command-clusters.md § Deprecation shim contract)"
882
891
  ))
883
892
 
@@ -2,7 +2,7 @@
2
2
  """Sync `.agent-settings.yml` against the template + profile.
3
3
 
4
4
  Applies the section-aware merge rules documented in
5
- `.agent-src.uncompressed/guidelines/agent-infra/layered-settings.md`:
5
+ `docs/guidelines/agent-infra/layered-settings.md`:
6
6
 
7
7
  - Template section order always wins — reorder keys to match.
8
8
  - Existing user scalar values are preserved verbatim (as parsed).
@@ -136,8 +136,31 @@ def _append_unknown(body: str, user_flat: dict[str, object], known: set[str]) ->
136
136
 
137
137
 
138
138
  def render_target(template_body: str, user_data: dict) -> str:
139
- """Return the desired `.agent-settings.yml` body for the given user data."""
140
- user_flat = _flatten(user_data) if user_data else {}
139
+ """Return the desired `.agent-settings.yml` body for the given user data.
140
+
141
+ The trailing ``_user:`` block (emitted by :func:`_append_unknown`) is
142
+ already in dotted-key form on every read after the first sync. Re-
143
+ flattening it would prepend another ``_user.`` segment on every run
144
+ and accumulate forever, so we strip the wrapper and merge its
145
+ contents straight into the flat dict.
146
+ """
147
+ if user_data:
148
+ user_only = user_data.pop("_user", None) if isinstance(user_data, dict) else None
149
+ user_flat = _flatten(user_data)
150
+ if isinstance(user_only, dict):
151
+ for key, value in user_only.items():
152
+ # Dotted keys round-trip verbatim — never re-flatten them.
153
+ if isinstance(key, str):
154
+ # Heal legacy corruption: pre-fix syncs prepended a
155
+ # `_user.` segment per run, so a key may carry an
156
+ # arbitrary number of them. Strip them all back to
157
+ # the original leaf path.
158
+ healed = key
159
+ while healed.startswith("_user."):
160
+ healed = healed[len("_user."):]
161
+ user_flat[healed] = value
162
+ else:
163
+ user_flat = {}
141
164
  known = _template_keys(template_body)
142
165
  body = _apply_user_values(template_body, user_flat)
143
166
  return _append_unknown(body, user_flat, known)
@@ -28,14 +28,22 @@ def count(kind: str) -> int:
28
28
  if kind == "skills":
29
29
  return sum(1 for _ in (SRC / "skills").rglob("SKILL.md"))
30
30
  if kind == "guidelines":
31
- # guidelines are grouped by topic subdirectory
32
- return sum(1 for _ in (SRC / "guidelines").rglob("*.md"))
31
+ # Guidelines live under docs/guidelines/{topic}/ they are reference
32
+ # material, not packaged artefacts. Recursive walk to count every .md.
33
+ return sum(1 for _ in (REPO_ROOT / "docs" / "guidelines").rglob("*.md"))
33
34
  if kind == "personas":
34
35
  # personas live as flat .md files, README excluded
35
36
  pdir = SRC / "personas"
36
37
  if not pdir.exists():
37
38
  return 0
38
39
  return sum(1 for f in pdir.glob("*.md") if f.name != "README.md")
40
+ if kind == "commands":
41
+ # Commands may be flat (`commands/<name>.md`) or nested under a
42
+ # cluster directory (`commands/<cluster>/<sub>.md`). Walk the tree
43
+ # and skip the AGENTS.md reference orchestrator.
44
+ return sum(
45
+ 1 for f in (SRC / kind).rglob("*.md") if f.name != "AGENTS.md"
46
+ )
39
47
  return sum(1 for _ in (SRC / kind).glob("*.md"))
40
48
 
41
49
 
@@ -47,12 +55,16 @@ TARGETS: list[tuple[str, list[tuple[str, str]]]] = [
47
55
  [
48
56
  (r"(Browse all )(\d+)( commands\])", "commands"),
49
57
  (r"(package \(rules \+ )(\d+)( skills)", "skills"),
50
- (r"(skills \+ )(\d+)( native commands)", "commands"),
51
58
  # Hero line: **NNN Skills** · **NNN Rules** · **NNN Commands** · **NNN Guidelines**
52
59
  (r"(<strong>)(\d+)( Skills</strong>)", "skills"),
53
60
  (r"(<strong>)(\d+)( Rules</strong>)", "rules"),
54
- (r"(<strong>)(\d+)( Commands</strong>)", "commands"),
55
61
  (r"(<strong>)(\d+)( Guidelines</strong>)", "guidelines"),
62
+ # NOTE: hero `<strong>N Commands</strong>` and tools-blurb
63
+ # `skills + N native commands` are owned by
64
+ # `check_command_count_messaging.py` (Phase-1.2 of
65
+ # road-to-pr-34-followups). Those surfaces advertise the
66
+ # **active** command count (total − deprecation shims), not
67
+ # the raw file count this script computes.
56
68
  ],
57
69
  ),
58
70
  (
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env python3
2
+ """Refresh `.agent-prices.md` from the LiteLLM model-prices feed.
3
+
4
+ Source: https://raw.githubusercontent.com/BerriAI/litellm/main/
5
+ model_prices_and_context_window.json
6
+
7
+ Network failure or invalid response → fall back to
8
+ `scripts.ai_council._default_prices.DEFAULT_PRICES` so the file is
9
+ always written. Stdlib only; no extra dependency.
10
+
11
+ Usage:
12
+ python3 scripts/update_prices.py # writes .agent-prices.md
13
+ python3 scripts/update_prices.py --check # exit 1 if file is stale
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import argparse
19
+ import datetime as _dt
20
+ import json
21
+ import sys
22
+ import urllib.error
23
+ import urllib.request
24
+ from pathlib import Path
25
+
26
+ REPO_ROOT = Path(__file__).resolve().parents[1]
27
+ sys.path.insert(0, str(REPO_ROOT))
28
+
29
+ from scripts.ai_council._default_prices import DEFAULT_PRICES, as_rows # noqa: E402
30
+ from scripts.ai_council.pricing import ( # noqa: E402
31
+ PRICES_FILE,
32
+ _render_markdown,
33
+ is_stale,
34
+ load_prices,
35
+ )
36
+
37
+ LITELLM_URL = (
38
+ "https://raw.githubusercontent.com/BerriAI/litellm/main/"
39
+ "model_prices_and_context_window.json"
40
+ )
41
+ HTTP_TIMEOUT_SECONDS = 10
42
+
43
+ # Models we surface in the table. Anything not in this allow-list is
44
+ # dropped from the LiteLLM payload; users can add more by editing the
45
+ # Markdown file directly.
46
+ ALLOW_LIST: set[tuple[str, str]] = set(DEFAULT_PRICES.keys())
47
+
48
+
49
+ def _fetch_litellm() -> dict[str, dict[str, object]] | None:
50
+ try:
51
+ req = urllib.request.Request(LITELLM_URL, headers={"User-Agent": "agent-config"})
52
+ with urllib.request.urlopen(req, timeout=HTTP_TIMEOUT_SECONDS) as resp:
53
+ data = json.loads(resp.read().decode("utf-8"))
54
+ if not isinstance(data, dict):
55
+ return None
56
+ return data
57
+ except (urllib.error.URLError, TimeoutError, json.JSONDecodeError, OSError) as exc:
58
+ print(f"[update_prices] upstream unreachable: {exc}", file=sys.stderr)
59
+ return None
60
+
61
+
62
+ def _to_rows_from_litellm(payload: dict[str, dict[str, object]]) -> list[tuple[str, str, float, float]]:
63
+ """Translate LiteLLM keys into our (provider, model, input_per_1m, output_per_1m) tuples."""
64
+ rows: list[tuple[str, str, float, float]] = []
65
+ for key, entry in payload.items():
66
+ if not isinstance(entry, dict):
67
+ continue
68
+ provider = str(entry.get("litellm_provider", "")).lower()
69
+ # LiteLLM keys are sometimes "provider/model"; strip the prefix.
70
+ model = key.split("/", 1)[1] if "/" in key else key
71
+ if (provider, model) not in ALLOW_LIST:
72
+ continue
73
+ in_cost = entry.get("input_cost_per_token")
74
+ out_cost = entry.get("output_cost_per_token")
75
+ if not isinstance(in_cost, (int, float)) or not isinstance(out_cost, (int, float)):
76
+ continue
77
+ # LiteLLM ships per-token USD; convert to per-1M.
78
+ rows.append((provider, model, float(in_cost) * 1_000_000, float(out_cost) * 1_000_000))
79
+ rows.sort()
80
+ return rows
81
+
82
+
83
+ def refresh(path: Path = PRICES_FILE) -> str:
84
+ """Write a fresh `.agent-prices.md`. Returns the source label used."""
85
+ payload = _fetch_litellm()
86
+ if payload is not None:
87
+ rows = _to_rows_from_litellm(payload)
88
+ if rows:
89
+ today = _dt.datetime.now(_dt.timezone.utc).date().isoformat()
90
+ path.write_text(_render_markdown(today, "litellm-github", rows), encoding="utf-8")
91
+ return "litellm-github"
92
+ # Network or filter failed → shipped defaults.
93
+ today = _dt.datetime.now(_dt.timezone.utc).date().isoformat()
94
+ path.write_text(_render_markdown(today, "shipped-default", as_rows()), encoding="utf-8")
95
+ return "shipped-default"
96
+
97
+
98
+ def _cmd_check(path: Path) -> int:
99
+ if not path.exists():
100
+ print(f"[update_prices] {path} missing — run `python3 scripts/update_prices.py`")
101
+ return 1
102
+ table = load_prices(path)
103
+ if is_stale(table):
104
+ print(f"[update_prices] {path} stale (last_updated={table.last_updated})")
105
+ return 1
106
+ print(f"[update_prices] {path} fresh (last_updated={table.last_updated})")
107
+ return 0
108
+
109
+
110
+ def main() -> int:
111
+ parser = argparse.ArgumentParser(description=__doc__)
112
+ parser.add_argument("--check", action="store_true", help="exit 1 if stale")
113
+ parser.add_argument("--path", default=str(PRICES_FILE), help="override target path")
114
+ args = parser.parse_args()
115
+ target = Path(args.path)
116
+ if args.check:
117
+ return _cmd_check(target)
118
+ src = refresh(target)
119
+ print(f"[update_prices] wrote {target} (source={src})")
120
+ return 0
121
+
122
+
123
+ if __name__ == "__main__":
124
+ sys.exit(main())
@@ -1,96 +0,0 @@
1
- # Git & Version Control Guidelines
2
-
3
- > Project-specific Git conventions. Branch naming, commit messages, PR workflow.
4
-
5
- **Related Skills:** `git-workflow`, `conventional-commits-writing`
6
- **Related Rules:** `commit-conventions.md`
7
-
8
- ## Branch Naming
9
-
10
- ```
11
- {type}/{ticket-id}/{short-description}
12
- ```
13
-
14
- Types: `feat/`, `fix/`, `hotfix/`, `chore/`, `docs/`, `test/`
15
-
16
- ```
17
- feat/DEV-1234/user-notification-preferences
18
- fix/DEV-5678/null-pointer-in-import
19
- chore/refactor-agent-setup
20
- hotfix/DEV-999/critical-payment-bug
21
- ```
22
-
23
- ## Commit Messages
24
-
25
- See `commit-conventions` rule for base format. Key type selection:
26
-
27
- - `feat` — new capability. `fix` — bug/regression. `refactor` — structure only, NO behavior change.
28
- - `docs` — docs only. `test` — tests only. `ci` — CI/workflows. `chore` — maintenance/cleanup.
29
- - `perf` — performance. `build` — build tooling. `style` — formatting only.
30
-
31
- **Scope:** Jira ID or area name (`api`, `auth`, `skills`). Only add when it improves clarity.
32
-
33
- **Description:** Intent, not implementation. Imperative mood. Max 72 chars. No generic filler.
34
-
35
- **Breaking:** `!` after type/scope or `BREAKING CHANGE:` footer.
36
-
37
- ```
38
- feat(api)!: rename invoice status values
39
- refactor(auth)!: remove legacy session flow
40
- ```
41
-
42
- **Splitting:** Mixed concerns → split commits. Don't hide unrelated changes in one.
43
-
44
- ```
45
- refactor(skills): remove duplicate routing helpers
46
- ci(lint): add skill-lint workflow
47
- docs(readme): document new lint tasks
48
- ```
49
-
50
- **Squash merge titles:** Conventional Commit format, describe net effect, not every internal commit.
51
-
52
- ### Anti-patterns
53
-
54
- - `update stuff` / `fix bug` / `changes`
55
- - `refactor` for bug fixes, `chore` for behavior changes
56
- - Multiple unrelated concerns in one commit
57
-
58
- ### Decision checklist
59
-
60
- 1. Behavior changed? → `feat` or `fix`
61
- 2. Structure only? → `refactor`
62
- 3. Only docs/tests/CI? → `docs`/`test`/`ci`
63
- 4. Scope useful or noise?
64
- 5. Multiple commits hiding in one?
65
-
66
- ### Examples by area
67
-
68
- ```bash
69
- # Features
70
- feat(DEV-2133): send email to customer when product is shipped
71
-
72
- # Bug fixes
73
- fix(import): handle null values in equipment JSON
74
-
75
- # Refactoring
76
- refactor: extract user sync logic into dedicated service
77
-
78
- # Skills / Rules / Agent config
79
- refactor(skills): merge duplicate analysis skills
80
- feat(rules): add analysis routing quality gate
81
- fix(skills): restore concrete validation in skill reviewer
82
-
83
- # CI / Tooling
84
- ci(lint): add skill linter workflow
85
- feat(linter): detect pointer-only skills
86
-
87
- # Docs
88
- docs(roadmap): add phase 3 implementation plan
89
- docs(readme): clarify source-of-truth workflow
90
- ```
91
-
92
- ## Pull Requests
93
-
94
- - PR title: Conventional Commit format — `feat(DEV-1234): short description`
95
- - Fill PR template, link Jira ticket, ensure quality gates pass
96
-
@@ -1,134 +0,0 @@
1
- ---
2
- type: "always"
3
- description: "Surface matching slash commands as numbered options when user intent matches a command's purpose — never auto-executes; user always picks (read-only suggestion layer)."
4
- alwaysApply: true
5
- source: package
6
- ---
7
-
8
- # Command Suggestion
9
-
10
- When the user's prompt matches an eligible slash command, surface it
11
- as a **numbered option** alongside an "as-is" escape hatch. The user
12
- always picks. **Nothing auto-executes.** The suggestion layer is a
13
- read-only shortcut *finder*, not an invocation path.
14
-
15
- The deterministic engine lives in `scripts/command_suggester/`. The
16
- locked eligibility table lives in
17
- [`agents/contexts/command-suggestion-eligibility.md`](../../agents/contexts/command-suggestion-eligibility.md).
18
- The full design lives in
19
- [`road-to-context-aware-command-suggestion`](../../agents/roadmaps/road-to-context-aware-command-suggestion.md).
20
-
21
- ## Iron Law — never auto-execute
22
-
23
- ```
24
- SUGGEST. NEVER INVOKE. THE USER PICKS, ALWAYS.
25
- ```
26
-
27
- A suggestion block emits options. It does **not** start a command
28
- flow. The user picking option N triggers `slash-commands` on the
29
- **next** turn — with all the command's own halts intact.
30
-
31
- ## When to fire
32
-
33
- On a user turn that matches **all** of the following:
34
-
35
- 1. The message does **not** start with an explicit `/command` (those
36
- bypass suggestion entirely — see `slash-commands`).
37
- 2. `commands.suggestion.enabled` is `true` (default).
38
- 3. The user has not issued `/command-suggestion-off` in this conversation.
39
- 4. No clarification is owed for the same turn (per
40
- `ask-when-uncertain` — clarification wins; suggestion can fire next turn).
41
- 5. No active engine flow is mid-halt (e.g. an `/implement-ticket`
42
- step waiting on the user — the active flow has the floor).
43
- 6. The matcher returns at least one match above the effective
44
- `confidence_floor` after rank + cooldown + anti-noise.
45
-
46
- When all six hold, the suggestion block is the **first and only**
47
- thing the agent emits that turn. No tools, no edits, no other prose.
48
-
49
- ## What to emit
50
-
51
- Render exactly one numbered-options block conforming to
52
- `user-interaction`:
53
-
54
- ```
55
- > 💡 Your request matches a command. Pick one or run the prompt as-is:
56
- >
57
- > 1. /implement-ticket — drive ticket end-to-end through refine → plan → implement → test
58
- > 2. /refine-ticket — tighten the AC and risks on a ticket before planning
59
- > 3. Just run the prompt as-is, no command
60
-
61
- **Recommendation: 1 — /implement-ticket** — the request matches its trigger description (`setze ticket abc-123 um`). Pick the last option to skip the command and run the prompt as written.
62
- ```
63
-
64
- Rules — non-negotiable:
65
-
66
- - The "run as-is" option is **always present**, **always last**, never removed.
67
- - At most `commands.suggestion.max_options` command suggestions
68
- precede the as-is option (default 4 → 5 total).
69
- - Exactly **one** `Recommendation:` line follows the block, naming
70
- the highest-scoring command — or no recommendation when the top
71
- two scores are within 0.05 of each other (single-source-of-truth
72
- Iron Law from `user-interaction`).
73
- - Free-text replies count as the as-is option unless they
74
- unambiguously name one of the listed commands.
75
-
76
- ## Subordination — when to stay silent
77
-
78
- The suggestion rule is **junior** to:
79
-
80
- - `scope-control` — never surfaces a git-op command behind a
81
- permission gate the user already declined this turn.
82
- - `ask-when-uncertain` — if a clarification is owed, the
83
- clarification is the only question; suggestion suppresses for
84
- that turn.
85
- - `verify-before-complete` — suggestion does not interrupt an
86
- evidence-gate verification that's already running.
87
- - Any active role-mode contract (`role-mode-adherence`).
88
- - Any active engine halt (`/implement-ticket`, `/work`, etc.).
89
-
90
- On any conflict → suggestion stays silent. Zero output. The user's
91
- prompt is processed as it would be without this rule.
92
-
93
- ## Anti-noise — silent when uncertain
94
-
95
- The engine's `rank.py` already drops:
96
-
97
- - Matches below the `confidence_floor` (default 0.6, per-command
98
- override in frontmatter).
99
- - Single matches scoring `< floor + 0.1` with no structural bonus
100
- (high uncertainty isn't worth interrupting for).
101
- - Short prompts (< 6 words) hitting > 2 commands with no structural
102
- bonus (ticket key, file path) — too vague to disambiguate.
103
- - Pure-continuation messages (`ok`, `weiter`, `mach weiter`, `go on`,
104
- …) — no new intent signal, no structural bonus → silent.
105
- - Suggestions that fired for the same `(command, evidence)` pair
106
- within the cooldown window (default 10m, per-command override).
107
-
108
- If the engine returns an empty list → emit nothing. The user's
109
- prompt runs exactly as it would without this rule.
110
-
111
- ## What this rule does NOT do
112
-
113
- - Invoke any command. Picking option N is what triggers `slash-commands`.
114
- - Stack with other questions. One numbered-options block per turn.
115
- - Re-trigger on its own output. Command names emitted in the
116
- suggestion block are excluded from the next-turn matcher input.
117
- - Override `enabled: false`, blocklist entries, or per-conversation opt-out.
118
- - Suggest commands that are not in the locked eligibility table.
119
-
120
- ## Cloud Behavior
121
-
122
- On cloud surfaces (Claude.ai Web, Skills API) the rule is **inert**
123
- unless the suggester package is shipped in the bundle. Treat
124
- `commands.suggestion.enabled` as `false` when the engine is not
125
- available — degrade silently, never crash the turn.
126
-
127
- ## Interactions
128
-
129
- - [`slash-commands`](slash-commands.md) — explicit `/command` skips suggestion entirely.
130
- - [`user-interaction`](user-interaction.md) — numbered-options Iron Law and single-source recommendation.
131
- - [`ask-when-uncertain`](ask-when-uncertain.md) — clarification wins on conflict.
132
- - [`scope-control`](scope-control.md) — git-op gates outrank suggestion.
133
- - [`role-mode-adherence`](role-mode-adherence.md) — active mode contract outranks suggestion.
134
- - [`agents/contexts/command-suggestion-eligibility.md`](../../agents/contexts/command-suggestion-eligibility.md) — locked eligibility table.
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes