@event4u/agent-config 2.9.0 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/.agent-src/commands/agents.md +1 -0
  2. package/.agent-src/commands/challenge-me.md +1 -0
  3. package/.agent-src/commands/chat-history.md +1 -0
  4. package/.agent-src/commands/context.md +1 -0
  5. package/.agent-src/commands/council.md +1 -0
  6. package/.agent-src/commands/feature.md +1 -0
  7. package/.agent-src/commands/fix.md +1 -0
  8. package/.agent-src/commands/grill-me.md +1 -0
  9. package/.agent-src/commands/judge.md +1 -0
  10. package/.agent-src/commands/memory.md +1 -0
  11. package/.agent-src/commands/module.md +1 -0
  12. package/.agent-src/commands/onboard.md +32 -4
  13. package/.agent-src/commands/optimize.md +1 -0
  14. package/.agent-src/commands/override.md +1 -0
  15. package/.agent-src/commands/roadmap.md +1 -0
  16. package/.agent-src/commands/tests.md +1 -0
  17. package/.agent-src/rules/no-roadmap-references.md +19 -0
  18. package/.agent-src/skills/nextjs-patterns/SKILL.md +203 -0
  19. package/.agent-src/skills/symfony-workflow/SKILL.md +173 -0
  20. package/.agent-src/templates/scripts/work_engine/hook_bootstrap.py +4 -0
  21. package/.agent-src/templates/scripts/work_engine/hooks/builtin/__init__.py +3 -0
  22. package/.agent-src/templates/scripts/work_engine/hooks/builtin/decision_gate.py +162 -0
  23. package/.agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.py +32 -3
  24. package/.agent-src/templates/scripts/work_engine/hooks/settings.py +24 -6
  25. package/.agent-src/templates/scripts/work_engine/scoring/decision_engine.py +351 -0
  26. package/.agent-src/templates/scripts/work_engine/scoring/memory_visibility.py +147 -1
  27. package/.claude-plugin/marketplace.json +3 -1
  28. package/CHANGELOG.md +65 -0
  29. package/README.md +66 -17
  30. package/config/agent-settings.template.yml +85 -0
  31. package/docs/architecture.md +1 -1
  32. package/docs/contracts/STABILITY.md +16 -0
  33. package/docs/contracts/adr-chat-history-split.md +1 -0
  34. package/docs/contracts/adr-forecast-construction-shape.md +1 -0
  35. package/docs/contracts/adr-gtm-context-spine.md +1 -0
  36. package/docs/contracts/adr-level-6-productization.md +147 -0
  37. package/docs/contracts/adr-settings-sync-engine.md +1 -0
  38. package/docs/contracts/adr-wing4-context-spine.md +1 -0
  39. package/docs/contracts/agent-memory-contract.md +1 -0
  40. package/docs/contracts/agents-md-tech-stack.md +1 -0
  41. package/docs/contracts/audit-log-v1.md +1 -0
  42. package/docs/contracts/command-clusters.md +1 -0
  43. package/docs/contracts/command-surface-tiers.md +1 -0
  44. package/docs/contracts/context-paths.md +1 -0
  45. package/docs/contracts/cost-profile-defaults.md +105 -0
  46. package/docs/contracts/cross-wing-handoff.md +1 -0
  47. package/docs/contracts/decision-engine-gates.md +115 -0
  48. package/docs/contracts/decision-trace-v1.md +31 -0
  49. package/docs/contracts/file-ownership-matrix.md +1 -0
  50. package/docs/contracts/hook-architecture-v1.md +47 -0
  51. package/docs/contracts/implement-ticket-flow.md +1 -0
  52. package/docs/contracts/installed-tools-lockfile.md +1 -0
  53. package/docs/contracts/kernel-membership.md +1 -0
  54. package/docs/contracts/linear-ai-rules-inclusion.md +1 -0
  55. package/docs/contracts/linear-ai-three-layers.md +1 -0
  56. package/docs/contracts/linter-structural-model.md +1 -0
  57. package/docs/contracts/load-context-budget-model.md +1 -0
  58. package/docs/contracts/load-context-schema.md +1 -0
  59. package/docs/contracts/memory-visibility-v1.md +34 -0
  60. package/docs/contracts/one-off-script-lifecycle.md +1 -0
  61. package/docs/contracts/orchestration-dsl-v1.md +1 -0
  62. package/docs/contracts/package-self-orientation.md +1 -0
  63. package/docs/contracts/persona-schema.md +1 -0
  64. package/docs/contracts/release-trunk-sync.md +104 -0
  65. package/docs/contracts/roadmap-complexity-standard.md +1 -0
  66. package/docs/contracts/rule-classification.md +1 -0
  67. package/docs/contracts/rule-interactions.md +26 -0
  68. package/docs/contracts/rule-priority-hierarchy.md +1 -0
  69. package/docs/contracts/rule-router.md +1 -0
  70. package/docs/contracts/settings-sync-yaml-subset.md +139 -0
  71. package/docs/contracts/skill-domains.md +1 -0
  72. package/docs/contracts/tier-3-contrib-plugin.md +1 -0
  73. package/docs/contracts/ui-stack-extension.md +1 -0
  74. package/docs/contracts/ui-track-flow.md +1 -0
  75. package/docs/customization.md +1 -1
  76. package/docs/getting-started.md +3 -1
  77. package/docs/installation.md +8 -6
  78. package/docs/readme-split-plan.md +102 -0
  79. package/package.json +1 -1
  80. package/scripts/_cli/cmd_settings_check.py +171 -0
  81. package/scripts/agent-config +40 -0
  82. package/scripts/chat_history.py +19 -0
  83. package/scripts/check_beta_review_markers.py +127 -0
  84. package/scripts/check_council_references.py +46 -5
  85. package/scripts/check_release_trunk_sync.py +152 -0
  86. package/scripts/hooks/dispatch_hook.py +5 -1
  87. package/scripts/hooks/replay_hook.py +144 -0
  88. package/scripts/hooks/state_io.py +24 -1
  89. package/scripts/hooks_doctor.py +184 -0
  90. package/scripts/install.py +3 -3
  91. package/scripts/lint_hook_concern_budget.py +203 -0
  92. package/scripts/roadmap_progress_hook.py +11 -0
  93. package/scripts/schemas/command.schema.json +5 -0
  94. package/scripts/skill_linter.py +11 -2
  95. package/scripts/smoke_quickstart.py +134 -0
  96. package/scripts/validate_decision_engine.py +124 -0
