@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.
- package/.agent-src/commands/agents.md +1 -0
- package/.agent-src/commands/challenge-me.md +1 -0
- package/.agent-src/commands/chat-history.md +1 -0
- package/.agent-src/commands/context.md +1 -0
- package/.agent-src/commands/council.md +1 -0
- package/.agent-src/commands/feature.md +1 -0
- package/.agent-src/commands/fix.md +1 -0
- package/.agent-src/commands/grill-me.md +1 -0
- package/.agent-src/commands/judge.md +1 -0
- package/.agent-src/commands/memory.md +1 -0
- package/.agent-src/commands/module.md +1 -0
- package/.agent-src/commands/onboard.md +32 -4
- package/.agent-src/commands/optimize.md +1 -0
- package/.agent-src/commands/override.md +1 -0
- package/.agent-src/commands/roadmap.md +1 -0
- package/.agent-src/commands/tests.md +1 -0
- package/.agent-src/rules/no-roadmap-references.md +19 -0
- package/.agent-src/skills/nextjs-patterns/SKILL.md +203 -0
- package/.agent-src/skills/symfony-workflow/SKILL.md +173 -0
- package/.agent-src/templates/scripts/work_engine/hook_bootstrap.py +4 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/__init__.py +3 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/decision_gate.py +162 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.py +32 -3
- package/.agent-src/templates/scripts/work_engine/hooks/settings.py +24 -6
- package/.agent-src/templates/scripts/work_engine/scoring/decision_engine.py +351 -0
- package/.agent-src/templates/scripts/work_engine/scoring/memory_visibility.py +147 -1
- package/.claude-plugin/marketplace.json +3 -1
- package/CHANGELOG.md +65 -0
- package/README.md +66 -17
- package/config/agent-settings.template.yml +85 -0
- package/docs/architecture.md +1 -1
- package/docs/contracts/STABILITY.md +16 -0
- package/docs/contracts/adr-chat-history-split.md +1 -0
- package/docs/contracts/adr-forecast-construction-shape.md +1 -0
- package/docs/contracts/adr-gtm-context-spine.md +1 -0
- package/docs/contracts/adr-level-6-productization.md +147 -0
- package/docs/contracts/adr-settings-sync-engine.md +1 -0
- package/docs/contracts/adr-wing4-context-spine.md +1 -0
- package/docs/contracts/agent-memory-contract.md +1 -0
- package/docs/contracts/agents-md-tech-stack.md +1 -0
- package/docs/contracts/audit-log-v1.md +1 -0
- package/docs/contracts/command-clusters.md +1 -0
- package/docs/contracts/command-surface-tiers.md +1 -0
- package/docs/contracts/context-paths.md +1 -0
- package/docs/contracts/cost-profile-defaults.md +105 -0
- package/docs/contracts/cross-wing-handoff.md +1 -0
- package/docs/contracts/decision-engine-gates.md +115 -0
- package/docs/contracts/decision-trace-v1.md +31 -0
- package/docs/contracts/file-ownership-matrix.md +1 -0
- package/docs/contracts/hook-architecture-v1.md +47 -0
- package/docs/contracts/implement-ticket-flow.md +1 -0
- package/docs/contracts/installed-tools-lockfile.md +1 -0
- package/docs/contracts/kernel-membership.md +1 -0
- package/docs/contracts/linear-ai-rules-inclusion.md +1 -0
- package/docs/contracts/linear-ai-three-layers.md +1 -0
- package/docs/contracts/linter-structural-model.md +1 -0
- package/docs/contracts/load-context-budget-model.md +1 -0
- package/docs/contracts/load-context-schema.md +1 -0
- package/docs/contracts/memory-visibility-v1.md +34 -0
- package/docs/contracts/one-off-script-lifecycle.md +1 -0
- package/docs/contracts/orchestration-dsl-v1.md +1 -0
- package/docs/contracts/package-self-orientation.md +1 -0
- package/docs/contracts/persona-schema.md +1 -0
- package/docs/contracts/release-trunk-sync.md +104 -0
- package/docs/contracts/roadmap-complexity-standard.md +1 -0
- package/docs/contracts/rule-classification.md +1 -0
- package/docs/contracts/rule-interactions.md +26 -0
- package/docs/contracts/rule-priority-hierarchy.md +1 -0
- package/docs/contracts/rule-router.md +1 -0
- package/docs/contracts/settings-sync-yaml-subset.md +139 -0
- package/docs/contracts/skill-domains.md +1 -0
- package/docs/contracts/tier-3-contrib-plugin.md +1 -0
- package/docs/contracts/ui-stack-extension.md +1 -0
- package/docs/contracts/ui-track-flow.md +1 -0
- package/docs/customization.md +1 -1
- package/docs/getting-started.md +3 -1
- package/docs/installation.md +8 -6
- package/docs/readme-split-plan.md +102 -0
- package/package.json +1 -1
- package/scripts/_cli/cmd_settings_check.py +171 -0
- package/scripts/agent-config +40 -0
- package/scripts/chat_history.py +19 -0
- package/scripts/check_beta_review_markers.py +127 -0
- package/scripts/check_council_references.py +46 -5
- package/scripts/check_release_trunk_sync.py +152 -0
- package/scripts/hooks/dispatch_hook.py +5 -1
- package/scripts/hooks/replay_hook.py +144 -0
- package/scripts/hooks/state_io.py +24 -1
- package/scripts/hooks_doctor.py +184 -0
- package/scripts/install.py +3 -3
- package/scripts/lint_hook_concern_budget.py +203 -0
- package/scripts/roadmap_progress_hook.py +11 -0
- package/scripts/schemas/command.schema.json +5 -0
- package/scripts/skill_linter.py +11 -2
- package/scripts/smoke_quickstart.py +134 -0
- 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
|
-
|
|
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
|
+
"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>
|
|
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
|
-
##
|
|
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
|
-
|
|
47
|
+
## Quickstart
|
|
18
48
|
|
|
19
|
-
|
|
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
|
-
|
|
51
|
+
```bash
|
|
52
|
+
# 1. Install (writes .agent-settings.yml, .augment/, .claude/, …)
|
|
53
|
+
npx @event4u/agent-config init
|
|
26
54
|
|
|
27
|
-
|
|
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
|
|
435
|
-
|
|
|
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
|
|
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) 📌 = 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 +
|
|
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/`,
|
|
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
|
|
639
|
-
task
|
|
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
|
package/docs/architecture.md
CHANGED
|
@@ -141,7 +141,7 @@ note, package-internal path-swap, description budget, and the
|
|
|
141
141
|
|
|
142
142
|
| Layer | Count | Purpose |
|
|
143
143
|
|---|---|---|
|
|
144
|
-
| **Skills** |
|
|
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
|