@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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
stability: beta
|
|
3
|
+
keep-beta-until: 2026-08-12
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
# Memory-visibility v1
|
|
@@ -24,6 +25,7 @@ and a single space:
|
|
|
24
25
|
|
|
25
26
|
```
|
|
26
27
|
🧠 Memory: <hits>/<asks> · ids=[<comma-separated-ids>]
|
|
28
|
+
🧠 Memory: <hits>/<asks> · ids=[<comma-separated-ids>] · affected: <keys>
|
|
27
29
|
```
|
|
28
30
|
|
|
29
31
|
Examples:
|
|
@@ -32,6 +34,8 @@ Examples:
|
|
|
32
34
|
🧠 Memory: 3/4 · ids=[mem_42, mem_57, mem_91]
|
|
33
35
|
🧠 Memory: 0/2 · ids=[]
|
|
34
36
|
🧠 Memory: 5/5 · ids=[mem_a01, mem_a02, mem_a03, …+2]
|
|
37
|
+
🧠 Memory: 3/4 · ids=[mem_42, mem_57] · affected: confidence_band,applied_rules
|
|
38
|
+
🧠 Memory: 2/4 · ids=[mem_42] · affected: none
|
|
35
39
|
```
|
|
36
40
|
|
|
37
41
|
Cap at 5 ids inline; remainder rendered as `…+N`. The full id list
|
|
@@ -45,10 +49,15 @@ lives in the decision-trace JSON
|
|
|
45
49
|
| `hits` | Count of `memory_retrieve_*` calls during this turn that returned ≥ 1 entry. |
|
|
46
50
|
| `asks` | Count of `memory_retrieve_*` calls during this turn — both successful and empty. |
|
|
47
51
|
| `ids` | Stable memory entry ids returned across all calls, deduped, ordered by retrieval timestamp. |
|
|
52
|
+
| `affected` | Optional trailing segment. Comma-separated list of decision-trace keys that diverged when this memory was consulted vs not consulted. Closed key list defined in [`decision-trace-v1.md § Memory consequence keys`](decision-trace-v1.md#memory-consequence-keys). Rendered as `none` when `hits ≥ 1` but no key diverged. Omitted entirely when `hits == 0` or when the producer cannot compute a counterfactual trace. |
|
|
48
53
|
|
|
49
54
|
`hits ≤ asks` is invariant. If `asks == 0`, the engine MUST suppress
|
|
50
55
|
the line entirely — no `0/0` noise.
|
|
51
56
|
|
|
57
|
+
The `affected` segment is a forward-compat trailing extension per
|
|
58
|
+
the Stability clause below — clients pinned to the segment-free
|
|
59
|
+
shape MUST still parse the line.
|
|
60
|
+
|
|
52
61
|
## Privacy floor
|
|
53
62
|
|
|
54
63
|
The visibility line and the JSON it derives from MUST NOT contain:
|
|
@@ -88,6 +97,31 @@ counts and ids for downstream metrics.
|
|
|
88
97
|
Cost-profile lookup respects `.agent-settings.yml`'s `cost_profile`
|
|
89
98
|
key. Default is `standard`.
|
|
90
99
|
|
|
100
|
+
## End-of-run "Memory changed decisions" block
|
|
101
|
+
|
|
102
|
+
When the visibility line carries a non-empty `affected` segment, the
|
|
103
|
+
engine MUST also append a structured block at the end of the run's
|
|
104
|
+
report surface so reviewers can audit attribution without parsing
|
|
105
|
+
the inline segment:
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
Memory changed decisions:
|
|
109
|
+
- mem_42 → confidence_band
|
|
110
|
+
- mem_57 → confidence_band
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Rules:
|
|
114
|
+
|
|
115
|
+
- Suppressed entirely when `affected` is empty or absent (no key
|
|
116
|
+
diverged, or memory was not consulted).
|
|
117
|
+
- Each consulted id from the visibility line's `ids` is paired with
|
|
118
|
+
each affected key. v1 attribution is aggregate; per-id attribution
|
|
119
|
+
is a follow-up risk tracked in the roadmap Risk register.
|
|
120
|
+
- Block heading is the literal string `Memory changed decisions:`
|
|
121
|
+
followed by `-` bullet lines in `<id> → <key>` shape.
|
|
122
|
+
- Implementation: `format_changed_decisions_block` in
|
|
123
|
+
`work_engine/scoring/memory_visibility.py`.
|
|
124
|
+
|
|
91
125
|
## Audit-as-memory feed
|
|
92
126
|
|
|
93
127
|
The visibility output produced by the engine is the input to the
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
stability: beta
|
|
3
|
+
keep-beta-until: 2026-08-12
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# ADR — Release-trunk sync: main fast-forwards on every tag
|
|
7
|
+
|
|
8
|
+
> **Status:** Decided · 2026-05-14
|
|
9
|
+
> **Context:** PR #43 feedback (Level-5/6 product rating) and PR #143
|
|
10
|
+
> revealed `main` lagging the latest tag by N skills + rules at multiple
|
|
11
|
+
> points across the 2.x cycle. External readers landing on `main`
|
|
12
|
+
> consistently saw stale README counts and missing skill catalogues
|
|
13
|
+
> relative to the npm/Packagist artefact.
|
|
14
|
+
> **Closes:** [Road to Productization](../../agents/roadmaps/road-to-productization.md) § P1.2.
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
Every tagged release (`X.Y.Z`) **fast-forwards `main` to the tag's
|
|
19
|
+
commit as the final step of the release pipeline**. No exceptions. No
|
|
20
|
+
grace period.
|
|
21
|
+
|
|
22
|
+
The fast-forward is owned by [`scripts/release.py`](../../scripts/release.py)
|
|
23
|
+
and runs after the GitHub Release is published. The release pipeline
|
|
24
|
+
is **not green** until `main == <new-tag>` at the remote.
|
|
25
|
+
|
|
26
|
+
`main` is therefore a **moving stable trunk pointer**, not a feature
|
|
27
|
+
branch. External readers (README, AGENTS.md, marketplace metadata, npm
|
|
28
|
+
tarball provenance) reading `main` see the artefact that was last
|
|
29
|
+
published, not work-in-progress.
|
|
30
|
+
|
|
31
|
+
## Protocol
|
|
32
|
+
|
|
33
|
+
1. `scripts/release.py` cuts `release/X.Y.Z`, bumps version files,
|
|
34
|
+
opens a release PR against `main`, waits for CI, merges.
|
|
35
|
+
2. The merge commit on `main` becomes the tag's commit; the tag is
|
|
36
|
+
pushed.
|
|
37
|
+
3. `publish-npm.yml` and the marketplace flow trigger on the tag.
|
|
38
|
+
4. The release pipeline asserts `git rev-parse origin/main ==
|
|
39
|
+
git rev-parse refs/tags/X.Y.Z` before exit-0.
|
|
40
|
+
5. If a hotfix lands on `release/X.Y.Z` after step 1 but before step 4,
|
|
41
|
+
the FF still happens — release-branch commits are part of the
|
|
42
|
+
release, not a separate trunk.
|
|
43
|
+
|
|
44
|
+
### Why fast-forward, not merge
|
|
45
|
+
|
|
46
|
+
Fast-forward keeps `main` linear with the tag history. A merge-commit
|
|
47
|
+
on top of the tag would put `main` at a SHA that is **not** the tag's
|
|
48
|
+
SHA, re-introducing the exact divergence this contract closes.
|
|
49
|
+
|
|
50
|
+
If a fast-forward is impossible (force-push to `main`, divergent
|
|
51
|
+
history, abandoned release-prep), the pipeline **fails loudly**; the
|
|
52
|
+
operator either resets `main` manually with an audit trail or aborts
|
|
53
|
+
the release.
|
|
54
|
+
|
|
55
|
+
## CI Gate (P1.3)
|
|
56
|
+
|
|
57
|
+
[`scripts/check_release_trunk_sync.py`](../../scripts/check_release_trunk_sync.py)
|
|
58
|
+
runs on every `release/X.Y.Z` branch (detected by `git rev-parse
|
|
59
|
+
--abbrev-ref HEAD` matching `^release/\d+\.\d+\.\d+$`).
|
|
60
|
+
|
|
61
|
+
It enforces: **`main` is at most ONE tagged release behind the
|
|
62
|
+
release-prep branch's target version.**
|
|
63
|
+
|
|
64
|
+
- On `release/2.11.0`: `main` may be at `2.10.0` or `2.11.0`. `2.9.0`
|
|
65
|
+
or older → **hard fail**.
|
|
66
|
+
- On any other branch class (feature, fix, chore, docs, the agent's
|
|
67
|
+
own `feat/road-to-productization` branch): the check is a **no-op**
|
|
68
|
+
exit-0 — feature branches never trip the gate.
|
|
69
|
+
- Wired into `task ci` as `check-release-trunk-sync`. No warning-only
|
|
70
|
+
mode; the exit code is the gate.
|
|
71
|
+
|
|
72
|
+
### Bootstrap mode
|
|
73
|
+
|
|
74
|
+
When the repo state does not yet match the gate (transitional first
|
|
75
|
+
run after this contract lands), the check reads
|
|
76
|
+
`docs/contracts/release-trunk-sync.bootstrap` for an opt-out window
|
|
77
|
+
keyed by current version. The bootstrap file is purged at the next
|
|
78
|
+
release. Absence of the file = gate is live.
|
|
79
|
+
|
|
80
|
+
## Rollback
|
|
81
|
+
|
|
82
|
+
Revertible by removing `check-release-trunk-sync` from `Taskfile.yml`
|
|
83
|
+
and deleting `scripts/check_release_trunk_sync.py`. No state, no
|
|
84
|
+
schema, no migration. Branch-detection key (`release/X.Y.Z`) is
|
|
85
|
+
already used by `scripts/release.py` so removing this contract does
|
|
86
|
+
not orphan the convention.
|
|
87
|
+
|
|
88
|
+
## Risks
|
|
89
|
+
|
|
90
|
+
| # | Risk | Mitigation |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| 1 | Gate fires on feature branches mid-PR | Branch-name regex; non-`release/` branches no-op exit-0 |
|
|
93
|
+
| 2 | Hotfix release leaves `main` behind | FF runs **after** hotfix commits land on the release branch |
|
|
94
|
+
| 3 | Manual tag (no `scripts/release.py`) skips the FF | Out of scope of this contract — covered by `release-guard.yml` which fails on tag/version mismatch; manual tags already break the pipeline |
|
|
95
|
+
| 4 | Detached HEAD or shallow checkout breaks detection | Check gracefully exits-0 with a `::warning::` line when `git rev-parse --abbrev-ref HEAD == HEAD` (detached) |
|
|
96
|
+
|
|
97
|
+
## See also
|
|
98
|
+
|
|
99
|
+
- [`scripts/release.py`](../../scripts/release.py) — release pipeline owner.
|
|
100
|
+
- [`.github/workflows/release-guard.yml`](../../.github/workflows/release-guard.yml)
|
|
101
|
+
— tag/version-file integrity gate (orthogonal: this contract handles
|
|
102
|
+
trunk position, release-guard handles version-string integrity).
|
|
103
|
+
- [`agents/roadmaps/road-to-productization.md`](../../agents/roadmaps/road-to-productization.md)
|
|
104
|
+
§ Phase 1.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
stability: beta
|
|
3
|
+
keep-beta-until: 2026-08-12
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
# Rule-Interaction Matrix
|
|
@@ -99,6 +100,31 @@ junior (yields). For `complements`, ordering is documentary only.
|
|
|
99
100
|
in the rule files.
|
|
100
101
|
- Skill ↔ rule interactions — the matrix is rule-only. Skills are
|
|
101
102
|
invoked, not always-active.
|
|
103
|
+
- **Orchestration-layer surfaces** (AI Council, Memory, Work-Engine /
|
|
104
|
+
Decision-Engine): these are runtime systems, not `always`-rules.
|
|
105
|
+
Their interactions are governed by their own contracts and stay
|
|
106
|
+
out of this matrix by design — see "Out of scope" below.
|
|
107
|
+
|
|
108
|
+
## Out of scope — orchestration surfaces (Council × Memory × Work-Engine)
|
|
109
|
+
|
|
110
|
+
The matrix is **rule-only**. The orchestration layer is governed by
|
|
111
|
+
dedicated contracts; cross-referencing them here would duplicate the
|
|
112
|
+
source of truth and weaken it. Canonical contracts:
|
|
113
|
+
|
|
114
|
+
| Surface | Canonical contract |
|
|
115
|
+
|---|---|
|
|
116
|
+
| Decision-Engine gates (`min_confidence`, `block_on_risk`, `require_memory_hits`, `on_block`) | [`decision-engine-gates.md`](decision-engine-gates.md) |
|
|
117
|
+
| Decision-trace shape (what the engine emits per phase) | [`decision-trace-v1.md`](decision-trace-v1.md) |
|
|
118
|
+
| Memory contract (entries, scopes, retention) | [`agent-memory-contract.md`](agent-memory-contract.md) |
|
|
119
|
+
| Memory visibility in the trace (`affected` keys) | [`memory-visibility-v1.md`](memory-visibility-v1.md) |
|
|
120
|
+
| AI-Council consultation flow | [`../skills/ai-council/SKILL.md`](../../.agent-src.uncompressed/skills/ai-council/SKILL.md) |
|
|
121
|
+
|
|
122
|
+
Where an `always`-rule **does** interact with one of these surfaces
|
|
123
|
+
(e.g. `non-destructive-by-default` gating a memory-driven action), the
|
|
124
|
+
gate lives in the rule and the precedence is captured in this matrix
|
|
125
|
+
as a rule-pair (the orchestration surface is the *occasion*, not a
|
|
126
|
+
participant). For Council ↔ Memory ↔ Work-Engine interactions among
|
|
127
|
+
themselves, the dedicated contracts above are authoritative.
|
|
102
128
|
|
|
103
129
|
## See also
|
|
104
130
|
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
stability: beta
|
|
3
|
+
keep-beta-until: 2026-08-12
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Settings-sync YAML subset
|
|
7
|
+
|
|
8
|
+
**Purpose.** Pin the YAML feature set that `.agent-settings.yml` and
|
|
9
|
+
`config/agent-settings.template.yml` may use, so contributors can cite a
|
|
10
|
+
contract instead of inferring it from
|
|
11
|
+
[`scripts/sync_yaml_rt.py`](../../scripts/sync_yaml_rt.py) source. The
|
|
12
|
+
sync engine ([ADR](adr-settings-sync-engine.md)) is a custom stdlib-only
|
|
13
|
+
round-trip parser/emitter; staying inside the subset below is what
|
|
14
|
+
keeps user-line preservation (every byte of every user line round-trips
|
|
15
|
+
unchanged unless the merger explicitly edits the key).
|
|
16
|
+
|
|
17
|
+
Authoritative source: this document. The module docstring of
|
|
18
|
+
`sync_yaml_rt.py` mirrors it; on drift, this file wins and the docstring
|
|
19
|
+
is corrected to match.
|
|
20
|
+
|
|
21
|
+
## Supported
|
|
22
|
+
|
|
23
|
+
### Document shape
|
|
24
|
+
|
|
25
|
+
- One YAML document per file. No `---` or `...` document separators.
|
|
26
|
+
- UTF-8. CRLF and LF line endings — both accepted, preserved per-line.
|
|
27
|
+
|
|
28
|
+
### Mappings (sections)
|
|
29
|
+
|
|
30
|
+
- Block-style mappings only (`key: value` on its own line).
|
|
31
|
+
- Indent: 2- or 4-space, **no tabs** in indent.
|
|
32
|
+
- Nested mappings unlimited in depth (the template uses 3 levels —
|
|
33
|
+
e.g. `chat_history.archive.cleanup_after_days`).
|
|
34
|
+
- Duplicate keys at the same level: **last wins** (the later line
|
|
35
|
+
carries the value; the earlier entry is replaced).
|
|
36
|
+
|
|
37
|
+
### Scalars (values)
|
|
38
|
+
|
|
39
|
+
- Bare scalars: `enabled`, `42`, `true`, `~`, `null`, `None`.
|
|
40
|
+
- Single-quoted strings: `'literal text'`.
|
|
41
|
+
- Double-quoted strings: `"literal text"`.
|
|
42
|
+
- Bools, ints, `~` / `null` / `None` are kept **verbatim** — the
|
|
43
|
+
parser does not normalise `True` → `true` or `null` → `~`.
|
|
44
|
+
|
|
45
|
+
### Lists (sequences of scalars)
|
|
46
|
+
|
|
47
|
+
- Block-style lists:
|
|
48
|
+
```yaml
|
|
49
|
+
allowlist:
|
|
50
|
+
- foo
|
|
51
|
+
- bar
|
|
52
|
+
```
|
|
53
|
+
Indent inside the list must be consistent.
|
|
54
|
+
- Inline-flow lists, **flat only**: `[a, b, c]`.
|
|
55
|
+
- List items are scalars only. Nested mappings inside a list item are
|
|
56
|
+
**not** supported (see below).
|
|
57
|
+
|
|
58
|
+
### Comments and blank lines
|
|
59
|
+
|
|
60
|
+
- `#`-comments — full-line and inline (`key: value # comment`). Both
|
|
61
|
+
preserved verbatim, including leading whitespace and the gap before
|
|
62
|
+
`#`.
|
|
63
|
+
- Blank lines preserved verbatim — the engine never collapses them.
|
|
64
|
+
|
|
65
|
+
## Not supported (parser raises `ValueError` with a line number)
|
|
66
|
+
|
|
67
|
+
The following YAML features are out of contract. A user file that uses
|
|
68
|
+
any of them surfaces as `ValueError` from `scripts/sync_yaml_rt.py:sync`,
|
|
69
|
+
which `scripts/sync_agent_settings.py` catches and reports as **exit
|
|
70
|
+
code 2** with a line-numbered message.
|
|
71
|
+
|
|
72
|
+
- **Anchors and aliases** — `&name`, `*name`.
|
|
73
|
+
- **Multi-document streams** — `---` / `...` separators.
|
|
74
|
+
- **Nested flow mappings** — `key: {nested: value}` inline. Block-style
|
|
75
|
+
nested mappings are fine; flow-style nested mappings are not.
|
|
76
|
+
- **Nested mappings inside list items** — `- name: foo` followed by
|
|
77
|
+
indented children. Lists hold scalars only.
|
|
78
|
+
- **Complex keys** — `? [composite, key]: value`.
|
|
79
|
+
- **Tagged scalars** — `!!str 42`, `!Custom value`.
|
|
80
|
+
- **Multiline scalar styles** — `|` (literal) and `>` (folded) block
|
|
81
|
+
scalars.
|
|
82
|
+
- **Tabs in indent** — even one tab character in indent.
|
|
83
|
+
- **Mixed indent inside a block** — every child of a parent must share
|
|
84
|
+
the same indent.
|
|
85
|
+
|
|
86
|
+
Pinned by `tests/test_sync_round_trip.py` (34 tests) — every
|
|
87
|
+
not-supported feature has at least one fixture that asserts the
|
|
88
|
+
`ValueError` message.
|
|
89
|
+
|
|
90
|
+
## Test pinning
|
|
91
|
+
|
|
92
|
+
- Verbatim round-trip: `tests/test_sync_round_trip.py::test_user_block_round_trip_is_idempotent`, `::test_three_level_idempotent`.
|
|
93
|
+
- Out-of-subset rejection: same file, fixtures under
|
|
94
|
+
`tests/fixtures/sync_yaml_rt/` named `bad_*.yml`.
|
|
95
|
+
- CLI exit code on malformed input:
|
|
96
|
+
`tests/test_sync_agent_settings.py::test_malformed_user_yaml_exits_2_with_message`.
|
|
97
|
+
|
|
98
|
+
Any parser change is gated on those tests staying green. New fixtures
|
|
99
|
+
for new features land under `tests/fixtures/sync_yaml_rt/`.
|
|
100
|
+
|
|
101
|
+
## Why this subset (and why it is fixed)
|
|
102
|
+
|
|
103
|
+
The driving requirement from
|
|
104
|
+
[`layered-settings`](../guidelines/agent-infra/layered-settings.md) is
|
|
105
|
+
**verbatim user-line preservation**. `ruamel.yaml` and PyYAML both
|
|
106
|
+
re-emit through their own emitters, which normalises whitespace,
|
|
107
|
+
quoting, and blank-line placement. A stdlib parser limited to this
|
|
108
|
+
subset gives byte-identity across two consecutive syncs — the property
|
|
109
|
+
the merger relies on for additive insertion.
|
|
110
|
+
|
|
111
|
+
Out-of-subset YAML therefore is not a parser bug; it is a contract
|
|
112
|
+
violation by the user file. The friendly `ValueError` and exit code 2
|
|
113
|
+
are the contract's failure surface.
|
|
114
|
+
|
|
115
|
+
## Revisit triggers
|
|
116
|
+
|
|
117
|
+
This subset is **fixed** until one of the
|
|
118
|
+
[ADR revisit triggers](adr-settings-sync-engine.md#revisit-triggers)
|
|
119
|
+
fires — namely:
|
|
120
|
+
|
|
121
|
+
1. `.agent-settings.yml` schema gains a YAML feature outside the subset
|
|
122
|
+
(anchors, multi-doc, complex keys, nested flow mappings) — the cost
|
|
123
|
+
of extending the parser exceeds the cost of adopting `ruamel.yaml`.
|
|
124
|
+
2. The verbatim-preservation contract is relaxed — the driver for the
|
|
125
|
+
custom parser is gone.
|
|
126
|
+
3. The 0-dep posture for Python tooling is dropped at the package level
|
|
127
|
+
— the marginal cost of one more dep collapses.
|
|
128
|
+
4. A maintenance bug surfaces in the engine that ruamel's mature spec
|
|
129
|
+
coverage would have prevented.
|
|
130
|
+
|
|
131
|
+
A new ADR (with successor link) is required to change the subset; this
|
|
132
|
+
document is updated in the same commit.
|
|
133
|
+
|
|
134
|
+
## See also
|
|
135
|
+
|
|
136
|
+
- [`docs/contracts/adr-settings-sync-engine.md`](adr-settings-sync-engine.md) — decision record for the stdlib-only engine.
|
|
137
|
+
- [`docs/guidelines/agent-infra/layered-settings.md`](../guidelines/agent-infra/layered-settings.md) § Sync rules — the additive-merge-with-user-line-preservation contract this subset implements.
|
|
138
|
+
- [`scripts/sync_yaml_rt.py`](../../scripts/sync_yaml_rt.py) — implementation; module docstring mirrors this file.
|
|
139
|
+
- [`scripts/sync_agent_settings.py`](../../scripts/sync_agent_settings.py) — CLI driver and exit-code contract.
|
package/docs/customization.md
CHANGED
|
@@ -139,7 +139,7 @@ Rules:
|
|
|
139
139
|
| Setting | Default | Description |
|
|
140
140
|
|---|---|---|
|
|
141
141
|
| `agent_config_version` | *(empty)* | Exact semver pin of the agent-config release (see above). Empty = unpinned. |
|
|
142
|
-
| `cost_profile` | `
|
|
142
|
+
| `cost_profile` | `balanced` | Token budget (`minimal`, `balanced`, `full`, `custom`) — rationale: [`docs/contracts/cost-profile-defaults.md`](contracts/cost-profile-defaults.md) |
|
|
143
143
|
| `personal.user_name` | *(empty)* | User's first name for personalized responses |
|
|
144
144
|
| `personal.minimal_output` | `true` | Suppress intermediate output |
|
|
145
145
|
| `personal.play_by_play` | `false` | Share intermediate findings during analysis |
|
package/docs/getting-started.md
CHANGED
|
@@ -123,9 +123,11 @@ The system supports four configuration profiles:
|
|
|
123
123
|
Set your profile in `.agent-settings.yml`:
|
|
124
124
|
|
|
125
125
|
```yaml
|
|
126
|
-
cost_profile:
|
|
126
|
+
cost_profile: balanced
|
|
127
127
|
```
|
|
128
128
|
|
|
129
|
+
`balanced` is the default — kernel + tier-1 auto-rules. Rationale:
|
|
130
|
+
[`docs/contracts/cost-profile-defaults.md`](contracts/cost-profile-defaults.md).
|
|
129
131
|
You can override any individual setting. See [Customization](customization.md) for details.
|
|
130
132
|
|
|
131
133
|
---
|
package/docs/installation.md
CHANGED
|
@@ -240,8 +240,8 @@ wrapper (`./agent-config`) can fall through to it when no
|
|
|
240
240
|
The orchestrator chains payload sync and bridge generation:
|
|
241
241
|
|
|
242
242
|
```bash
|
|
243
|
-
bash scripts/install # defaults to cost_profile=
|
|
244
|
-
bash scripts/install --profile=
|
|
243
|
+
bash scripts/install # defaults to cost_profile=balanced
|
|
244
|
+
bash scripts/install --profile=minimal
|
|
245
245
|
bash scripts/install --force # overwrite existing bridges
|
|
246
246
|
bash scripts/install --skip-bridges # payload only
|
|
247
247
|
bash scripts/install --skip-sync # bridges only
|
|
@@ -287,7 +287,7 @@ regardless of which AI tool they use.** No per-developer plugin installation nee
|
|
|
287
287
|
After initial setup, commit these files:
|
|
288
288
|
|
|
289
289
|
```
|
|
290
|
-
.agent-settings.yml ← shared profile (e.g., cost_profile:
|
|
290
|
+
.agent-settings.yml ← shared profile (e.g., cost_profile: balanced)
|
|
291
291
|
agents/installed-tools.lock ← AI bill of materials (ADR-008, Phase 3)
|
|
292
292
|
.augment/ ← rules, skills, commands (symlinks)
|
|
293
293
|
.cursor/rules/ ← Cursor rules (symlinks)
|
|
@@ -517,16 +517,18 @@ The system works immediately with sensible defaults. Optionally, create `.agent-
|
|
|
517
517
|
to choose a profile:
|
|
518
518
|
|
|
519
519
|
```yaml
|
|
520
|
-
cost_profile:
|
|
520
|
+
cost_profile: balanced
|
|
521
521
|
```
|
|
522
522
|
|
|
523
523
|
| Profile | What's active | For whom |
|
|
524
524
|
|---|---|---|
|
|
525
|
-
| `minimal`
|
|
525
|
+
| `minimal` | Kernel only — Iron-Law floor, zero router | Token-constrained agents |
|
|
526
526
|
| `balanced` | + Runtime dispatcher + shell handler | Most teams |
|
|
527
527
|
| `full` | + Tool adapters (GitHub, Jira) | Platform teams |
|
|
528
528
|
|
|
529
|
-
No profile configured = `
|
|
529
|
+
No profile configured = `balanced` behavior (default). Rationale:
|
|
530
|
+
[`docs/contracts/cost-profile-defaults.md`](contracts/cost-profile-defaults.md).
|
|
531
|
+
→ [Full profile details](customization.md)
|
|
530
532
|
|
|
531
533
|
---
|
|
532
534
|
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# README three-audience split — plan
|
|
2
|
+
|
|
3
|
+
Annotated outline for `P2.2a` in
|
|
4
|
+
[`road-to-proof-not-features.md`](../agents/roadmaps/road-to-proof-not-features.md).
|
|
5
|
+
Decides the **information architecture**, not the prose. No content
|
|
6
|
+
rewrite happens in this step; `P2.2b` applies the mapping.
|
|
7
|
+
|
|
8
|
+
## Target headings (top of README, in order)
|
|
9
|
+
|
|
10
|
+
1. **Use it in your project** — anchor `#use-it`
|
|
11
|
+
2. **Prove it** — anchor `#prove-it`
|
|
12
|
+
3. **Contribute** — anchor `#contribute`
|
|
13
|
+
|
|
14
|
+
Each branch opens with one paragraph + one primary CTA. AI Council is
|
|
15
|
+
not mentioned in any branch (verified by `P3.4`).
|
|
16
|
+
|
|
17
|
+
### Anchor-stability promise
|
|
18
|
+
|
|
19
|
+
`P2.2b` must keep these existing anchors intact so external inbound
|
|
20
|
+
links survive:
|
|
21
|
+
|
|
22
|
+
| Anchor today | Lives under (new) | Why |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| `#quickstart` | `#use-it` | npm/composer search results, social links |
|
|
25
|
+
| `#supported-tools` | `#use-it` | most-cited section on the web |
|
|
26
|
+
| `#what-your-agent-is-asked-to-do` | `#prove-it` | linked from blog posts |
|
|
27
|
+
| `#documentation` | `#use-it` | docs portal entry |
|
|
28
|
+
| `#development` | `#contribute` | contributor guides |
|
|
29
|
+
|
|
30
|
+
Other section anchors may be renamed; `lint-readme` checks the table
|
|
31
|
+
above and the three new audience anchors only.
|
|
32
|
+
|
|
33
|
+
## Block-by-block mapping
|
|
34
|
+
|
|
35
|
+
Every existing top-of-README block, in source order, mapped to
|
|
36
|
+
exactly one branch. "Drop" = block is retired; "Move" = relocated as-
|
|
37
|
+
is; "Reframe" = block stays but its lead-in / CTA changes (still no
|
|
38
|
+
copy rewrite in this step — the reframe direction is decided here,
|
|
39
|
+
applied in `P2.2b`).
|
|
40
|
+
|
|
41
|
+
| # | Block (current heading) | Lines | Branch | Action | Notes |
|
|
42
|
+
|---|---|---|---|---|---|
|
|
43
|
+
| 1 | Title + tagline + stats badge | 1–13 | — | Keep above branches | Survives unchanged; counts updated by `update_readme_counts`. |
|
|
44
|
+
| 2 | `## Start here` (three-paths table) | 15–25 | — | **Drop** | Replaced by the three branch sections themselves; rows map cleanly: `/onboard` → Use, `task ci` → Contribute, `task generate-tools` → Use. |
|
|
45
|
+
| 3 | `## Quickstart` lead-in | 27–39 | Use it | Move | Becomes the opening paragraph under `#use-it`. |
|
|
46
|
+
| 4 | `### For teams (recommended)` | 40–79 | Use it | Move | Primary CTA for `#use-it`. |
|
|
47
|
+
| 5 | `### Pick specific AIs` | 81–101 | Use it | Move | Stays under Quickstart subtree. |
|
|
48
|
+
| 6 | `#### Global install` | 103–124 | Use it | Move | Subsection of Pick specific AIs. |
|
|
49
|
+
| 7 | `### For individual use (optional)` | 126–144 | Use it | Move | Alternate install path. |
|
|
50
|
+
| 8 | `### Self-hosted MCP on Cloudflare` | 146–226 | Use it | Move | Operator install path; deep but consumer-facing. |
|
|
51
|
+
| 9 | `#### Lock your Worker behind Bearer` | 196–213 | Use it | Move | Subsection of MCP block; stays nested. |
|
|
52
|
+
| 10 | `### Optional: persistent agent memory` | 228–247 | Use it | Move | Companion package install. |
|
|
53
|
+
| 11 | `## 2-minute demo: /implement-ticket` | 251–285 | Prove it | Move | Flagship evidence surface. Primary CTA for `#prove-it`. |
|
|
54
|
+
| 12 | `### Sibling entrypoint: /work` | 287–316 | Prove it | Move | Same engine, second envelope. |
|
|
55
|
+
| 13 | `### Product UI track` | 318–347 | Prove it | Move | Third evidence surface. |
|
|
56
|
+
| 14 | `## What your agent is asked to do` | 351–365 | Prove it | Move | Intent table — proof of behaviour, not features. |
|
|
57
|
+
| 15 | `## What this package is — and what it isn't` | 369–398 | Prove it | Move | Scope-honesty surface; loadbearing for the "proof" framing. |
|
|
58
|
+
| 16 | `## You don't need everything` (cost profiles) | 402–423 | Prove it | Reframe | Currently sits as "feature" prose; the new framing is "proof that the package shrinks to fit". |
|
|
59
|
+
| 17 | `## Who this is for` (stack coverage) | 427–439 | Prove it | Move | Honest depth claim — also evidence-side. |
|
|
60
|
+
| 18 | `## Featured Skills` | 443–462 | Use it | Move | Catalog teaser → consumer surface. |
|
|
61
|
+
| 19 | `## Featured Commands` | 466–481 | Use it | Move | Catalog teaser → consumer surface. |
|
|
62
|
+
| 20 | `## Supported Tools / Project-installed` | 487–527 | Use it | Move | Per-tool install matrix. |
|
|
63
|
+
| 21 | `## Supported Tools / Plugin-installed` | 529–541 | Use it | Move | Subsection. |
|
|
64
|
+
| 22 | `## Supported Tools / Cloud / Hosted-agent` | 543–558 | Use it | Move | Subsection. |
|
|
65
|
+
| 23 | `## Core Principles` | 562–570 | Prove it | Move | Behavioural floor — proof-side. |
|
|
66
|
+
| 24 | `## Documentation` (index table) | 574–589 | Use it | Move | Doc portal entry. |
|
|
67
|
+
| 25 | `### Maintainer telemetry (opt-in)` | 591–608 | Contribute | Move | Engagement measurement — maintainer / contributor surface. |
|
|
68
|
+
| 26 | `### Context-aware command suggestion` | 610–629 | Use it | Move | Consumer-facing feature toggle. |
|
|
69
|
+
| 27 | `## Development` | 633–642 | Contribute | Move | Primary CTA for `#contribute`. |
|
|
70
|
+
| 28 | `## Requirements` | 644–649 | Use it | Move | Install gate — Use-side, not Contribute. |
|
|
71
|
+
| 29 | `## License` | 651–653 | — | Keep at bottom | Footer; outside the three branches. |
|
|
72
|
+
|
|
73
|
+
## Branch outlines (post-migration shape)
|
|
74
|
+
|
|
75
|
+
### `## Use it in your project`
|
|
76
|
+
|
|
77
|
+
Opening paragraph: one-line "Two minutes from npx to a better-behaved
|
|
78
|
+
agent." Primary CTA: `npx @event4u/agent-config init`. Children:
|
|
79
|
+
Quickstart subtree (#3–#7), MCP operator path (#8–#9), optional memory
|
|
80
|
+
(#10), Featured Skills + Commands (#18–#19), Supported Tools (#20–#22),
|
|
81
|
+
Documentation (#24), Command suggestion (#26), Requirements (#28).
|
|
82
|
+
|
|
83
|
+
### `## Prove it`
|
|
84
|
+
|
|
85
|
+
Opening paragraph: one-line "What the agent actually does, with
|
|
86
|
+
evidence." Primary CTA: `/implement-ticket` demo (#11). Children:
|
|
87
|
+
`/work` (#12), Product UI track (#13), Intent table (#14), Scope
|
|
88
|
+
statement (#15), Cost profiles reframed (#16), Stack coverage (#17),
|
|
89
|
+
Core Principles (#23).
|
|
90
|
+
|
|
91
|
+
### `## Contribute`
|
|
92
|
+
|
|
93
|
+
Opening paragraph: one-line "Editing rules, skills, commands — the
|
|
94
|
+
contributor loop." Primary CTA: `task ci` (#27). Children: Maintainer
|
|
95
|
+
telemetry (#25). External links: `CONTRIBUTING.md`, `AGENTS.md`,
|
|
96
|
+
`docs/development.md`.
|
|
97
|
+
|
|
98
|
+
## Verification (P2.2c preview)
|
|
99
|
+
|
|
100
|
+
Grep-based test asserts `## Use it in your project`, `## Prove it`,
|
|
101
|
+
`## Contribute` appear in that order. `lint-readme` keeps anchor
|
|
102
|
+
stability for the rows in the Anchor-stability promise table.
|
package/package.json
CHANGED