@@ -4,6 +4,12 @@ Implements the v1 line shape from
4
4
  ``docs/contracts/memory-visibility-v1.md``:
5
5
 
6
6
  🧠 Memory: <hits>/<asks> · ids=[<comma-separated-ids>]
7
+ 🧠 Memory: <hits>/<asks> · ids=[<...>] · affected: <keys>
8
+
9
+ The optional ``· affected: <keys>`` trailing segment surfaces which
10
+ closed-list decision-trace keys diverged because memory was
11
+ consulted — see ``docs/contracts/decision-trace-v1.md`` "Memory
12
+ consequence keys".
7
13
 
8
14
  The semantics matched to the work-engine model:
9
15
 
@@ -23,6 +29,8 @@ from __future__ import annotations
23
29
 
24
30
  from typing import Any, Iterable
25
31
 
32
+ from .decision_trace import derive_confidence_band, derive_risk_class
33
+
26
34
  ICON = "\U0001F9E0" # 🧠
27
35
  DEFAULT_MAX_INLINE_IDS = 5
28
36
  DEFAULT_ASKED_TYPES = (
@@ -32,6 +40,13 @@ DEFAULT_ASKED_TYPES = (
32
40
  "historical-patterns",
33
41
  )
34
42
 
43
+ CONSEQUENCE_KEYS: tuple[str, ...] = (
44
+ "confidence_band",
45
+ "risk_class",
46
+ "applied_rules",
47
+ "test_plan",
48
+ )
49
+
35
50
 
36
51
  def summarise_visibility(
37
52
  memory: Any,
@@ -69,16 +84,111 @@ def summarise_visibility(
69
84
  return {"asks": asks, "hits": hits, "ids": ids}
70
85
 
71
86
 
87
+ def _normalise_key_value(value: Any) -> Any:
88
+ """Return a comparable shape for a consequence-key value.
89
+
90
+ List-shaped keys (``applied_rules``, ``test_plan``) compare as
91
+ sorted tuples so order is not a divergence; scalar keys
92
+ (``confidence_band``, ``risk_class``) compare as-is.
93
+ """
94
+ if isinstance(value, list):
95
+ return tuple(sorted(str(item) for item in value))
96
+ return value
97
+
98
+
99
+ def diff_consequence_keys(
100
+ trace_with: dict[str, Any], trace_without: dict[str, Any],
101
+ ) -> list[str]:
102
+ """Return sorted keys whose values diverge between two traces.
103
+
104
+ Iterates the closed ``CONSEQUENCE_KEYS`` list defined in
105
+ ``docs/contracts/decision-trace-v1.md``. A key is considered
106
+ *diverged* when its normalised value differs between the two
107
+ traces. Per the contract, when both sides are ``None`` the key
108
+ is suppressed from the diff entirely.
109
+ """
110
+ affected: list[str] = []
111
+ for key in CONSEQUENCE_KEYS:
112
+ a = trace_with.get(key)
113
+ b = trace_without.get(key)
114
+ if a is None and b is None:
115
+ continue
116
+ if _normalise_key_value(a) != _normalise_key_value(b):
117
+ affected.append(key)
118
+ return sorted(affected)
119
+
120
+
121
+ def compute_affected(
122
+ *,
123
+ memory_hits: int,
124
+ verify_claims: int = 0,
125
+ verify_first_try_passes: int = 0,
126
+ ambiguity_flag: bool = False,
127
+ changes: Any = None,
128
+ applied_rules: list[str] | None = None,
129
+ test_plan: list[str] | None = None,
130
+ ) -> list[str] | None:
131
+ """Compute the ``affected`` consequence keys for the visibility line.
132
+
133
+ Returns:
134
+ * ``None`` when no memory was consulted (``memory_hits <= 0``)
135
+ — caller MUST omit the ``· affected: …`` segment.
136
+ * ``[]`` when memory was consulted but no closed-list key
137
+ diverged — caller MUST render ``· affected: none``.
138
+ * sorted list of keys otherwise.
139
+
140
+ The counterfactual trace is "what the heuristics would have
141
+ emitted if ``memory_hits`` had been ``0``". v1 covers
142
+ ``confidence_band`` and ``risk_class`` via the existing scoring
143
+ helpers; ``applied_rules`` and ``test_plan`` pass through
144
+ unchanged because they are not yet memory-derived in the
145
+ engine — the keys stay in the closed list so the diff
146
+ infrastructure is in place when they wire in.
147
+ """
148
+ if memory_hits <= 0:
149
+ return None
150
+ trace_with = {
151
+ "confidence_band": derive_confidence_band(
152
+ memory_hits=memory_hits,
153
+ verify_claims=verify_claims,
154
+ verify_first_try_passes=verify_first_try_passes,
155
+ ambiguity_flag=ambiguity_flag,
156
+ ),
157
+ "risk_class": derive_risk_class(changes),
158
+ "applied_rules": list(applied_rules) if applied_rules else None,
159
+ "test_plan": list(test_plan) if test_plan else None,
160
+ }
161
+ trace_without = {
162
+ "confidence_band": derive_confidence_band(
163
+ memory_hits=0,
164
+ verify_claims=verify_claims,
165
+ verify_first_try_passes=verify_first_try_passes,
166
+ ambiguity_flag=ambiguity_flag,
167
+ ),
168
+ "risk_class": derive_risk_class(changes),
169
+ "applied_rules": list(applied_rules) if applied_rules else None,
170
+ "test_plan": list(test_plan) if test_plan else None,
171
+ }
172
+ return diff_consequence_keys(trace_with, trace_without)
173
+
174
+
72
175
  def format_line(
73
176
  summary: dict[str, Any],
74
177
  *,
75
178
  max_inline_ids: int = DEFAULT_MAX_INLINE_IDS,
179
+ affected: list[str] | None = None,
76
180
  ) -> str | None:
77
181
  """Render the visibility line; return ``None`` when ``asks == 0``.
78
182
 
79
183
  Cap inline ids at ``max_inline_ids`` and append ``…+N`` when the
80
184
  list is longer. Returning ``None`` enforces the contract clause
81
185
  "If ``asks == 0``, the engine MUST suppress the line entirely".
186
+
187
+ When ``affected`` is not ``None``, append the
188
+ ``· affected: <keys>`` trailing segment from
189
+ ``docs/contracts/memory-visibility-v1.md``: empty list renders as
190
+ ``affected: none`` (consulted but no key diverged);
191
+ non-empty list renders the comma-separated keys.
82
192
  """
83
193
  asks = int(summary.get("asks", 0) or 0)
84
194
  if asks <= 0:
@@ -94,7 +204,39 @@ def format_line(
94
204
  if overflow > 0:
95
205
  suffix = ", " if rendered_ids else ""
96
206
  rendered_ids = f"{rendered_ids}{suffix}\u2026+{overflow}"
97
- return f"{ICON} Memory: {hits}/{asks} \u00b7 ids=[{rendered_ids}]"
207
+ line = f"{ICON} Memory: {hits}/{asks} \u00b7 ids=[{rendered_ids}]"
208
+ if affected is not None:
209
+ rendered_affected = ",".join(affected) if affected else "none"
210
+ line = f"{line} \u00b7 affected: {rendered_affected}"
211
+ return line
212
+
213
+
214
+ def format_changed_decisions_block(
215
+ ids: Iterable[str], affected: Iterable[str] | None,
216
+ ) -> str | None:
217
+ """Render the end-of-run "Memory changed decisions" report block.
218
+
219
+ Per ``docs/contracts/memory-visibility-v1.md``: lists
220
+ ``<id> → <key>`` rows derived from the same diff source as the
221
+ visibility line's ``affected`` segment. Returns ``None`` when
222
+ no key diverged (``affected`` empty / ``None``) so the caller
223
+ suppresses the block entirely.
224
+
225
+ Attribution in v1 is aggregate: each consulted id pairs with
226
+ each affected key. Per-id attribution is captured as a
227
+ follow-up risk in the roadmap Risk register.
228
+ """
229
+ if not affected:
230
+ return None
231
+ affected_list = sorted(affected)
232
+ id_list = [str(i) for i in ids if isinstance(i, (str, int))]
233
+ if not id_list:
234
+ return None
235
+ lines = ["Memory changed decisions:"]
236
+ for entry_id in id_list:
237
+ for key in affected_list:
238
+ lines.append(f"- {entry_id} \u2192 {key}")
239
+ return "\n".join(lines)
98
240
 
99
241
 
100
242
  def should_emit(
@@ -116,9 +258,13 @@ def should_emit(
116
258
 
117
259
 
118
260
  __all__ = [
261
+ "CONSEQUENCE_KEYS",
119
262
  "DEFAULT_ASKED_TYPES",
120
263
  "DEFAULT_MAX_INLINE_IDS",
121
264
  "ICON",
265
+ "compute_affected",
266
+ "diff_consequence_keys",
267
+ "format_changed_decisions_block",
122
268
  "format_line",
123
269
  "should_emit",
124
270
  "summarise_visibility",
@@ -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": "2.9.0",
9
+ "version": "2.11.0",
10
10
  "keywords": [
11
11
  "agent-config",
12
12
  "skills",
@@ -219,6 +219,7 @@
219
219
  "./.claude/skills/module-explore",
220
220
  "./.claude/skills/module-management",
221
221
  "./.claude/skills/multi-tenancy",
222
+ "./.claude/skills/nextjs-patterns",
222
223
  "./.claude/skills/okr-tree-modeling",
223
224
  "./.claude/skills/onboard",
224
225
  "./.claude/skills/onboarding-design",
@@ -316,6 +317,7 @@
316
317
  "./.claude/skills/sql-writing",
317
318
  "./.claude/skills/stakeholder-tradeoff",
318
319
  "./.claude/skills/subagent-orchestration",
320
+ "./.claude/skills/symfony-workflow",
319
321
  "./.claude/skills/sync-agent-settings",
320
322
  "./.claude/skills/sync-gitignore",
321
323
  "./.claude/skills/sync-gitignore-fix",
package/CHANGELOG.md CHANGED
@@ -429,6 +429,71 @@ our recommendation order, not its support status.
429
429
  > that forces a new era split (`# Era: 2.8.x`, etc.) — see
430
430
  > [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
431
431
 
432
+ ## [2.11.0](https://github.com/event4u-app/agent-config/compare/2.10.0...2.11.0) (2026-05-14)
433
+
434
+ ### Features
435
+
436
+ * **stability:** add beta-review marker protocol and CI gate (P5.4) ([9b6cdfe](https://github.com/event4u-app/agent-config/commit/9b6cdfe9f9167e3e80551dfa2a88f80fff85646a))
437
+ * **lint:** add 'type: orchestrator' frontmatter tag for cluster routers (P5.3) ([e6385bb](https://github.com/event4u-app/agent-config/commit/e6385bbaf022dc3763f55c2dd54fe85046c59fd4))
438
+ * **skills:** add nextjs-patterns and symfony-workflow workflow skills (P4) ([038522b](https://github.com/event4u-app/agent-config/commit/038522b7ad2bd2ba1d8d8c4f9a61692694b7ebc8))
439
+ * **onboard:** add Quickstart pointer step and surface balanced default (P3.3) ([5879b4c](https://github.com/event4u-app/agent-config/commit/5879b4cc66fc9f49fa42c99e72794e4c60f43739))
440
+ * **install:** default cost_profile to balanced (P3.2) ([75caac2](https://github.com/event4u-app/agent-config/commit/75caac20fa2986222b5bd45a7cb63f07f9c4179f))
441
+ * **work-engine:** wire decision_gate hook into runner ([c41a89d](https://github.com/event4u-app/agent-config/commit/c41a89d38c7eb4892358b5c931abbe9a5889038c))
442
+ * **work-engine:** add decision_engine schema and gate evaluator ([fd1e8e2](https://github.com/event4u-app/agent-config/commit/fd1e8e2bb2e45e2288727ccd4a3bda4f809c6151))
443
+ * **release:** release-trunk-sync contract and CI gate (P1.2, P1.3) ([a3e0d12](https://github.com/event4u-app/agent-config/commit/a3e0d12c156c367c995e84c7c0bb5d6a21ff6325))
444
+
445
+ ### Bug Fixes
446
+
447
+ * **readme:** rename 'For contributors' to 'Development' for linter ([7957274](https://github.com/event4u-app/agent-config/commit/7957274c65895d80fa4801f95df876979362ee86))
448
+
449
+ ### Documentation
450
+
451
+ * **roadmap:** close + archive road-to-productization (Level-6) ([7ee50e8](https://github.com/event4u-app/agent-config/commit/7ee50e8b16f1ce7d4461f1466d9a6e46f4138101))
452
+ * **roadmap:** mark P3.1-P3.3 + P3.1a done in road-to-productization ([b0ff24f](https://github.com/event4u-app/agent-config/commit/b0ff24f23cb38d4ac556106c9ed060f104f83c8c))
453
+ * **readme:** add 3-step Quickstart and move contributor detail below the fold (P3.1) ([b98152e](https://github.com/event4u-app/agent-config/commit/b98152eb86607d6b34f63ea9ad4c152951de58a6))
454
+ * **roadmap:** mark P2.1-P2.3 done in road-to-productization ([189c780](https://github.com/event4u-app/agent-config/commit/189c780faef19cfbd9bceb3ad51ec42cb8cb05b7))
455
+
456
+ ### CI
457
+
458
+ * **install:** add structural Quickstart smoke test (P3.1a) ([228445b](https://github.com/event4u-app/agent-config/commit/228445b97eefb20118bbea2872640c54225a1355))
459
+ * **work-engine:** validate decision_engine block in agent-settings ([1a1f428](https://github.com/event4u-app/agent-config/commit/1a1f428bec4832f8ffb222a8b450719ba6409605))
460
+
461
+ ### Chores
462
+
463
+ * **generate-tools:** expose nextjs-patterns + symfony-workflow skills ([3422ac7](https://github.com/event4u-app/agent-config/commit/3422ac7e3f273497a0cbb176b2580a0cf1256522))
464
+ * **sync:** align orchestrator frontmatter + hash registry ([0e9ba2d](https://github.com/event4u-app/agent-config/commit/0e9ba2d50463ca99baf86651ea67ed82ca63d7f6))
465
+ * **gitignore:** ignore python coverage artifacts ([e1a3289](https://github.com/event4u-app/agent-config/commit/e1a328921f08fad03325adc256b63a544582efb7))
466
+
467
+ Tests: 3718 (+55 since 2.10.0)
468
+
469
+ ## [2.10.0](https://github.com/event4u-app/agent-config/compare/2.9.0...2.10.0) (2026-05-14)
470
+
471
+ ### Features
472
+
473
+ * **ci:** lint-hook-concern-budget Tier-1 fail-closed gate ([8d60b8a](https://github.com/event4u-app/agent-config/commit/8d60b8ab464c4c5bdc6d072bb2a9b0123942e13b))
474
+ * **cli:** settings:check command + YAML subset contract ([638e740](https://github.com/event4u-app/agent-config/commit/638e74017ffea8d7c08073a949e86fde047db109))
475
+ * **hooks:** hooks:doctor + hooks:replay subcommands + fixture corpus ([3156e25](https://github.com/event4u-app/agent-config/commit/3156e25fd3253fc926a57b92e14b407a9ed54b58))
476
+ * **work-engine:** add decision-trace memory_visibility hook + scoring ([bf056ac](https://github.com/event4u-app/agent-config/commit/bf056ace877a696afa5fe758053ea1eb350e5dff))
477
+
478
+ ### Bug Fixes
479
+
480
+ * **roadmap:** point productization P6 gate at archived proof-not-features path ([35a1009](https://github.com/event4u-app/agent-config/commit/35a1009cffdfde28c7b0384c890c31a7e62b70cf))
481
+
482
+ ### Documentation
483
+
484
+ * **roadmap:** complete road-to-proof-not-features 16/16 + sync dashboard ([89af72d](https://github.com/event4u-app/agent-config/commit/89af72d5514b74c19d533b5a2e69ff7ddf16ecbc))
485
+ * **readme:** split README by audience + audience-order contract ([60a87c0](https://github.com/event4u-app/agent-config/commit/60a87c056555a80585d25555f3d5b87d54c7283a))
486
+
487
+ ### Refactoring
488
+
489
+ * **check-council-references:** structural carve-outs for immutable inputs and decision provenance ([3ed7784](https://github.com/event4u-app/agent-config/commit/3ed77841c42c5e3ebf4191611bb7fa4a52ed2fa0))
490
+
491
+ ### Chores
492
+
493
+ * **roadmap:** archive road-to-proof-not-features (16/16 done, Phase 1 deferred) ([9d05aed](https://github.com/event4u-app/agent-config/commit/9d05aed79a46023b1e95c5488a1e3d5e78748e67))
494
+
495
+ Tests: 3663 (+60 since 2.9.0)
496
+
432
497
  ## [2.9.0](https://github.com/event4u-app/agent-config/compare/2.8.0...2.9.0) (2026-05-13)
433
498
 
434
499
  ### Features
package/README.md CHANGED
@@ -7,24 +7,68 @@ 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>206 Skills</strong> · <strong>61 Rules</strong> · <strong>106 Commands</strong> · <strong>72 Guidelines</strong> · <strong>8 AI Tools</strong>
10
+ <strong>208 Skills</strong> · <strong>61 Rules</strong> · <strong>106 Commands</strong> · <strong>72 Guidelines</strong> · <strong>8 AI Tools</strong>
11
11
  </p>
12
12
 
13
13
  ---
14
14
 
15
- ## Start here
15
+ ## Use it in your project
16
+
17
+ You run the package from a consumer repo — bootstrap via `npx`, let the
18
+ agent pick up your stack, and ship work end-to-end. New install? Start
19
+ with the [Quickstart](#quickstart) to write `.agent-settings.yml`,
20
+ `.augment/`, `.claude/`, …. Already installed? [Supported Tools](#supported-tools)
21
+ shows which AIs the package wires up, and [Featured Commands](#featured-commands)
22
+ lists the end-to-end workflows (`/implement-ticket`, `/work`, `/commit`,
23
+ `/create-pr`). For a deeper tour, see the
24
+ [2-minute demo: `/implement-ticket`](#2-minute-demo-implement-ticket).
25
+
26
+ ## Prove it
27
+
28
+ The package is audit-disciplined by construction — every memory consult,
29
+ decision key, and hook concern lands in `agents/state/` so you can
30
+ replay it. [Core Principles](#core-principles) names the four invariants.
31
+ [What this package is — and what it isn't](#what-this-package-is--and-what-it-isnt)
32
+ draws the scope boundary. [Documentation](#documentation) lists the
33
+ contracts the package ships against, including
34
+ [`memory-visibility-v1`](docs/contracts/memory-visibility-v1.md) and
35
+ [`decision-trace-v1`](docs/contracts/decision-trace-v1.md).
36
+
37
+ ## Contribute
38
+
39
+ Working on the package itself rather than with it?
40
+ [Development](#development) covers the `task ci` pipeline,
41
+ [Requirements](#requirements) the toolchain, and
42
+ [Maintainer telemetry](#maintainer-telemetry-opt-in-default-off) the
43
+ opt-in measurement loop. The source-of-truth tree is
44
+ `.agent-src.uncompressed/`; never hand-edit the generated `.augment/`
45
+ or `.agent-src/`.
16
46
 
17
- Three ways in, depending on what you're doing today:
47
+ ## Quickstart
18
48
 
19
- | Path | Audience | What it does |
20
- |---|---|---|
21
- | **[`/onboard`](.agent-src/commands/onboard.md)** | New user, fresh install | Captures name, IDE, rtk, and cost profile; sets `onboarding.onboarded=true` |
22
- | **[`task ci`](docs/development.md#ci--verification)** | Contributor working **on** this package | Runs the full sync + lint + test pipeline; must be green before push |
23
- | **[`task generate-tools`](docs/development.md#tool-generation)** | Multi-agent user / consumer project | Rebuilds `.claude/`, `.cursor/`, `.clinerules/`, `.windsurfrules` from the source |
49
+ **Three steps. Five minutes. Decision-traced first task.**
24
50
 
25
- If none of those apply yet — start with the [Quickstart](#quickstart) and pick a path once it's installed.
51
+ ```bash
52
+ # 1. Install (writes .agent-settings.yml, .augment/, .claude/, …)
53
+ npx @event4u/agent-config init
26
54
 
27
- ## Quickstart
55
+ # 2. First-run setup (sets your name, IDE, cost profile)
56
+ # Open your AI agent (Claude Code, Cursor, …) and type:
57
+ /onboard
58
+
59
+ # 3. First real task — agent refines, plans, logs a decision_result
60
+ /work "your first real task"
61
+ ```
62
+
63
+ A `decision_result` entry lands in `agents/state/` confirming the
64
+ work-engine phases ran end-to-end. Stack-aware skills auto-load.
65
+
66
+ > Pick specific AIs, switch to global scope, deploy MCP on Cloudflare,
67
+ > or wire optional memory — see [**Detailed installation**](#detailed-installation)
68
+ > below. Contributors rebuilding the package — jump to
69
+ > [**Development**](#development).
70
+
71
+ ### Detailed installation
28
72
 
29
73
  Two minutes from `npx` to a better-behaved agent — no install, no
30
74
  vendored package, no postinstall hook.
@@ -431,12 +475,14 @@ kernel set: [`docs/contracts/kernel-membership.md`](docs/contracts/kernel-member
431
475
  | Stack | Coverage |
432
476
  |---|---|
433
477
  | Laravel · modern PHP | Skills, rules, project-analysis, quality-tool wiring (Pest · PHPStan · Rector · ECS) |
434
- | Symfony · Zend / Laminas | Project-analysis skills + shared PHP coder/quality skills |
435
- | Next.js · React · Node / Express | Project-analysis skills + UI directive set (`react-shadcn`) |
478
+ | Symfony | Workflow skill (`symfony-workflow`) + project-analysis + shared PHP coder/quality skills |
479
+ | Zend / Laminas | Project-analysis skills + shared PHP coder/quality skills |
480
+ | Next.js · App Router | Workflow skill (`nextjs-patterns`) + project-analysis + UI directive set (`react-shadcn`) |
481
+ | React · Node / Express | Project-analysis skills + UI directive set (`react-shadcn`) |
436
482
  | Vue · plain HTML | UI directive set (`vue` / `plain`) — analysis skills as they ship |
437
483
  | Cross-stack | API design · testing · security · database · Docker · Git · CI · review · threat modeling · observability |
438
484
 
439
- **Deepest reference stack today: Laravel.** Skill density covers Pest, PHPStan, Rector, Eloquent, Livewire/Flux, Horizon, Pulse, Reverb, Pennant — the stack the package was first proven on. Other stacks ship in the order they are battle-tested, not second-class. Adopting on a thin stack? Open an issue so we can prioritize the right skills for extraction.
485
+ **Deepest reference stack today: Laravel** Pest, PHPStan, Rector, Eloquent, Livewire/Flux, Horizon, Pulse, Reverb, Pennant. **Workflow-grade second tier: Symfony** (`symfony-workflow` DI, Doctrine, Messenger, voters, Twig) and **Next.js App Router** (`nextjs-patterns` — RSC boundaries, Server Actions, caching, route handlers). Other stacks ship in the order they are battle-tested, not second-class. Adopting on a thin stack? Open an issue so we can prioritize the right skills for extraction.
440
486
 
441
487
  ---
442
488
 
@@ -510,7 +556,7 @@ slash-commands) &nbsp; 📌 = informational marker only (no auto-discovery
510
556
  or manual wiring required)
511
557
 
512
558
  > **What this means in practice:** Claude Code gets the full project-scoped
513
- > package (rules + 206 skills + 106 native commands); Augment Code gets the
559
+ > package (rules + 208 skills + 106 native commands); Augment Code gets the
514
560
  > same content but only from a single global install at `~/.augment/`.
515
561
  > Cursor, Cline, Windsurf, Gemini CLI, GitHub Copilot, Roo Code, Codex CLI,
516
562
  > and Continue.dev only get the **rules** natively; skills and commands are
@@ -632,11 +678,14 @@ re-enabled or the chat ends. Full scoring contract and hardening:
632
678
 
633
679
  ## Development
634
680
 
635
- Edit in `.agent-src.uncompressed/`, compress, verify:
681
+ Working on the package itself? Edit in `.agent-src.uncompressed/`,
682
+ then regenerate compressed and projected trees:
636
683
 
637
684
  ```bash
638
- task ci # Run all CI checks
639
- task test # Run all tests
685
+ task sync # regenerate .agent-src/ and .augment/
686
+ task generate-tools # regenerate .claude/, .cursor/, .clinerules/, .windsurfrules
687
+ task ci # full pipeline — green before PR
688
+ task test # unit + integration tests
640
689
  ```
641
690
 
642
691
  → Full commands and project structure: [**docs/development.md**](docs/development.md)
@@ -390,6 +390,91 @@ memory:
390
390
  # Example: ["api[_-]?key", "/Users/[a-z]+/Library"]
391
391
  redact_patterns: []
392
392
 
393
+ # --- Hooks ---
394
+ #
395
+ # Configuration surface for the hook dispatcher (see
396
+ # docs/contracts/hook-architecture-v1.md). Each subkey targets one
397
+ # concern script under scripts/hooks/ or scripts/. Defaults are safe;
398
+ # tune only when CI surfaces a real signal.
399
+ hooks:
400
+ # Concern budget gate (P3.3, lint_hook_concern_budget.py). Caps how
401
+ # many concerns may bind to a single (platform, event) cell and
402
+ # restricts fail_closed=true to an explicit Tier-1 allowlist.
403
+ #
404
+ # max_per_event — placeholder until Phase 1 of
405
+ # road-to-proof-not-features.md captures real session evidence.
406
+ # Threshold rule per roadmap: max(observed-in-Phase-1) × 1.5, rounded
407
+ # up. 8 = current-observed-max (5) × 1.5 = 7.5 → 8.
408
+ #
409
+ # tier1_concerns — concerns allowed to block agent execution on
410
+ # failure (fail_closed: true in the manifest). Promotion is explicit
411
+ # opt-in; keep empty until Phase 1 evidence justifies an entry.
412
+ #
413
+ # hard_fail — false = warn-only (default). Flip to true after ≥10
414
+ # captured sessions across host agents per
415
+ # road-to-distribution-and-adoption.md.
416
+ concern_budget:
417
+ max_per_event: 8
418
+ tier1_concerns: []
419
+ hard_fail: false
420
+
421
+ # --- Decision engine ---
422
+ #
423
+ # Controllable gates layered over the observability surface. Absent
424
+ # block = current behaviour (observe-only, no gates fire). Enforcement
425
+ # is strictly opt-in; the engine never silently rejects work without
426
+ # a configured gate. See docs/contracts/decision-engine-gates.md for
427
+ # the full schema, gate-conflict matrix, and non-TTY timeout protocol.
428
+ #
429
+ # Gate-conflict resolution (only the first firing gate per phase
430
+ # surfaces a reason; downstream gates are skipped):
431
+ # 1. block_on_risk (Phase=Implement, highest impact)
432
+ # 2. require_memory_hits (Phase=Refine)
433
+ # 3. min_confidence (Phase=Plan, lowest impact)
434
+ #
435
+ # Unknown keys are rejected hard by scripts/validate_decision_engine.py
436
+ # (wired into `task ci`). Removing the entire block restores observe-only.
437
+ decision_engine:
438
+ # Opt-in for DecisionTraceHook (default false). Mirrored into
439
+ # hooks.decision_trace.enabled by work_engine.hooks.settings.
440
+ surface_traces: false
441
+
442
+ # Confidence-band floor for Phase=Plan.
443
+ # off = no floor (default)
444
+ # low = refuse to advance when band is below low
445
+ # medium = refuse when below medium
446
+ # high = refuse when below high
447
+ min_confidence: off
448
+
449
+ # Risk-class ceiling for Phase=Implement.
450
+ # off = no ceiling (default)
451
+ # low = refuse when risk_class >= low (most aggressive)
452
+ # medium = refuse when risk_class >= medium
453
+ # high = refuse only when risk_class == high
454
+ block_on_risk: off
455
+
456
+ # Phase=Refine demands at least one memory hit when true (default false).
457
+ # Gated on road-to-proof-not-features.md P2 (memory-consequence trace);
458
+ # leaving this off avoids opaque rejections until the trace can explain
459
+ # which memory entry was missing.
460
+ require_memory_hits: false
461
+
462
+ # What happens when a gate fires.
463
+ # stop = halt the engine with reason on the trace (default)
464
+ # ask = prompt the user; falls back to on_block_fallback in CI
465
+ # warn = log the reason but advance
466
+ on_block: stop
467
+
468
+ # Non-TTY timeout (seconds) when on_block=ask runs without a TTY
469
+ # (CI=true env or stdin not a TTY). After the timeout, the engine
470
+ # applies on_block_fallback and surfaces block_reason=ask_timeout.
471
+ ask_timeout_seconds: 30
472
+
473
+ # Resolution after ask_timeout fires.
474
+ # stop = halt the engine (default — fail-safe)
475
+ # warn = log and advance
476
+ on_block_fallback: stop
477
+
393
478
  # --- Update check ---
394
479
  #
395
480
  # Daily background check against the npm registry for a newer
@@ -141,7 +141,7 @@ note, package-internal path-swap, description budget, and the
141
141
 
142
142
  | Layer | Count | Purpose |
143
143
  |---|---|---|
144
- | **Skills** | 206 | On-demand expertise — stack analysis (Laravel · Symfony · Zend / Laminas · Next.js · React · Node), testing, Docker, API design, security, observability, … |
144
+ | **Skills** | 208 | On-demand expertise — stack analysis (Laravel · Symfony · Zend / Laminas · Next.js · React · Node), testing, Docker, API design, security, observability, … |
145
145
  | **Rules** | 61 | Always-active constraints — coding standards, scope control, verification, language-and-tone, agent-authority |
146
146
  | **Commands** | 106 | Slash-command workflows — `/commit`, `/create-pr`, `/fix ci`, `/optimize skills`, `/feature plan`, `/work`, `/implement-ticket`, `/compress`, … |
147
147
  | **Guidelines** | 72 | Reference material cited by skills — PHP patterns, Eloquent, Playwright, agent-infra, … |
@@ -83,6 +83,22 @@ Promotion criteria:
83
83
  with the contract unchanged, or the contract has been explicitly
84
84
  frozen as part of a roadmap step.
85
85
 
86
+ ## Beta-review markers
87
+
88
+ Every `stability: beta` contract MUST carry exactly one of the
89
+ following frontmatter markers (audit-acceptance for the periodic beta
90
+ review; see `road-to-productization.md` § P5.4):
91
+
92
+ | Marker | Shape | Meaning |
93
+ |---|---|---|
94
+ | `promote-to: stable` | literal | Contract has been ≥ 30 days in beta, zero breaking changes in the last 14 days, ≥ 1 consumer reference. Schedule promotion in the next release. |
95
+ | `keep-beta-until: YYYY-MM-DD` | ISO date | API still moving or consumer count = 0. Date is the next review deadline (max 90 days from the last review). |
96
+ | `superseded-by: <contract-id>` | string | Replaced by a stable contract. Slated for deprecation, not deletion. |
97
+
98
+ The audit is repeated whenever the `keep-beta-until` date passes for
99
+ ≥ 25 % of beta contracts, or at the start of any roadmap phase that
100
+ touches the contract surface.
101
+
86
102
  ## Current contracts
87
103
 
88
104
  See the file headers themselves for current levels. The frontmatter is
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  stability: beta
3
+ keep-beta-until: 2026-08-12
3
4
  ---
4
5
 
5
6
  # ADR — Chat-history rule split
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  stability: beta
3
+ keep-beta-until: 2026-08-12
3
4
  ---
4
5
 
5
6
  # ADR — `forecast-construction-shape`: the O2 ↔ H10 interface
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  stability: beta
3
+ keep-beta-until: 2026-08-12
3
4
  ---
4
5
 
5
6
  # ADR — GTM context-spine: Wing-3 slot extension