@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.
- package/.agent-src/commands/agents/cleanup.md +31 -17
- package/.agent-src/commands/commit/in-chunks.md +30 -10
- package/.agent-src/commands/commit.md +46 -6
- package/.agent-src/commands/compress.md +19 -13
- package/.agent-src/commands/cost-report.md +120 -0
- package/.agent-src/commands/create-pr/description-only.md +8 -0
- package/.agent-src/commands/create-pr.md +95 -80
- package/.agent-src/commands/feature/plan.md +13 -7
- package/.agent-src/commands/memory/add.md +16 -8
- package/.agent-src/commands/memory/promote.md +17 -9
- package/.agent-src/commands/optimize/rtk.md +16 -11
- package/.agent-src/commands/prepare-for-review.md +12 -6
- package/.agent-src/commands/project-analyze.md +31 -20
- package/.agent-src/commands/review-changes.md +24 -15
- package/.agent-src/commands/roadmap/create.md +14 -9
- package/.agent-src/contexts/contracts/frugality-charter.md +57 -0
- package/.agent-src/rules/architecture.md +9 -0
- package/.agent-src/rules/ask-when-uncertain.md +3 -13
- package/.agent-src/rules/caveman-speak.md +78 -0
- package/.agent-src/rules/direct-answers.md +5 -14
- package/.agent-src/rules/markdown-safe-codeblocks.md +6 -7
- package/.agent-src/rules/no-cheap-questions.md +4 -14
- package/.agent-src/rules/token-efficiency.md +5 -7
- package/.agent-src/skills/adr-create/SKILL.md +197 -0
- package/.agent-src/skills/agent-docs-writing/SKILL.md +23 -1
- package/.agent-src/skills/command-writing/SKILL.md +23 -0
- package/.agent-src/skills/context-authoring/SKILL.md +23 -0
- package/.agent-src/skills/conventional-commits-writing/SKILL.md +23 -0
- package/.agent-src/skills/guideline-writing/SKILL.md +22 -0
- package/.agent-src/skills/persona-writing/SKILL.md +153 -0
- package/.agent-src/skills/readme-writing/SKILL.md +20 -0
- package/.agent-src/skills/readme-writing-package/SKILL.md +19 -0
- package/.agent-src/skills/roadmap-writing/SKILL.md +157 -0
- package/.agent-src/skills/rule-writing/SKILL.md +22 -0
- package/.agent-src/skills/script-writing/SKILL.md +226 -0
- package/.agent-src/skills/skill-writing/SKILL.md +23 -0
- package/.agent-src/skills/test-driven-development/SKILL.md +24 -0
- package/.agent-src/templates/agent-settings.md +73 -0
- package/.agent-src/templates/command.md +15 -10
- package/.agent-src/templates/rule.md +6 -0
- package/.agent-src/templates/skill.md +32 -0
- package/.claude-plugin/marketplace.json +6 -1
- package/AGENTS.md +3 -3
- package/CHANGELOG.md +35 -0
- package/README.md +5 -5
- package/docs/architecture.md +4 -4
- package/docs/customization.md +72 -0
- package/docs/decisions/INDEX.md +15 -0
- package/docs/getting-started.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +27 -19
- package/docs/guidelines/agent-infra/carve-out-predicates.md +17 -0
- package/docs/guidelines/agent-infra/mcp-request-signing.md +199 -0
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +11 -4
- package/package.json +1 -1
- package/scripts/_lib/__init__.py +5 -0
- package/scripts/_lib/script_output.py +140 -0
- package/scripts/adr/regenerate_index.py +79 -0
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_add_quiet.py +149 -0
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_inject_quiet_flag.py +33 -0
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_v2.sh +36 -0
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_verbosity.sh +26 -0
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_per_task.sh +41 -0
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_silent_taskfiles.py +98 -0
- package/scripts/check_augmentignore.py +4 -1
- package/scripts/check_command_count_messaging.py +4 -1
- package/scripts/check_compressed_paths.py +4 -1
- package/scripts/check_council_layout.py +4 -1
- package/scripts/check_council_references.py +4 -1
- package/scripts/check_iron_law_prominence.py +3 -1
- package/scripts/check_md_language.py +3 -1
- package/scripts/check_memory_proposal.py +3 -1
- package/scripts/check_public_catalog_links.py +4 -1
- package/scripts/check_reply_consistency.py +8 -2
- package/scripts/check_roadmap_trackable.py +4 -1
- package/scripts/compile_router.py +27 -0
- package/scripts/compress.py +33 -19
- package/scripts/cost/budget.mjs +152 -0
- package/scripts/cost/track.mjs +144 -0
- package/scripts/first-run.sh +3 -9
- package/scripts/install-hooks.sh +19 -1
- package/scripts/install.py +17 -12
- package/scripts/install.sh +19 -8
- package/scripts/lint_examples.py +6 -2
- package/scripts/lint_handoffs.py +4 -1
- package/scripts/lint_load_context.py +4 -1
- package/scripts/lint_roadmap_complexity.py +6 -2
- package/scripts/lint_rule_interactions.py +4 -1
- package/scripts/lint_rule_tiers.py +4 -1
- package/scripts/measure_frugality_savings.py +164 -0
- package/scripts/runtime_dispatcher.py +11 -0
- 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.
|
|
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/ (
|
|
171
|
-
rules/ (
|
|
172
|
-
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>
|
|
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
|
|
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 +
|
|
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)
|
package/docs/architecture.md
CHANGED
|
@@ -96,10 +96,10 @@ fails on any source-side violation, without producing artifacts.
|
|
|
96
96
|
|
|
97
97
|
| Layer | Count | Purpose |
|
|
98
98
|
|---|---|---|
|
|
99
|
-
| **Skills** |
|
|
100
|
-
| **Rules** |
|
|
101
|
-
| **Commands** |
|
|
102
|
-
| **Guidelines** |
|
|
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
|
|
package/docs/customization.md
CHANGED
|
@@ -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) | — | — | — | — |
|
package/docs/getting-started.md
CHANGED
|
@@ -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
|
|
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
|
|
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.
|
|
16
|
-
|
|
17
|
-
|
|
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" (
|
|
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"
|
|
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.
|
|
53
|
-
|
|
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).
|
|
70
|
-
|
|
71
|
-
|
|
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
|
|
13
|
-
>
|
|
14
|
-
>
|
|
15
|
-
>
|
|
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