@event4u/agent-config 1.22.0 → 1.23.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 (91) hide show
  1. package/.agent-src/commands/agents/cleanup.md +31 -17
  2. package/.agent-src/commands/commit/in-chunks.md +30 -10
  3. package/.agent-src/commands/commit.md +46 -6
  4. package/.agent-src/commands/compress.md +19 -13
  5. package/.agent-src/commands/cost-report.md +120 -0
  6. package/.agent-src/commands/create-pr/description-only.md +8 -0
  7. package/.agent-src/commands/create-pr.md +95 -80
  8. package/.agent-src/commands/feature/plan.md +13 -7
  9. package/.agent-src/commands/memory/add.md +16 -8
  10. package/.agent-src/commands/memory/promote.md +17 -9
  11. package/.agent-src/commands/optimize/rtk.md +16 -11
  12. package/.agent-src/commands/prepare-for-review.md +12 -6
  13. package/.agent-src/commands/project-analyze.md +31 -20
  14. package/.agent-src/commands/review-changes.md +24 -15
  15. package/.agent-src/commands/roadmap/create.md +14 -9
  16. package/.agent-src/contexts/contracts/frugality-charter.md +57 -0
  17. package/.agent-src/rules/architecture.md +9 -0
  18. package/.agent-src/rules/ask-when-uncertain.md +3 -13
  19. package/.agent-src/rules/caveman-speak.md +78 -0
  20. package/.agent-src/rules/direct-answers.md +5 -14
  21. package/.agent-src/rules/markdown-safe-codeblocks.md +6 -7
  22. package/.agent-src/rules/no-cheap-questions.md +4 -14
  23. package/.agent-src/rules/token-efficiency.md +5 -7
  24. package/.agent-src/skills/adr-create/SKILL.md +197 -0
  25. package/.agent-src/skills/agent-docs-writing/SKILL.md +23 -1
  26. package/.agent-src/skills/command-writing/SKILL.md +23 -0
  27. package/.agent-src/skills/context-authoring/SKILL.md +23 -0
  28. package/.agent-src/skills/conventional-commits-writing/SKILL.md +23 -0
  29. package/.agent-src/skills/guideline-writing/SKILL.md +22 -0
  30. package/.agent-src/skills/persona-writing/SKILL.md +153 -0
  31. package/.agent-src/skills/readme-writing/SKILL.md +20 -0
  32. package/.agent-src/skills/readme-writing-package/SKILL.md +19 -0
  33. package/.agent-src/skills/roadmap-writing/SKILL.md +157 -0
  34. package/.agent-src/skills/rule-writing/SKILL.md +22 -0
  35. package/.agent-src/skills/script-writing/SKILL.md +226 -0
  36. package/.agent-src/skills/skill-writing/SKILL.md +23 -0
  37. package/.agent-src/skills/test-driven-development/SKILL.md +24 -0
  38. package/.agent-src/templates/agent-settings.md +73 -0
  39. package/.agent-src/templates/command.md +15 -10
  40. package/.agent-src/templates/rule.md +6 -0
  41. package/.agent-src/templates/skill.md +32 -0
  42. package/.claude-plugin/marketplace.json +6 -1
  43. package/AGENTS.md +3 -3
  44. package/CHANGELOG.md +35 -0
  45. package/README.md +5 -5
  46. package/docs/architecture.md +4 -4
  47. package/docs/customization.md +72 -0
  48. package/docs/decisions/INDEX.md +15 -0
  49. package/docs/getting-started.md +2 -2
  50. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +27 -19
  51. package/docs/guidelines/agent-infra/carve-out-predicates.md +17 -0
  52. package/docs/guidelines/agent-infra/mcp-request-signing.md +199 -0
  53. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +11 -4
  54. package/package.json +1 -1
  55. package/scripts/_lib/__init__.py +5 -0
  56. package/scripts/_lib/script_output.py +140 -0
  57. package/scripts/adr/regenerate_index.py +79 -0
  58. package/scripts/ai_council/one_off_archive/2026-05/_one_off_add_quiet.py +149 -0
  59. package/scripts/ai_council/one_off_archive/2026-05/_one_off_inject_quiet_flag.py +33 -0
  60. package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_v2.sh +36 -0
  61. package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_verbosity.sh +26 -0
  62. package/scripts/ai_council/one_off_archive/2026-05/_one_off_per_task.sh +41 -0
  63. package/scripts/ai_council/one_off_archive/2026-05/_one_off_silent_taskfiles.py +98 -0
  64. package/scripts/check_augmentignore.py +4 -1
  65. package/scripts/check_command_count_messaging.py +4 -1
  66. package/scripts/check_compressed_paths.py +4 -1
  67. package/scripts/check_council_layout.py +4 -1
  68. package/scripts/check_council_references.py +4 -1
  69. package/scripts/check_iron_law_prominence.py +3 -1
  70. package/scripts/check_md_language.py +3 -1
  71. package/scripts/check_memory_proposal.py +3 -1
  72. package/scripts/check_public_catalog_links.py +4 -1
  73. package/scripts/check_reply_consistency.py +8 -2
  74. package/scripts/check_roadmap_trackable.py +4 -1
  75. package/scripts/compile_router.py +27 -0
  76. package/scripts/compress.py +33 -19
  77. package/scripts/cost/budget.mjs +152 -0
  78. package/scripts/cost/track.mjs +144 -0
  79. package/scripts/first-run.sh +3 -9
  80. package/scripts/install-hooks.sh +19 -1
  81. package/scripts/install.py +17 -12
  82. package/scripts/install.sh +19 -8
  83. package/scripts/lint_examples.py +6 -2
  84. package/scripts/lint_handoffs.py +4 -1
  85. package/scripts/lint_load_context.py +4 -1
  86. package/scripts/lint_roadmap_complexity.py +6 -2
  87. package/scripts/lint_rule_interactions.py +4 -1
  88. package/scripts/lint_rule_tiers.py +4 -1
  89. package/scripts/measure_frugality_savings.py +164 -0
  90. package/scripts/runtime_dispatcher.py +11 -0
  91. package/scripts/skill_linter.py +207 -2
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "metadata": {
8
8
  "description": "Shared agent configuration \u2014 skills for AI coding tools (Claude Code, Augment, Cursor, Cline, Windsurf, Gemini CLI).",
9
- "version": "1.22.0"
9
+ "version": "1.23.0"
10
10
  },
