@event4u/agent-config 1.17.0 → 1.19.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/council/default.md +74 -76
- package/.agent-src/commands/feature/roadmap.md +22 -0
- package/.agent-src/commands/roadmap/create.md +38 -6
- package/.agent-src/commands/roadmap/execute.md +36 -9
- package/.agent-src/rules/agent-authority.md +1 -0
- package/.agent-src/rules/agent-docs.md +1 -0
- package/.agent-src/rules/analysis-skill-routing.md +1 -0
- package/.agent-src/rules/architecture.md +1 -0
- package/.agent-src/rules/artifact-drafting-protocol.md +1 -0
- package/.agent-src/rules/artifact-engagement-recording.md +1 -0
- package/.agent-src/rules/ask-when-uncertain.md +1 -0
- package/.agent-src/rules/augment-portability.md +1 -0
- package/.agent-src/rules/augment-source-of-truth.md +1 -0
- package/.agent-src/rules/autonomous-execution.md +1 -0
- package/.agent-src/rules/capture-learnings.md +1 -0
- package/.agent-src/rules/chat-history-cadence.md +34 -0
- package/.agent-src/rules/chat-history-ownership.md +1 -0
- package/.agent-src/rules/chat-history-visibility.md +1 -0
- package/.agent-src/rules/cli-output-handling.md +2 -2
- package/.agent-src/rules/command-suggestion-policy.md +1 -0
- package/.agent-src/rules/commit-conventions.md +1 -0
- package/.agent-src/rules/commit-policy.md +1 -0
- package/.agent-src/rules/context-hygiene.md +28 -0
- package/.agent-src/rules/direct-answers.md +18 -26
- package/.agent-src/rules/docker-commands.md +1 -0
- package/.agent-src/rules/docs-sync.md +1 -0
- package/.agent-src/rules/downstream-changes.md +1 -0
- package/.agent-src/rules/e2e-testing.md +1 -0
- package/.agent-src/rules/guidelines.md +1 -0
- package/.agent-src/rules/improve-before-implement.md +1 -0
- package/.agent-src/rules/language-and-tone.md +1 -0
- package/.agent-src/rules/laravel-translations.md +1 -0
- package/.agent-src/rules/markdown-safe-codeblocks.md +1 -0
- package/.agent-src/rules/minimal-safe-diff.md +1 -0
- package/.agent-src/rules/missing-tool-handling.md +1 -0
- package/.agent-src/rules/model-recommendation.md +1 -0
- package/.agent-src/rules/no-cheap-questions.md +15 -21
- package/.agent-src/rules/no-roadmap-references.md +1 -0
- package/.agent-src/rules/non-destructive-by-default.md +1 -0
- package/.agent-src/rules/onboarding-gate.md +33 -0
- package/.agent-src/rules/package-ci-checks.md +1 -0
- package/.agent-src/rules/php-coding.md +1 -0
- package/.agent-src/rules/preservation-guard.md +1 -0
- package/.agent-src/rules/review-routing-awareness.md +1 -0
- package/.agent-src/rules/reviewer-awareness.md +1 -0
- package/.agent-src/rules/roadmap-progress-sync.md +49 -0
- package/.agent-src/rules/role-mode-adherence.md +2 -2
- package/.agent-src/rules/rule-type-governance.md +29 -0
- package/.agent-src/rules/runtime-safety.md +1 -0
- package/.agent-src/rules/scope-control.md +1 -0
- package/.agent-src/rules/security-sensitive-stop.md +1 -0
- package/.agent-src/rules/size-enforcement.md +1 -0
- package/.agent-src/rules/skill-improvement-trigger.md +1 -0
- package/.agent-src/rules/skill-quality.md +1 -0
- package/.agent-src/rules/slash-command-routing-policy.md +39 -0
- package/.agent-src/rules/think-before-action.md +1 -0
- package/.agent-src/rules/token-efficiency.md +1 -0
- package/.agent-src/rules/tool-safety.md +1 -0
- package/.agent-src/rules/ui-audit-gate.md +1 -0
- package/.agent-src/rules/upstream-proposal.md +1 -0
- package/.agent-src/rules/user-interaction.md +1 -0
- package/.agent-src/rules/verify-before-complete.md +1 -0
- package/.agent-src/skills/roadmap-management/SKILL.md +29 -4
- package/.agent-src/skills/verify-completion-evidence/SKILL.md +8 -1
- package/.agent-src/templates/agent-settings.md +16 -0
- package/.agent-src/templates/roadmaps.md +12 -3
- package/.agent-src/templates/scripts/work_engine/hook_bootstrap.py +9 -0
- package/.agent-src/templates/scripts/work_engine/hooks/__init__.py +4 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/__init__.py +4 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.py +163 -0
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.py +111 -0
- package/.agent-src/templates/scripts/work_engine/hooks/settings.py +36 -0
- package/.agent-src/templates/scripts/work_engine/scoring/decision_trace.py +141 -0
- package/.agent-src/templates/scripts/work_engine/scoring/memory_visibility.py +125 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +97 -0
- package/README.md +20 -20
- package/config/agent-settings.template.yml +23 -0
- package/docs/architecture.md +1 -1
- package/docs/catalog.md +5 -2
- package/docs/contracts/adr-settings-sync-engine.md +127 -0
- package/docs/contracts/decision-trace-v1.md +146 -0
- package/docs/contracts/file-ownership-matrix.json +7 -0
- package/docs/contracts/hook-architecture-v1.md +213 -0
- package/docs/contracts/load-context-budget-model.md +80 -0
- package/docs/contracts/load-context-schema.md +20 -0
- package/docs/contracts/memory-visibility-v1.md +138 -0
- package/docs/contracts/one-off-script-lifecycle.md +109 -0
- package/docs/contracts/roadmap-complexity-standard.md +137 -0
- package/docs/contracts/rule-interactions.yml +22 -0
- package/docs/customization.md +1 -0
- package/docs/development.md +4 -1
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
- package/docs/guidelines/agent-infra/direct-answers-demos.md +145 -0
- package/docs/guidelines/agent-infra/layered-settings.md +32 -13
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
- package/package.json +1 -1
- package/scripts/agent-config +64 -0
- package/scripts/ai_council/bundler.py +3 -3
- package/scripts/ai_council/clients.py +24 -8
- package/scripts/ai_council/one_off_archive/2026-05/README.md +67 -0
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +206 -0
- package/scripts/ai_council/{_one_off_roundtrip.py → one_off_archive/2026-05/_one_off_roundtrip.py} +13 -8
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +180 -0
- package/scripts/ai_council/session.py +92 -0
- package/scripts/build_rule_trigger_matrix.py +360 -0
- package/scripts/capture_showcase_session.py +361 -0
- package/scripts/chat_history.py +11 -1
- package/scripts/check_always_budget.py +46 -2
- package/scripts/check_one_off_location.py +81 -0
- package/scripts/check_references.py +6 -0
- package/scripts/compress.py +5 -2
- package/scripts/context_hygiene_hook.py +181 -0
- package/scripts/council_cli.py +357 -0
- package/scripts/hook_manifest.yaml +184 -0
- package/scripts/hooks/__init__.py +1 -0
- package/scripts/hooks/augment-context-hygiene.sh +55 -0
- package/scripts/hooks/augment-dispatcher.sh +72 -0
- package/scripts/hooks/augment-onboarding-gate.sh +55 -0
- package/scripts/hooks/cline-dispatcher.sh +86 -0
- package/scripts/hooks/cursor-dispatcher.sh +76 -0
- package/scripts/hooks/dispatch_hook.py +348 -0
- package/scripts/hooks/envelope.py +98 -0
- package/scripts/hooks/gemini-dispatcher.sh +117 -0
- package/scripts/hooks/state_io.py +122 -0
- package/scripts/hooks/windsurf-dispatcher.sh +123 -0
- package/scripts/hooks_status.py +146 -0
- package/scripts/install.py +728 -51
- package/scripts/install.sh +1 -1
- package/scripts/lint_examples.py +98 -0
- package/scripts/lint_hook_manifest.py +216 -0
- package/scripts/lint_one_off_age.py +184 -0
- package/scripts/lint_roadmap_complexity.py +127 -0
- package/scripts/lint_rule_tiers.py +78 -0
- package/scripts/lint_showcase_sessions.py +148 -0
- package/scripts/minimal_safe_diff_hook.py +245 -0
- package/scripts/onboarding_gate_hook.py +142 -0
- package/scripts/readme_linter.py +12 -3
- package/scripts/roadmap_progress_hook.py +5 -0
- package/scripts/schemas/rule.schema.json +5 -0
- package/scripts/sync_agent_settings.py +32 -129
- package/scripts/sync_yaml_rt.py +734 -0
- package/scripts/verify_before_complete_hook.py +216 -0
- /package/scripts/ai_council/{_one_off_2a4_acceptance.py → one_off_archive/2026-05/_one_off_2a4_acceptance.py} +0 -0
- /package/scripts/ai_council/{_one_off_context_layer_v1_estimate.py → one_off_archive/2026-05/_one_off_context_layer_v1_estimate.py} +0 -0
- /package/scripts/ai_council/{_one_off_context_layer_v1_review.py → one_off_archive/2026-05/_one_off_context_layer_v1_review.py} +0 -0
- /package/scripts/ai_council/{_one_off_followups_review.py → one_off_archive/2026-05/_one_off_followups_review.py} +0 -0
- /package/scripts/ai_council/{_one_off_nondestructive_inline_audit.py → one_off_archive/2026-05/_one_off_nondestructive_inline_audit.py} +0 -0
- /package/scripts/{_one_off_phase4_dispatch_latency.py → ai_council/one_off_archive/2026-05/_one_off_phase4_dispatch_latency.py} +0 -0
- /package/scripts/{_one_off_phase6_trigger_jaccard.py → ai_council/one_off_archive/2026-05/_one_off_phase6_trigger_jaccard.py} +0 -0
- /package/scripts/ai_council/{_one_off_phase_2a_budget_rebalance.py → one_off_archive/2026-05/_one_off_phase_2a_budget_rebalance.py} +0 -0
- /package/scripts/ai_council/{_one_off_phase_2a_post_revert.py → one_off_archive/2026-05/_one_off_phase_2a_post_revert.py} +0 -0
- /package/scripts/ai_council/{_one_off_rebalancing_audit.py → one_off_archive/2026-05/_one_off_rebalancing_audit.py} +0 -0
- /package/scripts/ai_council/{_one_off_rule_hardening_v1.py → one_off_archive/2026-05/_one_off_rule_hardening_v1.py} +0 -0
- /package/scripts/ai_council/{_one_off_structural_open_questions.py → one_off_archive/2026-05/_one_off_structural_open_questions.py} +0 -0
- /package/scripts/ai_council/{_one_off_structural_optimization.py → one_off_archive/2026-05/_one_off_structural_optimization.py} +0 -0
- /package/scripts/ai_council/{_one_off_structural_v3_gaps.py → one_off_archive/2026-05/_one_off_structural_v3_gaps.py} +0 -0
- /package/scripts/ai_council/{_one_off_structural_v3_review.py → one_off_archive/2026-05/_one_off_structural_v3_review.py} +0 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"""Producer-side helpers for the memory-visibility line.
|
|
2
|
+
|
|
3
|
+
Implements the v1 line shape from
|
|
4
|
+
``docs/contracts/memory-visibility-v1.md``:
|
|
5
|
+
|
|
6
|
+
🧠 Memory: <hits>/<asks> · ids=[<comma-separated-ids>]
|
|
7
|
+
|
|
8
|
+
The semantics matched to the work-engine model:
|
|
9
|
+
|
|
10
|
+
* The ``memory`` step retrieves across the four allowed memory types
|
|
11
|
+
(``MEMORY_TYPES`` in ``directives.backend.memory``). Each type is
|
|
12
|
+
one ``ask`` from the visibility-line perspective.
|
|
13
|
+
* ``hits`` counts distinct types that returned at least one entry.
|
|
14
|
+
* ``ids`` is the deduped list of returned entry ids preserving the
|
|
15
|
+
retrieval order encoded in ``state.memory``.
|
|
16
|
+
|
|
17
|
+
Privacy floor: this module never emits entry bodies, summaries,
|
|
18
|
+
``path``/``source`` fields, or anything beyond ``id`` and ``type``.
|
|
19
|
+
The privacy regression test (``tests/contracts/test_memory_
|
|
20
|
+
visibility_redaction.py``) keeps this guarantee enforced.
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
from typing import Any, Iterable
|
|
25
|
+
|
|
26
|
+
ICON = "\U0001F9E0" # 🧠
|
|
27
|
+
DEFAULT_MAX_INLINE_IDS = 5
|
|
28
|
+
DEFAULT_ASKED_TYPES = (
|
|
29
|
+
"domain-invariants",
|
|
30
|
+
"architecture-decisions",
|
|
31
|
+
"incident-learnings",
|
|
32
|
+
"historical-patterns",
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def summarise_visibility(
|
|
37
|
+
memory: Any,
|
|
38
|
+
*,
|
|
39
|
+
asked_types: Iterable[str] = DEFAULT_ASKED_TYPES,
|
|
40
|
+
) -> dict[str, Any]:
|
|
41
|
+
"""Reduce ``state.memory`` into the visibility-line slice.
|
|
42
|
+
|
|
43
|
+
``memory`` is the list of hit dicts produced by
|
|
44
|
+
``directives.backend.memory``. Returns ``{"asks", "hits", "ids"}``
|
|
45
|
+
with privacy-safe values only.
|
|
46
|
+
"""
|
|
47
|
+
asked = tuple(asked_types)
|
|
48
|
+
if not memory or not isinstance(memory, list):
|
|
49
|
+
return {"asks": 0, "hits": 0, "ids": []}
|
|
50
|
+
asks = len(asked)
|
|
51
|
+
seen_types: set[str] = set()
|
|
52
|
+
ids: list[str] = []
|
|
53
|
+
seen_ids: set[str] = set()
|
|
54
|
+
for entry in memory:
|
|
55
|
+
if not isinstance(entry, dict):
|
|
56
|
+
continue
|
|
57
|
+
type_value = entry.get("type")
|
|
58
|
+
if isinstance(type_value, str):
|
|
59
|
+
seen_types.add(type_value)
|
|
60
|
+
entry_id = entry.get("id") or entry.get("rule_id")
|
|
61
|
+
if not isinstance(entry_id, (str, int)):
|
|
62
|
+
continue
|
|
63
|
+
sid = str(entry_id)
|
|
64
|
+
if sid in seen_ids:
|
|
65
|
+
continue
|
|
66
|
+
seen_ids.add(sid)
|
|
67
|
+
ids.append(sid)
|
|
68
|
+
hits = len(seen_types) if seen_types else (1 if ids else 0)
|
|
69
|
+
return {"asks": asks, "hits": hits, "ids": ids}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def format_line(
|
|
73
|
+
summary: dict[str, Any],
|
|
74
|
+
*,
|
|
75
|
+
max_inline_ids: int = DEFAULT_MAX_INLINE_IDS,
|
|
76
|
+
) -> str | None:
|
|
77
|
+
"""Render the visibility line; return ``None`` when ``asks == 0``.
|
|
78
|
+
|
|
79
|
+
Cap inline ids at ``max_inline_ids`` and append ``…+N`` when the
|
|
80
|
+
list is longer. Returning ``None`` enforces the contract clause
|
|
81
|
+
"If ``asks == 0``, the engine MUST suppress the line entirely".
|
|
82
|
+
"""
|
|
83
|
+
asks = int(summary.get("asks", 0) or 0)
|
|
84
|
+
if asks <= 0:
|
|
85
|
+
return None
|
|
86
|
+
hits = int(summary.get("hits", 0) or 0)
|
|
87
|
+
raw_ids = summary.get("ids") or []
|
|
88
|
+
ids = [str(i) for i in raw_ids if isinstance(i, (str, int))]
|
|
89
|
+
if max_inline_ids < 0:
|
|
90
|
+
max_inline_ids = 0
|
|
91
|
+
inline = ids[:max_inline_ids]
|
|
92
|
+
overflow = len(ids) - len(inline)
|
|
93
|
+
rendered_ids = ", ".join(inline)
|
|
94
|
+
if overflow > 0:
|
|
95
|
+
suffix = ", " if rendered_ids else ""
|
|
96
|
+
rendered_ids = f"{rendered_ids}{suffix}\u2026+{overflow}"
|
|
97
|
+
return f"{ICON} Memory: {hits}/{asks} \u00b7 ids=[{rendered_ids}]"
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def should_emit(
|
|
101
|
+
summary: dict[str, Any],
|
|
102
|
+
*,
|
|
103
|
+
cost_profile: str = "standard",
|
|
104
|
+
visibility_off: bool = False,
|
|
105
|
+
) -> bool:
|
|
106
|
+
"""Apply the cadence + opt-out gates from the contract."""
|
|
107
|
+
if visibility_off:
|
|
108
|
+
return False
|
|
109
|
+
asks = int(summary.get("asks", 0) or 0)
|
|
110
|
+
if asks <= 0:
|
|
111
|
+
return False
|
|
112
|
+
profile = (cost_profile or "standard").strip().lower()
|
|
113
|
+
if profile == "lean":
|
|
114
|
+
return asks >= 3
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
__all__ = [
|
|
119
|
+
"DEFAULT_ASKED_TYPES",
|
|
120
|
+
"DEFAULT_MAX_INLINE_IDS",
|
|
121
|
+
"ICON",
|
|
122
|
+
"format_line",
|
|
123
|
+
"should_emit",
|
|
124
|
+
"summarise_visibility",
|
|
125
|
+
]
|
package/CHANGELOG.md
CHANGED
|
@@ -318,6 +318,103 @@ 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.19.0](https://github.com/event4u-app/agent-config/compare/1.18.0...1.19.0) (2026-05-05)
|
|
322
|
+
|
|
323
|
+
### Features
|
|
324
|
+
|
|
325
|
+
* **rules:** treat slash command as operator and prose as target ([f73947e](https://github.com/event4u-app/agent-config/commit/f73947e93bc8121524d811a5f17d548499023751))
|
|
326
|
+
* **ai-council:** auto-prune session folders past retention window ([bbfaa93](https://github.com/event4u-app/agent-config/commit/bbfaa93fd28bc3a84030c30ab9cea429ac68bea5))
|
|
327
|
+
* **settings-sync:** additive sync with verbatim user-line preservation ([f996cf3](https://github.com/event4u-app/agent-config/commit/f996cf3811e924d2ffecbc3d11bac447308efc5a))
|
|
328
|
+
* **roadmap:** add quality_cadence setting to throttle /roadmap execute pipeline runs ([d5ef7bf](https://github.com/event4u-app/agent-config/commit/d5ef7bf85e70c95103c6fc65507f99fdd35050dd))
|
|
329
|
+
* **ci:** add lint_showcase_sessions gate ([c4f48bb](https://github.com/event4u-app/agent-config/commit/c4f48bba05d266899282742320b7f83bc636cc7c))
|
|
330
|
+
* **council:** add CLI entry-point with estimate/run/render subcommands (Phase 6.7) ([f20f599](https://github.com/event4u-app/agent-config/commit/f20f5993dda1325f19f8e26a130ef37f995b5a9d))
|
|
331
|
+
* **taskfile:** modularize Taskfile.yml into taskfiles/ groups (Phase 6.1) ([41cbe46](https://github.com/event4u-app/agent-config/commit/41cbe46d6f9289c98bb3f717dcac74c44154fc21))
|
|
332
|
+
* **hooks:** add verify-before-complete and minimal-safe-diff concerns ([2507aef](https://github.com/event4u-app/agent-config/commit/2507aefcc88857fd120cfd09d5c93555cb89b868))
|
|
333
|
+
* **governance:** one-off-script lifecycle + showcase capture + tier-retrofit archive ([0940f91](https://github.com/event4u-app/agent-config/commit/0940f91d74a759de6601f5367e8fd3e2925f4c51))
|
|
334
|
+
* **work_engine:** decision-trace + memory-visibility hooks, scoring, contracts ([91cb0a5](https://github.com/event4u-app/agent-config/commit/91cb0a547971ff5f9597997bc36607ca6049be89))
|
|
335
|
+
* **rules:** tier frontmatter sweep across all 58 rules + lint + budget rebaseline ([a9c3694](https://github.com/event4u-app/agent-config/commit/a9c3694bb22cbd87574c1ffd53d0cb9b76a60479))
|
|
336
|
+
* **hooks:** per-platform bridges, install integration, hooks:status, smoke ([c33058a](https://github.com/event4u-app/agent-config/commit/c33058a49a20c6d4d21a7933b85ea3b618a6d433))
|
|
337
|
+
* **hooks:** universal dispatcher, manifest, envelope, state I/O ([28c4f8c](https://github.com/event4u-app/agent-config/commit/28c4f8c7f0e7bd50b6403dfeab0dcaa623dd5ca3))
|
|
338
|
+
* add collision check to roadmap creation flow ([19b65d5](https://github.com/event4u-app/agent-config/commit/19b65d5f2500ddb7c8bfcbb7466c33de0d64043c))
|
|
339
|
+
|
|
340
|
+
### Bug Fixes
|
|
341
|
+
|
|
342
|
+
* **ai-council:** use max_completion_tokens for OpenAI o1 models ([8d9e179](https://github.com/event4u-app/agent-config/commit/8d9e179a36d3ba2c68de09ba426782fd43792b85))
|
|
343
|
+
* **skills/roadmap-management:** drop task-ci literal to satisfy portability lint ([790af5e](https://github.com/event4u-app/agent-config/commit/790af5e61a3af3472027d2eef1d939106c95d6ea))
|
|
344
|
+
* **install.sh:** avoid SIGPIPE race in clean_stale that deleted live files ([08670d6](https://github.com/event4u-app/agent-config/commit/08670d66c6285a84d15e44d00e5cfecc6870a4e7))
|
|
345
|
+
* **roadmaps:** re-anchor relative paths in archived 3a protocol ([e0017de](https://github.com/event4u-app/agent-config/commit/e0017de1b55b43e2c8ea5b3f9b51f077cb68e0e3))
|
|
346
|
+
|
|
347
|
+
### Performance
|
|
348
|
+
|
|
349
|
+
* **ci:** parallelise test suite — bash xargs -P + pytest-xdist ([2e74b31](https://github.com/event4u-app/agent-config/commit/2e74b3104d0a881832cbebb4dcaddecc865b65c3))
|
|
350
|
+
* **ai-council/bundler:** fix catastrophic regex backtracking in redact() ([0e277e7](https://github.com/event4u-app/agent-config/commit/0e277e7ca36b452cc1cc4d8abdeaaa14e9aebbaf))
|
|
351
|
+
|
|
352
|
+
### Documentation
|
|
353
|
+
|
|
354
|
+
* **roadmaps:** add chat-history hook-only reduction roadmap ([529f3b7](https://github.com/event4u-app/agent-config/commit/529f3b7c06fae8b560ce0bb436fc701b1418a024))
|
|
355
|
+
* **roadmaps:** add road-to-proof-not-features draft ([4664bd4](https://github.com/event4u-app/agent-config/commit/4664bd42a0e0bd8ff9eddc6d8907ff9a217a8f11))
|
|
356
|
+
* tighten wording in three rules and one command ([14ed864](https://github.com/event4u-app/agent-config/commit/14ed8640f18e3bfc52819bb150066ecc453fb17a))
|
|
357
|
+
* **roadmap:** archive road-to-feedback-consolidation (43/43 done) ([f053c6d](https://github.com/event4u-app/agent-config/commit/f053c6df94620a4cbf89e75ba73a7bb369c9395b))
|
|
358
|
+
* **roadmap:** close Phase 1 — showcase infra shipped, sessions deferred ([49a156b](https://github.com/event4u-app/agent-config/commit/49a156b40eecd728841b2eaef3565850f1020e0a))
|
|
359
|
+
* **roadmap:** close Phase 6 — mark 6.1/6.4/6.5/6.7 complete (89%) ([4b645cf](https://github.com/event4u-app/agent-config/commit/4b645cf9fc9acb7b7bc227f790e00c3efae66790))
|
|
360
|
+
* **readme:** 3-path entry table + tier-coverage drift sentinel (Phase 6.4 + 6.5) ([ae712f0](https://github.com/event4u-app/agent-config/commit/ae712f034e5eb67481175835d7a9eded921ee222))
|
|
361
|
+
* **roadmap:** mark Phase 5 complete (Tier-1 hook concerns shipped) ([433c5d1](https://github.com/event4u-app/agent-config/commit/433c5d1efb352de26671caed0e24a6b1e673eab6))
|
|
362
|
+
* **readme:** trim under 500-line linter ceiling ([2c3b496](https://github.com/event4u-app/agent-config/commit/2c3b496552cdd73b02e7b08d5c231a9f86e326c3))
|
|
363
|
+
* **agents:** roadmap progress, ownership matrix, agents index sync ([2368e37](https://github.com/event4u-app/agent-config/commit/2368e37aee886125997bfda4299599ebea9a14ec))
|
|
364
|
+
* add feedback consolidation roadmap and regenerate dashboard ([96fce45](https://github.com/event4u-app/agent-config/commit/96fce45055b2da367b8a45536c7a5bdcd1e03d84))
|
|
365
|
+
|
|
366
|
+
### Refactoring
|
|
367
|
+
|
|
368
|
+
* **hooks:** concerns share atomic-write state I/O + dispatcher-friendly stdin ([5cac705](https://github.com/event4u-app/agent-config/commit/5cac705edfd46ad8d27ffd0008bdf4723317a4eb))
|
|
369
|
+
|
|
370
|
+
### Tests
|
|
371
|
+
|
|
372
|
+
* **hooks:** parity tests for tier-1 hook concerns ([540468c](https://github.com/event4u-app/agent-config/commit/540468cd150447d6b588d3015865660a555e4f8d))
|
|
373
|
+
|
|
374
|
+
### Chores
|
|
375
|
+
|
|
376
|
+
* **tools:** regenerate .windsurfrules with slash-command-routing-policy operator/target sections ([7825600](https://github.com/event4u-app/agent-config/commit/78256000a2da9cc313eb272059bb363acbc5290e))
|
|
377
|
+
* **rules:** sync compressed slash-command-routing-policy with operator/target sections ([916357c](https://github.com/event4u-app/agent-config/commit/916357c7d185d717187845478e8318025330d3a9))
|
|
378
|
+
* **rules:** promote verify-before-complete and minimal-safe-diff to tier 2a ([d62fb84](https://github.com/event4u-app/agent-config/commit/d62fb845a14065706c46c4425b261b57ac155c27))
|
|
379
|
+
* ignore .agent-chat-history.session sidecar ([42741c8](https://github.com/event4u-app/agent-config/commit/42741c87f83bf24416eb3916cbced865ae642688))
|
|
380
|
+
* **infra:** wire lint-rule-tiers + lint-hook-manifest + lint-one-off-age tasks; pyproject pytest importlib; .windsurfrules Copilot fallback ([5b88093](https://github.com/event4u-app/agent-config/commit/5b8809398dd332a3ebad3478f7a38cf48ef119e1))
|
|
381
|
+
* **roadmaps:** archive structural-optimization companion artefacts ([928c884](https://github.com/event4u-app/agent-config/commit/928c88469787cd037c54acd0006039ee9b86f9bb))
|
|
382
|
+
|
|
383
|
+
## [1.18.0](https://github.com/event4u-app/agent-config/compare/1.17.0...1.18.0) (2026-05-04)
|
|
384
|
+
|
|
385
|
+
### Features
|
|
386
|
+
|
|
387
|
+
* **rules:** mandate hardening tier classification on new and edited rules ([42ff7c1](https://github.com/event4u-app/agent-config/commit/42ff7c1765e931a3e5e487ef83d01ca597a65800))
|
|
388
|
+
* **hooks:** wire Tier 1 hooks on Claude Code for hardening parity ([55ede24](https://github.com/event4u-app/agent-config/commit/55ede24e65b5ab7e827fa3a40b04fe9dab091392))
|
|
389
|
+
* **rules:** enforce placement for agent-authored roadmaps ([1624ede](https://github.com/event4u-app/agent-config/commit/1624ede571bcdd28adb7d8dd4868a92b9dbde646))
|
|
390
|
+
* roadmap complexity standard with shape and tier linters ([bd1bac6](https://github.com/event4u-app/agent-config/commit/bd1bac650013e449e7318c60586b7648dbcc144e))
|
|
391
|
+
* **hardening:** tier-1 hooks for onboarding-gate and context-hygiene ([5d107cd](https://github.com/event4u-app/agent-config/commit/5d107cd6fa1352d609491df12604ae0ddb7d7113))
|
|
392
|
+
* **always-budget:** hard-compress direct-answers and no-cheap-questions ([2cb9b0b](https://github.com/event4u-app/agent-config/commit/2cb9b0be7b3e6486c3689fec75e7672507ca97cb))
|
|
393
|
+
* outcome baselines and pattern-memory demos for foundational rules ([f43ede7](https://github.com/event4u-app/agent-config/commit/f43ede70a59cb7460557e6d76b041562056e78ee))
|
|
394
|
+
|
|
395
|
+
### Bug Fixes
|
|
396
|
+
|
|
397
|
+
* **check-refs:** treat .augment/state/*.json as runtime-only paths ([3d4c766](https://github.com/event4u-app/agent-config/commit/3d4c76695af38e764facc8630a97e553f5aac67f))
|
|
398
|
+
* **rules:** sync compressed rules with hardening callouts ([89bd072](https://github.com/event4u-app/agent-config/commit/89bd07267d04d6346a1f36df92759c9208777a9a))
|
|
399
|
+
|
|
400
|
+
### Documentation
|
|
401
|
+
|
|
402
|
+
* **contexts,contracts:** unlink stable artifacts from archived roadmaps ([af4e5c2](https://github.com/event4u-app/agent-config/commit/af4e5c2de6dfb0d2143f48213e04d41c9354deca))
|
|
403
|
+
* **contexts:** lock Tier 2 nudge surface, Tier 3 dispositions, platform parity ([10685a7](https://github.com/event4u-app/agent-config/commit/10685a7f3fceec1b93365cef3531a5e81f55396f))
|
|
404
|
+
* **roadmaps:** relocate budget-v2-matrix to contexts as durable rationale ([33b903a](https://github.com/event4u-app/agent-config/commit/33b903a36feeacffddedde11ff9b1bc3bd5173e3))
|
|
405
|
+
|
|
406
|
+
### Refactoring
|
|
407
|
+
|
|
408
|
+
* **state:** move hook runtime state from .augment/state/ to agents/state/ ([ef5265e](https://github.com/event4u-app/agent-config/commit/ef5265e1ead67b089c4438efcbd4e94f120c6d3e))
|
|
409
|
+
|
|
410
|
+
### Chores
|
|
411
|
+
|
|
412
|
+
* **plugin:** restructure marketplace.json to registry shape ([f3e6f24](https://github.com/event4u-app/agent-config/commit/f3e6f2425fefef2cc5fc338d27e8628ab45a4d41))
|
|
413
|
+
* **council:** archive Budget-v2 audit one-off ([00bf46e](https://github.com/event4u-app/agent-config/commit/00bf46e680e3a66bdbddac35e1ec3a08a8aa11f4))
|
|
414
|
+
* **roadmaps:** archive hardening and context-layer-maturity tracks ([21dec26](https://github.com/event4u-app/agent-config/commit/21dec26b7a6455ab95df6704773426e3dd35574f))
|
|
415
|
+
* regenerate dashboards, hashes, and roadmap progress ([06c50a9](https://github.com/event4u-app/agent-config/commit/06c50a9653bf4250a557ba2fe5a39b8609b3df30))
|
|
416
|
+
* archive ai_council one-off scripts and add location guard ([63e6dbd](https://github.com/event4u-app/agent-config/commit/63e6dbdc49749e97621bcaeaa49f81beb5ffc98c))
|
|
417
|
+
|
|
321
418
|
## [1.17.0](https://github.com/event4u-app/agent-config/compare/1.16.0...1.17.0) (2026-05-04)
|
|
322
419
|
|
|
323
420
|
### Features
|
package/README.md
CHANGED
|
@@ -7,20 +7,22 @@ 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>129 Skills</strong> · <strong>58 Rules</strong> · <strong>95 Commands</strong> · <strong>
|
|
10
|
+
<strong>129 Skills</strong> · <strong>58 Rules</strong> · <strong>95 Commands</strong> · <strong>51 Guidelines</strong> · <strong>8 AI Tools</strong>
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
15
|
## Start here
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Three ways in, depending on what you're doing today:
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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 |
|
|
22
24
|
|
|
23
|
-
|
|
25
|
+
If none of those apply yet — start with the [Quickstart](#quickstart) and pick a path once it's installed.
|
|
24
26
|
|
|
25
27
|
## Quickstart
|
|
26
28
|
|
|
@@ -63,6 +65,14 @@ project-locally for all supported AI tools. Task is required for
|
|
|
63
65
|
*contributors* who want to rebuild the compressed content locally — see
|
|
64
66
|
[CONTRIBUTING.md](CONTRIBUTING.md).
|
|
65
67
|
|
|
68
|
+
**Verify hook coverage** after installing — every supported platform
|
|
69
|
+
(Augment, Claude, Cursor, Cline, Windsurf, Gemini CLI, Copilot fallback)
|
|
70
|
+
is wired through one universal dispatcher per
|
|
71
|
+
[`hook-architecture-v1`](docs/contracts/hook-architecture-v1.md). Run
|
|
72
|
+
`./agent-config hooks:status` for the matrix (`--strict` for CI,
|
|
73
|
+
`--format json` for tooling). The installer also dry-fires the
|
|
74
|
+
dispatcher per bridge as a post-install smoke test (skip: `--no-smoke`).
|
|
75
|
+
|
|
66
76
|
### For individual use (optional)
|
|
67
77
|
|
|
68
78
|
Install directly in your agent for global, cross-project use:
|
|
@@ -479,20 +489,10 @@ task lint-skills # Lint skills, rules, commands
|
|
|
479
489
|
|
|
480
490
|
## Requirements
|
|
481
491
|
|
|
482
|
-
**
|
|
483
|
-
|
|
484
|
-
- **
|
|
485
|
-
|
|
486
|
-
Available on macOS, Linux, and WSL.
|
|
487
|
-
- **Python 3.10+** — required for the bridge stage only. Pre-installed
|
|
488
|
-
on macOS 12.3+ and all major Linux distros. If missing, the
|
|
489
|
-
orchestrator skips bridges and completes the payload sync.
|
|
490
|
-
- **Composer or npm** — to pull the package itself.
|
|
491
|
-
|
|
492
|
-
**Platform support:** macOS 12.3+, Linux (modern distros), and Windows
|
|
493
|
-
(WSL2) are fully supported. Git Bash works but symlinks require
|
|
494
|
-
Developer Mode; native PowerShell / cmd is not supported. Contributors
|
|
495
|
-
rebuilding `.augment/` locally also need [Task](https://taskfile.dev/).
|
|
492
|
+
- **Bash** — `scripts/install` orchestrates payload sync (`install.sh`) and bridges (`install.py`).
|
|
493
|
+
- **Python 3.10+** — bridge stage only; missing → orchestrator skips bridges.
|
|
494
|
+
- **Composer or npm** — to pull the package.
|
|
495
|
+
- **Platform:** macOS 12.3+, Linux, WSL2. Git Bash needs Developer Mode for symlinks; native PowerShell / cmd unsupported. Contributors rebuilding `.augment/` also need [Task](https://taskfile.dev/).
|
|
496
496
|
|
|
497
497
|
## License
|
|
498
498
|
|
|
@@ -121,6 +121,24 @@ pipelines:
|
|
|
121
121
|
# want a silent agent; `custom` profile ignores this default entirely.
|
|
122
122
|
skill_improvement: true
|
|
123
123
|
|
|
124
|
+
# --- Roadmap execution ---
|
|
125
|
+
#
|
|
126
|
+
# Controls when /roadmap execute runs the project's quality pipeline
|
|
127
|
+
# (the `task ci` / `make test` / `npm run check` style command).
|
|
128
|
+
# Steps are ALWAYS marked `[x]` and the dashboard is ALWAYS regenerated
|
|
129
|
+
# in the same response — that cadence is governed by `roadmap-progress-sync`
|
|
130
|
+
# and is non-negotiable. This setting only governs *quality tool runs*.
|
|
131
|
+
roadmap:
|
|
132
|
+
# When to run quality tools during /roadmap execute.
|
|
133
|
+
# end_of_roadmap = once, before archiving the completed roadmap (default — fastest, fewest tokens)
|
|
134
|
+
# per_phase = once after every completed phase
|
|
135
|
+
# per_step = after every completed step (legacy verbose; highest token cost)
|
|
136
|
+
# Trade-off: end_of_roadmap saves tokens and time but lets errors compound
|
|
137
|
+
# across phases. Pick per_phase if the work is risky or unfamiliar.
|
|
138
|
+
# Iron Law `verify-before-complete` still applies — fresh quality output
|
|
139
|
+
# is mandatory before any "roadmap complete" claim regardless of cadence.
|
|
140
|
+
quality_cadence: end_of_roadmap
|
|
141
|
+
|
|
124
142
|
# --- Subagent orchestration ---
|
|
125
143
|
#
|
|
126
144
|
# Controls model selection and parallelism for subagent-based workflows
|
|
@@ -195,6 +213,11 @@ ai_council:
|
|
|
195
213
|
max_calls: 10
|
|
196
214
|
max_total_usd: 0.50
|
|
197
215
|
|
|
216
|
+
# Retention for `agents/council-sessions/` audit folders. Sessions
|
|
217
|
+
# older than this are pruned automatically on the next `save()`.
|
|
218
|
+
# `0` disables pruning (keep forever — disk grows unbounded).
|
|
219
|
+
session_retention_days: 14
|
|
220
|
+
|
|
198
221
|
# --- Onboarding ---
|
|
199
222
|
#
|
|
200
223
|
# Tracks whether the initial setup flow (/onboard) has been completed
|
package/docs/architecture.md
CHANGED
|
@@ -65,7 +65,7 @@ fails on any source-side violation, without producing artifacts.
|
|
|
65
65
|
| **Skills** | 129 | On-demand expertise — stack analysis (Laravel · Symfony · Zend / Laminas · Next.js · React · Node), testing, Docker, API design, security, observability, … |
|
|
66
66
|
| **Rules** | 58 | Always-active constraints — coding standards, scope control, verification, language-and-tone, agent-authority |
|
|
67
67
|
| **Commands** | 95 | Slash-command workflows — `/commit`, `/create-pr`, `/fix ci`, `/optimize skills`, `/feature plan`, `/work`, `/implement-ticket`, `/compress`, … |
|
|
68
|
-
| **Guidelines** |
|
|
68
|
+
| **Guidelines** | 51 | Reference material cited by skills — PHP patterns, Eloquent, Playwright, agent-infra, … |
|
|
69
69
|
| **Templates** | 7 | Scaffolds for features, roadmaps, contexts, skills, overrides |
|
|
70
70
|
| **Contexts** | 5 | Shared knowledge about the system itself |
|
|
71
71
|
|
package/docs/catalog.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# agent-config — Public Catalog
|
|
2
2
|
|
|
3
|
-
Consumer-facing catalog of all **
|
|
3
|
+
Consumer-facing catalog of all **330 public artefacts** shipped by
|
|
4
4
|
this package. Internal package-maintenance rules and deprecation shims
|
|
5
5
|
are excluded.
|
|
6
6
|
|
|
@@ -301,14 +301,16 @@ are excluded.
|
|
|
301
301
|
| command | [`upstream-contribute`](../.agent-src/commands/upstream-contribute.md) | | Contribute a learning, skill, rule, or fix from a consumer project back to the shared agent-config package |
|
|
302
302
|
| command | [`work`](../.agent-src/commands/work.md) | | Drive a free-form prompt end-to-end through refine → score → plan → implement → test → verify → report — Option-A loop over the `work_engine` Python engine, confidence-band gated, no auto-git. |
|
|
303
303
|
|
|
304
|
-
## Guidelines (
|
|
304
|
+
## Guidelines (51)
|
|
305
305
|
|
|
306
306
|
| kind | name | category | description |
|
|
307
307
|
|---|---|---|---|
|
|
308
308
|
| guideline | [`agent-interaction-and-decision-quality`](../docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md) | agent-infra | |
|
|
309
|
+
| guideline | [`ask-when-uncertain-demos`](../docs/guidelines/agent-infra/ask-when-uncertain-demos.md) | agent-infra | |
|
|
309
310
|
| guideline | [`asking-and-brevity-examples`](../docs/guidelines/agent-infra/asking-and-brevity-examples.md) | agent-infra | |
|
|
310
311
|
| guideline | [`break-glass-usage`](../docs/guidelines/agent-infra/break-glass-usage.md) | agent-infra | |
|
|
311
312
|
| guideline | [`developer-judgment`](../docs/guidelines/agent-infra/developer-judgment.md) | agent-infra | |
|
|
313
|
+
| guideline | [`direct-answers-demos`](../docs/guidelines/agent-infra/direct-answers-demos.md) | agent-infra | |
|
|
312
314
|
| guideline | [`engineering-memory-data-format`](../docs/guidelines/agent-infra/engineering-memory-data-format.md) | agent-infra | |
|
|
313
315
|
| guideline | [`language-and-tone-examples`](../docs/guidelines/agent-infra/language-and-tone-examples.md) | agent-infra | |
|
|
314
316
|
| guideline | [`layered-settings`](../docs/guidelines/agent-infra/layered-settings.md) | agent-infra | |
|
|
@@ -322,6 +324,7 @@ are excluded.
|
|
|
322
324
|
| guideline | [`self-improvement-pipeline`](../docs/guidelines/agent-infra/self-improvement-pipeline.md) | agent-infra | |
|
|
323
325
|
| guideline | [`size-and-scope`](../docs/guidelines/agent-infra/size-and-scope.md) | agent-infra | |
|
|
324
326
|
| guideline | [`tool-integration`](../docs/guidelines/agent-infra/tool-integration.md) | agent-infra | |
|
|
327
|
+
| guideline | [`verify-before-complete-demos`](../docs/guidelines/agent-infra/verify-before-complete-demos.md) | agent-infra | |
|
|
325
328
|
| guideline | [`readme-size-and-splitting`](../docs/guidelines/docs/readme-size-and-splitting.md) | docs | |
|
|
326
329
|
| guideline | [`playwright`](../docs/guidelines/e2e/playwright.md) | e2e | |
|
|
327
330
|
| guideline | [`api-design`](../docs/guidelines/php/api-design.md) | php | |
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
stability: beta
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# ADR — Settings sync engine: stdlib-only round-trip
|
|
6
|
+
|
|
7
|
+
> **Status:** Decided · 2026-05-04
|
|
8
|
+
> **Context:** Additive Settings Sync roadmap — review round 2
|
|
9
|
+
> (Self-Review + AI Council, Anthropic + OpenAI) flagged the
|
|
10
|
+
> 735-line `scripts/sync_yaml_rt.py` as potential NIH burden vs.
|
|
11
|
+
> adopting `ruamel.yaml` as a third-party dependency.
|
|
12
|
+
> **Builds on:** [`docs/guidelines/agent-infra/layered-settings.md`](../guidelines/agent-infra/layered-settings.md)
|
|
13
|
+
> § Sync rules — defines the additive-merge-with-user-line-preservation
|
|
14
|
+
> contract this engine implements.
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
`.agent-settings.yml` synchronization uses a **custom, stdlib-only
|
|
19
|
+
round-trip parser + emitter** in [`scripts/sync_yaml_rt.py`](../../scripts/sync_yaml_rt.py),
|
|
20
|
+
not `ruamel.yaml` or any other third-party YAML library.
|
|
21
|
+
|
|
22
|
+
The engine implements a narrow YAML subset (block-mappings, scalars,
|
|
23
|
+
flow-list values, comments, CRLF/LF) that covers the full surface of
|
|
24
|
+
`.agent-settings.yml` plus its template (`config/agent-settings.template.yml`).
|
|
25
|
+
Out-of-subset YAML — anchors, aliases, multi-document streams, complex
|
|
26
|
+
keys, nested flow mappings — is **not supported** and raises `ValueError`.
|
|
27
|
+
|
|
28
|
+
The merge layer (additive walk, max-index insertion, scalar→section
|
|
29
|
+
guard, healer for legacy `_user._user.foo` corruption, EOL
|
|
30
|
+
normalization) sits on top of the parser and is custom regardless of
|
|
31
|
+
the parser choice.
|
|
32
|
+
|
|
33
|
+
## Why this was a real question
|
|
34
|
+
|
|
35
|
+
Three options were on the table:
|
|
36
|
+
|
|
37
|
+
1. **`ruamel.yaml` for parse + emit, custom merge on top.** Rejected.
|
|
38
|
+
2. **`PyYAML` for parse, custom emitter for round-trip.** Rejected
|
|
39
|
+
earlier in the roadmap — PyYAML's parser drops comments and
|
|
40
|
+
formatting before the merger ever sees them.
|
|
41
|
+
3. **Custom stdlib-only parser + emitter + merger.** Chosen.
|
|
42
|
+
|
|
43
|
+
### Why ruamel.yaml does not match the contract
|
|
44
|
+
|
|
45
|
+
The driving requirement from `layered-settings.md` is **verbatim
|
|
46
|
+
user-line preservation** — every byte of every line in the user's
|
|
47
|
+
file is preserved unless that line carries a key the merger is
|
|
48
|
+
explicitly editing. Tests pin this contract by asserting byte-identity
|
|
49
|
+
across two consecutive sync runs (`test_user_block_round_trip_is_idempotent`,
|
|
50
|
+
`test_three_level_idempotent`).
|
|
51
|
+
|
|
52
|
+
`ruamel.yaml` is a round-trip-aware library, not a verbatim one — it
|
|
53
|
+
re-parses into an in-memory model and **re-emits** through its own
|
|
54
|
+
emitter. This re-emit normalizes:
|
|
55
|
+
|
|
56
|
+
| Behavior | ruamel.yaml | Custom engine |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| User-line bytes (whitespace, quoting, blanks) | re-emitted, may shift | preserved 1:1 |
|
|
59
|
+
| Mixed CRLF/LF in user file | normalized to one EOL (typically platform default) | detected + normalized to the user's predominant EOL |
|
|
60
|
+
| `personal: null` blocking template-section injection | requires custom merge logic regardless | scalar guard in `_merge_into` |
|
|
61
|
+
| Legacy `_user._user.foo.bar` healer (one-off migration) | requires custom logic regardless | `heal_user_block` |
|
|
62
|
+
| Synthetic header rendering for newly-inserted template keys | re-emits the entire file | only renders the new subtree |
|
|
63
|
+
| Unknown user blocks at top level | preserved as data, but indent / quoting may shift on emit | preserved verbatim |
|
|
64
|
+
| 3rd-party dependency in distribution package | +1 (`ruamel.yaml` + transitive `ruamel.yaml.clib`) | 0 |
|
|
65
|
+
|
|
66
|
+
The rows where the libraries diverge are exactly the rows the test
|
|
67
|
+
suite asserts on.
|
|
68
|
+
|
|
69
|
+
### Cost analysis
|
|
70
|
+
|
|
71
|
+
| Axis | Custom engine | ruamel.yaml |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| Lines of code | 735 (engine) + 335 (merge/heal) = 1070 | ~400 (parser+emitter saved) + 335 (merge/heal stays) + adapter glue = ~735 |
|
|
74
|
+
| Net code saved | — | ~335 lines |
|
|
75
|
+
| 3rd-party deps | 0 | +2 (`ruamel.yaml`, `ruamel.yaml.clib`) |
|
|
76
|
+
| Runtime YAML surface | narrow (documented subset) | full YAML 1.2 |
|
|
77
|
+
| Verbatim guarantee | yes | no |
|
|
78
|
+
| Performance | irrelevant — cold-path, runs on profile change | irrelevant |
|
|
79
|
+
|
|
80
|
+
The 335-line saving is real but offset by a stronger contract (verbatim)
|
|
81
|
+
and a 0-dep posture. The package is a distribution-layer library
|
|
82
|
+
(`composer.json` `type: library`, `package.json` thin manifest); it
|
|
83
|
+
already restricts itself to stdlib for portability across consumer
|
|
84
|
+
projects, several of which lock Python deps tightly.
|
|
85
|
+
|
|
86
|
+
## Consequences
|
|
87
|
+
|
|
88
|
+
- **Maintenance:** the engine must keep covering the YAML subset its
|
|
89
|
+
template + user files exercise. Any new template feature (e.g. a
|
|
90
|
+
block-style nested list) is a parser change, not a config change.
|
|
91
|
+
- **Error surface:** YAML outside the subset (anchors, complex keys)
|
|
92
|
+
surfaces as a friendly `ValueError` from `_rt.sync()`, caught by
|
|
93
|
+
`sync_agent_settings.main` and turned into exit code 2 with a
|
|
94
|
+
user-readable message. Documented in
|
|
95
|
+
`tests/test_sync_agent_settings.py::test_malformed_user_yaml_exits_2_with_message`.
|
|
96
|
+
- **Test debt:** `tests/test_sync_round_trip.py` (34 tests) and
|
|
97
|
+
`tests/test_sync_agent_settings.py` (15 tests) are the contract.
|
|
98
|
+
Any parser change must keep those green and is the entry point
|
|
99
|
+
for new fixtures under `tests/fixtures/sync_yaml_rt/`.
|
|
100
|
+
|
|
101
|
+
## Revisit triggers
|
|
102
|
+
|
|
103
|
+
This decision is revisited (new ADR with successor link) when **any**
|
|
104
|
+
of the following holds:
|
|
105
|
+
|
|
106
|
+
1. `.agent-settings.yml` schema gains a YAML feature outside the
|
|
107
|
+
supported subset (anchors, multi-doc, complex keys, nested flow
|
|
108
|
+
mappings) — the cost of extending the parser exceeds the cost of
|
|
109
|
+
adopting ruamel.
|
|
110
|
+
2. The verbatim-preservation contract is relaxed (e.g. consumers
|
|
111
|
+
accept that sync can re-format) — the driver for the custom engine
|
|
112
|
+
is gone.
|
|
113
|
+
3. The 0-dep posture for Python tooling is dropped at the package level
|
|
114
|
+
— the marginal cost of one more dep collapses.
|
|
115
|
+
4. A maintenance bug surfaces in the engine that would have been
|
|
116
|
+
prevented by ruamel's mature spec coverage.
|
|
117
|
+
|
|
118
|
+
## See also
|
|
119
|
+
|
|
120
|
+
- [`docs/guidelines/agent-infra/layered-settings.md`](../guidelines/agent-infra/layered-settings.md)
|
|
121
|
+
§ Sync rules — the contract this engine implements.
|
|
122
|
+
- [`scripts/sync_yaml_rt.py`](../../scripts/sync_yaml_rt.py) module
|
|
123
|
+
docstring — the supported YAML subset, listed exhaustively.
|
|
124
|
+
- `tests/test_sync_round_trip.py` — verbatim, scalar-guard, healer,
|
|
125
|
+
CRLF, and synthetic-header pinning.
|
|
126
|
+
- `tests/test_sync_agent_settings.py` — CLI integration, profile
|
|
127
|
+
override, malformed-input exit code.
|