11
11
  "plugins": [
12
12
  {
@@ -15,6 +15,7 @@
15
15
  "source": "./",
16
16
  "strict": false,
17
17
  "skills": [
18
+ "./.claude/skills/adr-create",
18
19
  "./.claude/skills/adversarial-review",
19
20
  "./.claude/skills/agent-docs-writing",
20
21
  "./.claude/skills/agent-handoff",
@@ -61,6 +62,7 @@
61
62
  "./.claude/skills/context-document",
62
63
  "./.claude/skills/context-refactor",
63
64
  "./.claude/skills/conventional-commits-writing",
65
+ "./.claude/skills/cost-report",
64
66
  "./.claude/skills/copilot-agents",
65
67
  "./.claude/skills/copilot-agents-init",
66
68
  "./.claude/skills/copilot-agents-optimization",
@@ -172,6 +174,7 @@
172
174
  "./.claude/skills/package-test",
173
175
  "./.claude/skills/performance",
174
176
  "./.claude/skills/performance-analysis",
177
+ "./.claude/skills/persona-writing",
175
178
  "./.claude/skills/pest-testing",
176
179
  "./.claude/skills/php-coder",
177
180
  "./.claude/skills/php-debugging",
@@ -211,9 +214,11 @@
211
214
  "./.claude/skills/roadmap-process-full",
212
215
  "./.claude/skills/roadmap-process-phase",
213
216
  "./.claude/skills/roadmap-process-step",
217
+ "./.claude/skills/roadmap-writing",
214
218
  "./.claude/skills/rtk-output-filtering",
215
219
  "./.claude/skills/rule-compliance-audit",
216
220
  "./.claude/skills/rule-writing",
221
+ "./.claude/skills/script-writing",
217
222
  "./.claude/skills/security",
218
223
  "./.claude/skills/security-audit",
219
224
  "./.claude/skills/sentry-integration",
package/AGENTS.md CHANGED
@@ -167,9 +167,9 @@ appends to `agents/.rule-budget-history.jsonl`.
167
167
 
168
168
  ```
169
169
  .agent-src.uncompressed/ ← edit here
170
- skills/ (136 skills)
171
- rules/ (59 rules)
172
- commands/ (102 commands)
170
+ skills/ (140 skills)
171
+ rules/ (60 rules)
172
+ commands/ (103 commands)
173
173
  personas/ (7 personas)
174
174
  templates/ (AGENTS.md, copilot-instructions.md, skill.md, …)
175
175
  contexts/
package/CHANGELOG.md CHANGED
@@ -318,6 +318,41 @@ our recommendation order, not its support status.
318
318
  users" tension without removing any path that an existing user
319
319
  might rely on.
320
320
 
321
+ ## [1.23.0](https://github.com/event4u-app/agent-config/compare/1.22.0...1.23.0) (2026-05-08)
322
+
323
+ ### Features
324
+
325
+ * **skills:** add script-writing skill for scripts/ conventions ([1f8655d](https://github.com/event4u-app/agent-config/commit/1f8655d6cbf007410e3846ab502eea5745a7f66f))
326
+ * **scripts:** Phase 10.7 --quiet flag + silent Taskfile + caveman compile-time toggle ([1d319e6](https://github.com/event4u-app/agent-config/commit/1d319e61a3c782eb5c86075f34275306a67c621c))
327
+ * **linter:** frugality charter writer-cite validator + writer skill citations ([0e34709](https://github.com/event4u-app/agent-config/commit/0e3470965d5e2f4a8b11f27137d4ba43d2471be2))
328
+ * **verbosity:** add verbosity toggles + gate routine outputs ([580d4cc](https://github.com/event4u-app/agent-config/commit/580d4cc2d1f4d4b091b6128f0a29d1f7e619895d))
329
+ * **roadmap-sync:** pre-commit backstop blocks stale dashboard ([c577fc0](https://github.com/event4u-app/agent-config/commit/c577fc0aabc13faaae64c88d20d8ca66338ae5fc))
330
+ * **create-pr:** drop council-review prompt ([e694811](https://github.com/event4u-app/agent-config/commit/e694811f7ca06b3db275cc70e83e6dbc4db72e42))
331
+ * cite SPARC escalation thresholds in test-driven-development ([836f2ed](https://github.com/event4u-app/agent-config/commit/836f2edc2c288bcc7f878e97f42de954add8bb5b))
332
+ * add mcp-request-signing guideline with HTTP-bridge appendix ([2ab67cd](https://github.com/event4u-app/agent-config/commit/2ab67cd401333ea61f47d43e952e7b07958feff3))
333
+ * add cost-report command with token cost tracking ([262d865](https://github.com/event4u-app/agent-config/commit/262d865072d613647a439e89f83ded7334b60b1b))
334
+ * add adr-create skill with index regeneration script ([7225105](https://github.com/event4u-app/agent-config/commit/7225105797d6810cad75bfa851f02b100e41ba29))
335
+
336
+ ### Bug Fixes
337
+
338
+ * **docs:** bump command counts to 103 after cost-report addition ([2810fa5](https://github.com/event4u-app/agent-config/commit/2810fa5a54b7099123ae65e6c7c1325430bf3b77))
339
+
340
+ ### Documentation
341
+
342
+ * sync counts (139 skills, 60 rules) + meta cleanups ([00c8b21](https://github.com/event4u-app/agent-config/commit/00c8b211edbc86cbe2f886107227e6bd46049c3b))
343
+ * codify defer-with-trigger harvest policy ([b30dcd7](https://github.com/event4u-app/agent-config/commit/b30dcd72d0ffbd1fb2dbdd8ca28493a5b05a6bed))
344
+
345
+ ### Refactoring
346
+
347
+ * **rules:** apply trim-frugality-canon Phase 1-3 trims ([ea1828a](https://github.com/event4u-app/agent-config/commit/ea1828af7bc69426386f6852cb69891309dce65f))
348
+
349
+ ### Chores
350
+
351
+ * regenerate stale generated mirrors ([ea52e94](https://github.com/event4u-app/agent-config/commit/ea52e94415c4db5598e91d001e0fbeee10cae9be))
352
+ * regenerate auto-generated artefacts ([fbe7d9e](https://github.com/event4u-app/agent-config/commit/fbe7d9ef137c9e584d7f88ce660afe29ab1a8d00))
353
+ * bump skill/command/guideline counts and compression hashes ([18f4fad](https://github.com/event4u-app/agent-config/commit/18f4fad2372fd4347210199986909319c24ea0ec))
354
+ * archive ruflo-adoption, move caveman-integration to skipped ([4c6c1eb](https://github.com/event4u-app/agent-config/commit/4c6c1eb1e00356421e0038704a82e1f10ac9a3e5))
355
+
321
356
  ## [1.22.0](https://github.com/event4u-app/agent-config/compare/1.21.0...1.22.0) (2026-05-07)
322
357
 
323
358
  ### Features
package/README.md CHANGED
@@ -7,7 +7,7 @@ Give your AI agents an audit-disciplined orchestration contract — testing, Git
7
7
  > Your agent picks up the project's stack, runs tests, prepares PRs, fixes CI — and follows your team's coding standards while doing it. Stack-aware skill sets ship for PHP (Laravel · Symfony · Zend/Laminas), JavaScript (Next.js · React · Node), and cross-stack concerns (API · testing · security · observability).
8
8
 
9
9
  <p align="center">
10
- <strong>136 Skills</strong> · <strong>59 Rules</strong> · <strong>102 Commands</strong> · <strong>56 Guidelines</strong> · <strong>8 AI Tools</strong>
10
+ <strong>140 Skills</strong> · <strong>60 Rules</strong> · <strong>103 Commands</strong> · <strong>58 Guidelines</strong> · <strong>8 AI Tools</strong>
11
11
  </p>
12
12
 
13
13
  ---
@@ -343,7 +343,7 @@ kernel set: [`docs/contracts/kernel-membership.md`](docs/contracts/kernel-member
343
343
  | [`/jira-ticket`](.agent-src/commands/jira-ticket.md) | Read ticket from branch, implement feature |
344
344
  | [`/compress`](.agent-src/commands/compress.md) | Compress skills for token efficiency |
345
345
 
346
- → [Browse all 95 active commands](.agent-src/commands/)
346
+ → [Browse all 103 active commands](.agent-src/commands/)
347
347
 
348
348
  ---
349
349
 
@@ -368,7 +368,7 @@ Every developer gets the same behavior. No per-user setup needed.
368
368
  native slash-commands)
369
369
 
370
370
  > **What this means in practice:** Augment Code and Claude Code get the full
371
- > package (rules + 136 skills + 95 native commands). Cursor, Cline, Windsurf,
371
+ > package (rules + 140 skills + 103 native commands). Cursor, Cline, Windsurf,
372
372
  > Gemini CLI, and GitHub Copilot only get the **rules** natively; skills and
373
373
  > commands are available to them as documentation the agent can read, not as
374
374
  > first-class features.
@@ -413,6 +413,8 @@ for the per-rule routing.
413
413
  - **Challenge to improve** — agents are thought partners, not yes-machines
414
414
  - **Strict by design** — quality over flexibility
415
415
  - **Zero overhead by default** — nothing runs until you ask for it
416
+ - **Terse-by-default chat output** — verbosity flags off, intent narration off,
417
+ caveman-speak prose-only — flip back via [`docs/customization.md` § Verbosity](docs/customization.md#verbosity)
416
418
 
417
419
  ---
418
420
 
@@ -480,10 +482,8 @@ re-enabled or the chat ends. Full scoring contract and hardening:
480
482
  Edit in `.agent-src.uncompressed/`, compress, verify:
481
483
 
482
484
  ```bash
483
- task sync # Sync non-.md files
484
485
  task ci # Run all CI checks
485
486
  task test # Run all tests
486
- task lint-skills # Lint skills, rules, commands
487
487
  ```
488
488
 
489
489
  → Full commands and project structure: [**docs/development.md**](docs/development.md)
@@ -96,10 +96,10 @@ fails on any source-side violation, without producing artifacts.
96
96
 
97
97
  | Layer | Count | Purpose |
98
98
  |---|---|---|
99
- | **Skills** | 136 | On-demand expertise — stack analysis (Laravel · Symfony · Zend / Laminas · Next.js · React · Node), testing, Docker, API design, security, observability, … |
100
- | **Rules** | 59 | Always-active constraints — coding standards, scope control, verification, language-and-tone, agent-authority |
101
- | **Commands** | 102 | Slash-command workflows — `/commit`, `/create-pr`, `/fix ci`, `/optimize skills`, `/feature plan`, `/work`, `/implement-ticket`, `/compress`, … |
102
- | **Guidelines** | 56 | Reference material cited by skills — PHP patterns, Eloquent, Playwright, agent-infra, … |
99
+ | **Skills** | 140 | On-demand expertise — stack analysis (Laravel · Symfony · Zend / Laminas · Next.js · React · Node), testing, Docker, API design, security, observability, … |
100
+ | **Rules** | 60 | Always-active constraints — coding standards, scope control, verification, language-and-tone, agent-authority |
101
+ | **Commands** | 103 | Slash-command workflows — `/commit`, `/create-pr`, `/fix ci`, `/optimize skills`, `/feature plan`, `/work`, `/implement-ticket`, `/compress`, … |
102
+ | **Guidelines** | 58 | Reference material cited by skills — PHP patterns, Eloquent, Playwright, agent-infra, … |
103
103
  | **Templates** | 7 | Scaffolds for features, roadmaps, contexts, skills, overrides |
104
104
  | **Contexts** | 5 | Shared knowledge about the system itself |
105
105
 
@@ -120,6 +120,78 @@ behavior — the per-profile table is just the initial default.
120
120
 
121
121
  `custom` ignores these defaults — set every value explicitly.
122
122
 
123
+ ### Verbosity
124
+
125
+ The `verbosity:` block and `caveman.speak_scope` control how much narration
126
+ the agent emits around routine actions. Defaults are tuned for token
127
+ frugality — flip values to `true` (or higher tier) to restore legacy verbose
128
+ output. Iron-Law gates (`commit-policy`, `scope-control` git-ops,
129
+ `non-destructive-by-default`) ALWAYS confirm regardless of these flags.
130
+
131
+ | Setting | Values | Default | Description |
132
+ |---|---|---|---|
133
+ | `verbosity.preview_artifacts` | `true`, `false` | `false` | Show generated commit messages, PR titles/bodies, and branch names before acting. `false` = use the generated content directly. |
134
+ | `verbosity.routine_confirmations` | `true`, `false` | `false` | Confirmation prompts for routine workflow steps when there is one obvious answer ("looks good — commit?"). Iron-Law gates always ask regardless. |
135
+ | `verbosity.offer_council_in_delivery` | `true`, `false` | `false` | Offer "run AI Council on this?" inside delivery commands (`/feature-plan`, `/review-changes`, `/roadmap-create`). The `/council` command itself is unaffected. |
136
+ | `verbosity.post_action_reports` | `off`, `minimal`, `full` | `minimal` | Multi-line status / summary blocks after a successful action. `off` = no report; `minimal` = one-line confirmation; `full` = bullet list. |
137
+ | `verbosity.intent_announcements` | `true`, `false` | `false` | Intent announcements ("Let me check…", "Now I will…", "Found it") in skill bodies. `false` = act and emit the result. |
138
+ | `verbosity.script_output` | `silent`, `minimal`, `verbose` | `minimal` | Stdout chatter from `scripts/*.py`, `scripts/*.sh`, and `.augment/scripts/`. `silent` = stderr only; `minimal` = one summary line per script; `verbose` = pre-Phase-10 per-step prints. Iron-Law surfaces (release confirms, install secrets prompts, error markers) ignore this key. |
139
+ | `verbosity.taskfile_command_echo` | `true`, `false` | `false` | Suppress the `task: [name] cmd...` echo Taskfile prints before each task body. `true` = echoes preserved (legacy behaviour); `false` = `silent: true` is set on every Phase-10 safe task. |
140
+ | `caveman.speak_scope` | `off`, `prose_only`, `aggressive` | `prose_only` | How widely caveman-speak grammar applies in chat. `off` = no caveman; `prose_only` = caveman in body prose, numbered options + Iron-Law-literal blocks stay full prose; `aggressive` = caveman everywhere except Iron-Law literals. |
141
+
142
+ The cross-rule index for these defaults lives in
143
+ [`.agent-src.uncompressed/contexts/contracts/frugality-charter.md`](../.agent-src.uncompressed/contexts/contracts/frugality-charter.md).
144
+ Writer skills (`skill-writing`, `rule-writing`, `command-writing`,
145
+ `guideline-writing`, `roadmap-writing`, `persona-writing`,
146
+ `agent-docs-writing`, `context-authoring`, `conventional-commits-writing`,
147
+ `readme-writing`, `readme-writing-package`, `adr-create`) cite the charter
148
+ under their `## Frugality Standards` section.
149
+
150
+ #### Behavior change vs. legacy — `/create-pr` silent draft default
151
+
152
+ When `verbosity.routine_confirmations: false` (the new default),
153
+ `/create-pr` creates the PR as a **draft silently** instead of asking
154
+ "draft or ready?". A one-line postscript surfaces the override:
155
+
156
+ ```
157
+ → #42 opened: https://github.com/org/repo/pull/42
158
+ → created as draft — run `gh pr ready 42` to flip
159
+ ```
160
+
161
+ Per-invocation overrides (no settings change required):
162
+
163
+ | You want | Argument |
164
+ |---|---|
165
+ | Ready-for-review immediately | `/create-pr:ready` or `/create-pr:final` |
166
+ | Explicit draft (no postscript change) | `/create-pr:draft` |
167
+ | Numbered prompt restored | set `verbosity.routine_confirmations: true` |
168
+
169
+ `/create-pr` still skips the AI council prompt unconditionally per the
170
+ existing carve-out — `verbosity.offer_council_in_delivery` does not
171
+ re-enable it. Use `/council diff:<base>..<head>` separately.
172
+
173
+ #### Script-output level — env-var overrides
174
+
175
+ `verbosity.script_output` is read by `scripts/_lib/script_output.py`.
176
+ For incident debugging when editing `.agent-settings.yml` is awkward,
177
+ two env vars override the file for the current process tree:
178
+
179
+ | Env var | Value | Effect |
180
+ |---|---|---|
181
+ | `AGENT_SCRIPT_VERBOSITY` | `silent`, `minimal`, `verbose` | Authoritative — wins over the settings file |
182
+ | `SCRIPT_OUTPUT_VERBOSE` | `1` | Alias — equivalent to `AGENT_SCRIPT_VERBOSITY=verbose` |
183
+
184
+ Once the helper resolves the level, it exports the resolved value back
185
+ into `AGENT_SCRIPT_VERBOSITY` so child processes inherit the same level
186
+ without re-reading the settings file. Per-call `--quiet` flags on a
187
+ child script still win at the call site (per-call override > inherited
188
+ level).
189
+
190
+ Iron-Law surfaces — production-deploy confirmation prompts in
191
+ `scripts/release.py`, secret-installer prompts in `install_*_key.sh`,
192
+ and any output via `error()` — bypass the helper and stay loud at every
193
+ level.
194
+
123
195
  ---
124
196
 
125
197
  ## Project documentation
@@ -0,0 +1,15 @@
1
+ # ADR Index
2
+
3
+ _Auto-generated by `scripts/adr/regenerate_index.py`. Do not edit._
4
+
5
+ | # | Title | Status | Date | Supersedes |
6
+ |---|---|---|---|---|
7
+ | [ADR-001](ADR-001-kernel-swap-deferred.md) | Kernel Swap Deferred | accepted | 2026-05-06 | — |
8
+ | [ADR-002](ADR-002-kernel-bucket-overrides.md) | Kernel Bucket Overrides | — | — | — |
9
+ | [ADR-003](ADR-003-flat-cluster-subs-and-colon-syntax.md) | Flat Cluster Subs And Colon Syntax | — | — | — |
10
+
11
+ ## Unnumbered (legacy)
12
+
13
+ | # | Title | Status | Date | Supersedes |
14
+ |---|---|---|---|---|
15
+ | [ADR-rule-kernel-and-router](ADR-rule-kernel-and-router.md) | — | — | — | — |
@@ -115,7 +115,7 @@ Your agent is now:
115
115
  - **Respecting your codebase** — no conflicting patterns
116
116
  - **Following standards** — consistent code quality
117
117
 
118
- This is enforced automatically by 59 rules. No configuration needed.
118
+ This is enforced automatically by 60 rules. No configuration needed.
119
119
 
120
120
  ---
121
121
 
@@ -153,7 +153,7 @@ Your agent now understands slash commands:
153
153
  | `/quality-fix` | Run and fix all quality checks |
154
154
  | `/chat-history` | Inspect the persistent chat-history log (read-only `show`) |
155
155
 
156
- → [Browse all 95 active commands](../.agent-src/commands/)
156
+ → [Browse all 103 active commands](../.agent-src/commands/)
157
157
 
158
158
  ---
159
159
 
@@ -12,21 +12,22 @@ always-loaded rule body — extracted to fit the always-rule budget.
12
12
 
13
13
  ## Vague-request triggers — example questions
14
14
 
15
- Companion to `ask-when-uncertain` § Vague-request triggers. The rule
16
- lists the trigger patterns and the "missing info" columns; this file
17
- adds the example question to ask back at the user.
15
+ Companion to `ask-when-uncertain` § Vague-request triggers. This
16
+ section is the canonical home for the nine trigger patterns, the
17
+ missing-info each one hides, and the example clarifying question
18
+ the rule cites it instead of restating the catalog.
18
19
 
19
- | Pattern | Example clarifying question |
20
- |---|---|
21
- | "improve / optimize this" | "Optimize for what — execution speed or readability?" |
22
- | "add caching" | "Which cache driver, and what invalidates it?" |
23
- | "make it better / cleaner" | "What specifically feels wrong in the current code?" |
24
- | "clean up this file" | "Remove unused code, reformat, or restructure?" |
25
- | "fix this" (without specifying) | "What output/behavior is wrong right now?" |
26
- | "refactor X" | "Refactor toward what — smaller methods, extract class, or something else?" |
27
- | "use best practices" | "Best practices for what specifically — testing, naming, structure?" |
28
- | "handle errors properly" | "For which failure modes, and what should happen on error?" |
29
- | "add a UI / component / tile / page" when the repo mixes frameworks | "This repo uses {A} and {B} for UI — which one for this?" |
20
+ | Pattern | Missing info | Example clarifying question |
21
+ |---|---|---|
22
+ | "improve / optimize this" | metric — speed, readability, memory? | "Optimize for what — execution speed or readability?" |
23
+ | "add caching" | store, scope, invalidation | "Which cache driver, and what invalidates it?" |
24
+ | "make it better / cleaner" | by what standard? | "What specifically feels wrong in the current code?" |
25
+ | "clean up this file" | dead code, format, refactor? | "Remove unused code, reformat, or restructure?" |
26
+ | "fix this" (no symptom) | what output is wrong? | "What output/behavior is wrong right now?" |
27
+ | "refactor X" | target pattern, boundaries | "Refactor toward what — smaller methods, extract class, or something else?" |
28
+ | "use best practices" | whose, for what? | "Best practices for what specifically — testing, naming, structure?" |
29
+ | "handle errors properly" | which errors — log/retry/propagate? | "For which failure modes, and what should happen on error?" |
30
+ | "add a UI / component / tile / page" in mixed-framework repo | which stack? | "This repo uses {A} and {B} for UI — which one for this?" |
30
31
 
31
32
  ## One-question-per-turn — why serial always wins
32
33
 
@@ -49,8 +50,10 @@ next. Serial preserves the framing; parallel destroys it.
49
50
 
50
51
  ## Cheap-question class catalog — extended examples
51
52
 
52
- Companion to `no-cheap-questions` § What counts as cheap. The rule
53
- lists the classes; this file adds longer-form examples per class.
53
+ Companion to `no-cheap-questions` § What counts as cheap. This
54
+ section is the canonical home for the nine cheap-question classes
55
+ and their per-class patterns — the rule cites it instead of
56
+ restating the catalog.
54
57
 
55
58
  | Class | Pattern · why cheap | Concrete example |
56
59
  |---|---|---|
@@ -66,9 +69,10 @@ lists the classes; this file adds longer-form examples per class.
66
69
 
67
70
  ## Direct-answers — severity-tiered claim examples
68
71
 
69
- Companion to `direct-answers` § Iron Law 2 (no invented facts). The
70
- rule lists the severity table; this file adds concrete examples and
71
- hedge-language patterns.
72
+ Companion to `direct-answers` § Iron Law 2 (no invented facts). This
73
+ section is the canonical home for the severity tiers, per-tier
74
+ verification actions, and the override carve-out — the rule cites it
75
+ instead of restating the table.
72
76
 
73
77
  | Severity | Examples | Verification action |
74
78
  |---|---|---|
@@ -76,6 +80,10 @@ hedge-language patterns.
76
80
  | **Medium — project-shape** | "This project uses Pest for testing", "controllers live under `app/Http/Controllers`" | Verify if one tool call reaches it; otherwise hedge: *"I'd guess X — not checked"*. |
77
81
  | **Low — well-known idioms** | "PHP `array_map` returns a new array", "git tags are immutable", "JS arrays are zero-indexed" | Inference acceptable. Mark as inference if not 100% sure. |
78
82
 
83
+ **Override:** "just guess" / "rough estimate" / "skip verify" in the
84
+ user's turn drops every claim to **Low** for that turn only. Reverts
85
+ on the next turn unless the user repeats the override.
86
+
79
87
  Hedge-language patterns:
80
88
 
81
89
  - ✅ "haven't verified X — likely from {known-similar-codebase}"
@@ -0,0 +1,17 @@
1
+ # Decidable Carve-Out Predicates
2
+
3
+ Companion to [`frugality-charter`](../../../.agent-src.uncompressed/contexts/contracts/frugality-charter.md). Each carve-out below carries a one-sentence test. If the test cannot be answered yes/no from the artifact alone, the carve-out does not fire and default-terse rules apply.
4
+
5
+ ## Predicates
6
+
7
+ - **Iron-Law literal** — the prose is an ALL-CAPS fenced block inside a rule whose title appears in [`docs/contracts/kernel-membership.md`](../../contracts/kernel-membership.md).
8
+
9
+ - **Numbered-options with genuine trade-off** — the options differ in consequence (a chosen path produces a measurably different artifact or state), not in sequencing or output format. Per [`no-cheap-questions § What counts as cheap`](../../../.agent-src.uncompressed/rules/no-cheap-questions.md#what-counts-as-cheap).
10
+
11
+ - **Security-sensitive prompt** — the prompt requires credential input OR modifies auth / tenant / secret state, matching a trigger in [`security-sensitive-stop`](../../../.agent-src.uncompressed/rules/security-sensitive-stop.md).
12
+
13
+ - **Structured CLI contract** — the script's stdout is consumed by another script (a downstream parser exists under `scripts/` or `.augment/scripts/`), so the format is part of an interface contract, not narration.
14
+
15
+ ## How to use
16
+
17
+ Writer skills (`skill-writing`, `rule-writing`, `command-writing`, `guideline-writing`, `context-authoring`, `agent-docs-writing`, `conventional-commits-writing`, `readme-writing`, `readme-writing-package`, `adr-create`, `persona-writing`, `roadmap-writing`) cite this file when an artifact's pre-save check needs a decidable test for a carve-out exception. The default is **terse** — predicates here only fire when the artifact provides the yes/no evidence.
@@ -0,0 +1,199 @@
1
+ # MCP Request Signing (HMAC-SHA256)
2
+
3
+ Reference guideline for signing JSON-RPC requests crossing any non-stdio
4
+ MCP transport — HTTP, SSE, WebSocket, anything routable. Stdio over a
5
+ trusted parent-child pipe is **outside** the scope of this guideline; only
6
+ network-exposed transports require signing.
7
+
8
+ Lands ahead of any HTTP-MCP transport so the security floor is in place
9
+ when one becomes a real consumer use case (see
10
+ [`road-to-mcp-server.md`](../../../agents/roadmaps/road-to-mcp-server.md)
11
+ Phase 4 D4 — allowlist).
12
+
13
+ Adapted from
14
+ [`ruvnet/ruflo`](https://github.com/ruvnet/ruflo) — commit
15
+ [`1dd1db1`](https://github.com/ruvnet/ruflo/blob/1dd1db1ec2572ce68f6805dff98c177b5771cbf9/ruflo/src/mcp-bridge/mcp-stdio-kernel.js)
16
+ `ruflo/src/mcp-bridge/mcp-stdio-kernel.js` — `CRYPTO_SEG`. The full
17
+ Express bridge (`index.js`, ~1.6k LOC) stays authoritative-link only;
18
+ this guideline forks the **primitive**, not the runtime.
19
+
20
+ ## When signing is mandatory
21
+
22
+ - Any HTTP / SSE / WebSocket MCP transport — the wire is shared with
23
+ arbitrary callers.
24
+ - Any cross-host stdio bridge (parent and child on different machines).
25
+ - Any MCP server reachable from a browser context.
26
+
27
+ ## When signing is **not** required
28
+
29
+ - Plain stdio MCP server invoked as a child process by one trusted client
30
+ on the same host. The OS pipe is the trust boundary.
31
+ - Local-only loopback served behind a Unix domain socket with `0700`
32
+ permissions on the socket file.
33
+
34
+ If unsure → sign. The cost is one HMAC per request.
35
+
36
+ ## Signing pattern (~30 LOC reference)
37
+
38
+ `KERNEL_SECRET` is a per-installation shared secret loaded from env or a
39
+ secrets store. Never commit it. `randomUUID()` is Node's
40
+ `crypto.randomUUID`.
41
+
42
+ ```js
43
+ import { createHmac, randomUUID } from 'node:crypto';
44
+
45
+ const KERNEL_SECRET = process.env.MCP_KERNEL_SECRET;
46
+ const KERNEL_ID = `mcp-kernel-${process.pid}`;
47
+
48
+ function signRequest(payload) {
49
+ const timestamp = Date.now();
50
+ const nonce = randomUUID();
51
+ const data = `${timestamp}:${nonce}:${JSON.stringify(payload)}`;
52
+ const signature = createHmac('sha256', KERNEL_SECRET)
53
+ .update(data)
54
+ .digest('hex');
55
+ return { timestamp, nonce, signature, kernelId: KERNEL_ID };
56
+ }
57
+
58
+ // On every outbound MCP request:
59
+ const sig = signRequest(body);
60
+ headers['X-MCP-Kernel'] = sig.kernelId;
61
+ headers['X-MCP-Signature'] = sig.signature;
62
+ headers['X-MCP-Timestamp'] = String(sig.timestamp);
63
+ headers['X-MCP-Nonce'] = sig.nonce;
64
+ ```
65
+
66
+ Header names are project-namespaced; the upstream Ruflo file uses
67
+ `X-RVF-*`, the convention here is `X-MCP-*`.
68
+
69
+ ## Verification pattern (server-side counterpart)
70
+
71
+ ```js
72
+ import { createHmac, timingSafeEqual } from 'node:crypto';
73
+
74
+ const KERNEL_SECRET = process.env.MCP_KERNEL_SECRET;
75
+ const MAX_SKEW_MS = 5 * 60 * 1000; // 5 min
76
+ const seenNonces = new Map(); // nonce -> expiresAt
77
+
78
+ function verifyRequest(headers, rawBody) {
79
+ const ts = Number(headers['x-mcp-timestamp']);
80
+ const nonce = headers['x-mcp-nonce'];
81
+ const sig = headers['x-mcp-signature'];
82
+ if (!ts || !nonce || !sig) return false;
83
+ if (Math.abs(Date.now() - ts) > MAX_SKEW_MS) return false;
84
+ if (seenNonces.has(nonce)) return false; // replay
85
+ const data = `${ts}:${nonce}:${rawBody}`;
86
+ const expected = createHmac('sha256', KERNEL_SECRET).update(data).digest();
87
+ const got = Buffer.from(sig, 'hex');
88
+ if (got.length !== expected.length) return false;
89
+ if (!timingSafeEqual(got, expected)) return false;
90
+ seenNonces.set(nonce, Date.now() + MAX_SKEW_MS);
91
+ return true;
92
+ }
93
+ ```
94
+
95
+ `timingSafeEqual` is non-negotiable — `===` on a hex string is a timing
96
+ oracle. The nonce store must evict on `expiresAt` to bound memory; a
97
+ plain `setInterval` sweep every minute is enough.
98
+
99
+ ## Threat model
100
+
101
+ | Threat | Mitigation in this pattern |
102
+ |---|---|
103
+ | **Replay** — attacker captures a valid request and resends it | `nonce` + `seenNonces` set; replays inside the skew window are rejected, replays outside it fail the timestamp check |
104
+ | **MITM (non-stdio)** — wire-level rewrite | HMAC over `${ts}:${nonce}:${body}` — any payload tamper invalidates the signature; pair with TLS in production |
105
+ | **Clock skew abuse** — long-lived request | `MAX_SKEW_MS = 5 min` rejects out-of-window timestamps |
106
+ | **Timing oracle on signature compare** | `timingSafeEqual`, never `===` |
107
+ | **Secret exfil via repo / log** | `KERNEL_SECRET` from env or secrets store; never log raw headers; redact `X-MCP-Signature` in any audit trail |
108
+ | **Allowlist bypass** | Signing **does not** authorize what's called — pair with the allowlist enforced at server boot ([`road-to-mcp-server.md`](../../../agents/roadmaps/road-to-mcp-server.md) Phase 4 **D4**); a valid signature on a non-allowlisted tool name still rejects |
109
+
110
+ ## Citation hooks
111
+
112
+ - [`road-to-mcp-server.md`](../../../agents/roadmaps/road-to-mcp-server.md)
113
+ **Phase 4 D4** — allowlist enforced at server boot. Signing layers
114
+ *under* the allowlist: verify signature → look up tool in allowlist →
115
+ execute. Both gates must pass.
116
+ - [`road-to-mcp-server.md`](../../../agents/roadmaps/road-to-mcp-server.md)
117
+ **Phase 6 F2 / F3** — SSE transport, cloud bundle. These are the
118
+ triggers that make this guideline load-bearing; until then it is
119
+ reference material for the deferred-with-trigger HTTP-bridge slot of
120
+ [`road-to-ruflo-adoption.md`](../../../agents/roadmaps/road-to-ruflo-adoption.md)
121
+ Phase 2 P2.1.
122
+
123
+ ## Operational notes
124
+
125
+ - **Secret rotation** — rotate `MCP_KERNEL_SECRET` on a fixed cadence
126
+ (90 days minimum). Both client and server reload from env on the next
127
+ request; in-flight requests fail and retry with the new secret.
128
+ - **Multi-client deployments** — give every client kernel a distinct
129
+ `KERNEL_ID` so logs attribute to a source even though all use the
130
+ same shared secret.
131
+ - **Don't sign `tools/list`** — `tools/list` is read-only metadata; it
132
+ can stay unsigned in deployments where the metadata itself is public.
133
+ `tools/call` must always be signed.
134
+
135
+ ## Out-of-scope
136
+
137
+ - The full Express bridge in `ruflo/src/mcp-bridge/index.js` (~1.6k LOC,
138
+ HTTP routing, SSE streaming, auth proxying) — authoritative-link only,
139
+ not forked. If we ever need an HTTP-MCP server, build on this
140
+ guideline + the host's web framework, not on Ruflo's runtime.
141
+ - Asymmetric signing (Ed25519, ECDSA). HMAC-SHA256 is sufficient for
142
+ shared-secret deployments. Asymmetric is only worth the complexity
143
+ when keys cross trust boundaries the shared-secret model can't
144
+ represent.
145
+
146
+ ## Appendix — HTTP-bridge `stdio-kernel` pattern (reference)
147
+
148
+ Portable shape of Ruflo's `mcp-stdio-kernel.js` (~250 LOC), on hand for
149
+ the day a real HTTP-MCP consumer surfaces (`road-to-mcp-server.md`
150
+ Phase 6 F2 / F3). Full file stays **authoritative-link only**:
151
+ [`mcp-stdio-kernel.js`](https://github.com/ruvnet/ruflo/blob/1dd1db1ec2572ce68f6805dff98c177b5771cbf9/ruflo/src/mcp-bridge/mcp-stdio-kernel.js).
152
+
153
+ **Trigger to inline more:** both — (a) Phase 1 ships stdio prompt fetch
154
+ in ≥1 confirmed client, (b) ≥1 consumer surfaces a concrete HTTP-MCP
155
+ use case. Until then, this appendix + upstream link is the adoption.
156
+
157
+ ### Pattern shape
158
+
159
+ The kernel sits between the HTTP transport and the spawned stdio MCP
160
+ child. Inbound: HTTP → `verifyRequest` → JSON-RPC onto child stdin.
161
+ Outbound: child stdout → parsed → signed response → HTTP.
162
+
163
+ ```
164
+ client ──HTTP──▶ kernel.verify ──stdin──▶ stdio MCP child
165
+ client ◀─HTTP── kernel.sign ◀─stdout── stdio MCP child
166
+ ```
167
+
168
+ Six load-bearing pieces:
169
+
170
+ 1. **Process supervisor** — spawn with `stdio: ['pipe', 'pipe', 'inherit']`,
171
+ restart on exit with bounded backoff, SIGTERM on shutdown.
172
+ 2. **JSON-RPC framing** — newline-delimited JSON; buffer partial
173
+ stdout reads; drop unparseable frames with a logged warning, never
174
+ crash the bridge.
175
+ 3. **Request-id correlation** — kernel generates outbound `id`, maps
176
+ `kernelId → clientId`; slow calls can't cross-talk between HTTP
177
+ clients.
178
+ 4. **Verification gate** — `verifyRequest` (above) before stdin write;
179
+ failure is a 401, never a 500; never log the raw signature.
180
+ 5. **Allowlist enforcement** — after verify, look up the JSON-RPC
181
+ `method` in the boot-time allowlist (`road-to-mcp-server.md` **D4**).
182
+ Non-allowlisted → JSON-RPC `-32601 Method not found`; no enumeration
183
+ leak.
184
+ 6. **Backpressure** — bound the in-flight queue per kernel (Ruflo
185
+ uses 32); beyond it, return `429`. Otherwise a flood OOMs the child.
186
+
187
+ ### Out of this appendix
188
+
189
+ Express routes / middleware / SSE upgrade — host web framework.
190
+ Ruflo marketplace + `mcp__claude-flow__*` tools — never adopted (see
191
+ `road-to-ruflo-adoption.md` Sunset path). Multi-tenant routing —
192
+ out-of-scope until a consumer surfaces a tenancy requirement.
193
+
194
+ ### Citation hooks
195
+
196
+ - `road-to-mcp-server.md` **Phase 6 F2 / F3** — SSE / cloud-bundle work
197
+ starts here; the upstream link is the authoritative source.
198
+ - `road-to-ruflo-adoption.md` **P2.1** — landed this appendix; full
199
+ bridge fork stays out-of-scope unless the dual trigger fires.
@@ -9,10 +9,17 @@ _Origin: migrated from `.agent-src.uncompressed/rules/roadmap-progress-sync.md`
9
9
 
10
10
  # Roadmap Progress Sync
11
11
 
12
- > **Enforced by:** [`scripts/roadmap_progress_hook.py`](../../scripts/roadmap_progress_hook.py)
13
- > on Augment + Claude Code (`PostToolUse`). Hook is primary; the prose
14
- > below is the specification the hook implements and the fallback when
15
- > the platform has no hook surface.
12
+ > **Enforced by (defence in depth):**
13
+ > 1. [`scripts/roadmap_progress_hook.py`](../../scripts/roadmap_progress_hook.py)
14
+ > on Augment + Claude Code (`PostToolUse`) auto-regen on write.
15
+ > 2. `.git/hooks/pre-commit` (installed by `scripts/install-hooks.sh`)
16
+ > blocks any commit whose staged set touches `agents/roadmaps/` or
17
+ > `agents/roadmaps-progress.md` while the dashboard is stale.
18
+ > 3. `task ci` runs `roadmap-progress-check` so a PR cannot land with a
19
+ > stale dashboard even if local hooks were bypassed.
20
+ >
21
+ > Hook is primary; the prose below is the specification the hook
22
+ > implements and the fallback when the platform has no hook surface.
16
23
 
17
24
  ## Iron Law — dashboard sync
18
25
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@event4u/agent-config",
3
- "version": "1.22.0",
3
+ "version": "1.23.0",
4
4
  "description": "Shared agent configuration \u2014 skills, rules, commands, guidelines, and templates for AI coding tools",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -0,0 +1,5 @@
1
+ # scripts/_lib — shared helpers for scripts/*.py.
2
+ #
3
+ # Phase 10 of road-to-token-frugality. The first member is
4
+ # `script_output` — a thin verbosity-aware print router that reads
5
+ # `.agent-settings.yml` and the `AGENT_SCRIPT_VERBOSITY` env var.