@event4u/agent-config 1.35.0 → 1.36.1
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/memory/load.md +69 -0
- package/.agent-src/commands/memory/mine-session.md +151 -0
- package/.agent-src/commands/memory/promote.md +35 -0
- package/.agent-src/commands/memory/propose.md +10 -1
- package/.agent-src/commands/memory.md +5 -3
- package/.agent-src/commands/roadmap/process-full.md +6 -3
- package/.agent-src/contexts/authority/scope-mechanics.md +56 -2
- package/.agent-src/contexts/execution/autonomy-detection.md +7 -7
- package/.agent-src/contexts/execution/roadmap-process-loop.md +7 -2
- package/.agent-src/rules/autonomous-execution.md +25 -0
- package/.agent-src/rules/scope-control.md +13 -8
- package/.agent-src/skills/memory-consolidation/SKILL.md +216 -0
- package/.agent-src/templates/roadmaps.md +14 -9
- package/.claude-plugin/marketplace.json +3 -1
- package/CHANGELOG.md +42 -0
- package/README.md +3 -3
- package/config/agent-settings.template.yml +35 -0
- package/docs/architecture.md +2 -2
- package/docs/catalog.md +10 -4
- package/docs/contracts/agent-memory-contract.md +15 -1
- package/docs/contracts/command-clusters.md +1 -1
- package/docs/contracts/file-ownership-matrix.json +278 -0
- package/docs/getting-started.md +1 -1
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +52 -0
- package/package.json +1 -1
- package/scripts/check_memory.py +106 -4
- package/scripts/check_references.py +1 -0
- package/scripts/lint_roadmap_complexity.py +53 -6
- package/scripts/mine_session.py +279 -0
|
@@ -41,6 +41,41 @@ in the entry count and the signal-to-noise degrades fast on large types.
|
|
|
41
41
|
> 6. ownership
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
+
### 1b. Surface the Tier-0 critical slice
|
|
45
|
+
|
|
46
|
+
Before loading the requested type, emit every active entry with
|
|
47
|
+
`priority: critical` across **all** memory types as a Tier-0 banner.
|
|
48
|
+
The contract for `priority: critical` is *always-surface regardless of
|
|
49
|
+
query*; this step honours it.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
./agent-config memory:lookup --priority critical --status active --format yaml
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Render the slice in a fenced block titled `Tier-0 (critical)`, ordered
|
|
56
|
+
by `(type, id)`. If the slice is empty, skip the banner silently — do
|
|
57
|
+
not announce absence.
|
|
58
|
+
|
|
59
|
+
If the lookup helper does not yet support `--priority`, fall back to a
|
|
60
|
+
file-only sweep:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
python3 - <<'PY'
|
|
64
|
+
import pathlib, yaml
|
|
65
|
+
for f in sorted(pathlib.Path("agents/memory").rglob("*.yml")):
|
|
66
|
+
data = yaml.safe_load(f.read_text(encoding="utf-8")) or {}
|
|
67
|
+
for e in data.get("entries", []) or []:
|
|
68
|
+
if e.get("priority") == "critical" and e.get("status") == "active":
|
|
69
|
+
print(f"--- {f.parent.name}/{e.get('id')}")
|
|
70
|
+
print(yaml.safe_dump(e, sort_keys=False), end="")
|
|
71
|
+
PY
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The Tier-0 slice is surfaced once per `/memory:load` invocation, even
|
|
75
|
+
when the user picks a type with no critical entries — the slice spans
|
|
76
|
+
types deliberately. Token cost is bounded by the soft cap of 10
|
|
77
|
+
critical entries per type (warned by `scripts/check_memory.py`).
|
|
78
|
+
|
|
44
79
|
### 2. Warn about volume
|
|
45
80
|
|
|
46
81
|
Before loading, count the entries:
|
|
@@ -84,6 +119,40 @@ with its declared `confidence` — see
|
|
|
84
119
|
[`memory-access`](../../docs/guidelines/agent-infra/memory-access.md) for
|
|
85
120
|
how entries modulate edits.
|
|
86
121
|
|
|
122
|
+
### 5. Inline-review hook (intake backlog)
|
|
123
|
+
|
|
124
|
+
After step 4, count unreviewed intake entries for the same type:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
./agent-config memory:lookup --types <type> --intake-only --format json | \
|
|
128
|
+
python3 -c "import sys, json; print(len(json.load(sys.stdin)))"
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Read `memory.review_threshold` from `.agent-settings.yml` (default 10).
|
|
132
|
+
If the count is **0** or **≤ threshold**, skip this step silently. If
|
|
133
|
+
**> threshold**, surface a numbered preview of the top-3 highest-
|
|
134
|
+
confidence intake signals (see
|
|
135
|
+
[`memory-consolidation`](../../skills/memory-consolidation/SKILL.md)
|
|
136
|
+
§ Phase 3 for the consolidation contract):
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
> ⚠️ {N} unreviewed intake signals for `{type}` (threshold {T}).
|
|
140
|
+
> Top 3 by confidence:
|
|
141
|
+
>
|
|
142
|
+
> 1. [conf=high] {sig-id} — {one-line observation}
|
|
143
|
+
> 2. [conf=med ] {sig-id} — {one-line observation}
|
|
144
|
+
> 3. [conf=med ] {sig-id} — {one-line observation}
|
|
145
|
+
>
|
|
146
|
+
> Review now?
|
|
147
|
+
> 1. Promote — run /memory promote on a signal id
|
|
148
|
+
> 2. Mine more — run /memory mine-session for fresh signals
|
|
149
|
+
> s. Skip (default) — proceed with the loaded entries
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Default action is **skip** — the load completes regardless. This is a
|
|
153
|
+
nudge, not a gate. If `memory.review_threshold` is `0`, skip this
|
|
154
|
+
step entirely (feature off). Never auto-promote.
|
|
155
|
+
|
|
87
156
|
## When to reject
|
|
88
157
|
|
|
89
158
|
- User is mid-implementation and asks for the full load as a shortcut
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: memory:mine-session
|
|
3
|
+
cluster: memory
|
|
4
|
+
sub: mine-session
|
|
5
|
+
description: Mine the active session transcript for memory signals (corrections, preferences, decisions, recurring patterns) — preview-by-default, opt-in transcript access, host-agnostic via TranscriptAdapter.
|
|
6
|
+
skills: [memory-consolidation, file-editor]
|
|
7
|
+
disable-model-invocation: true
|
|
8
|
+
suggestion:
|
|
9
|
+
eligible: false
|
|
10
|
+
rationale: "Reads transcript files — opt-in, per-invocation confirmation required."
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# /memory mine-session
|
|
14
|
+
|
|
15
|
+
Runs the **GATHER SIGNAL** phase of the [`memory-consolidation`](../../skills/memory-consolidation/SKILL.md)
|
|
16
|
+
loop against the current host's transcripts and surfaces normalised
|
|
17
|
+
project-scoped facts as a preview. No file is written without
|
|
18
|
+
`--commit-intake`. No transcript is read without
|
|
19
|
+
`--confirm-transcript-access`.
|
|
20
|
+
|
|
21
|
+
## When to use
|
|
22
|
+
|
|
23
|
+
- After a multi-day implementation, before the conversation history
|
|
24
|
+
rotates out of context.
|
|
25
|
+
- The user says "mine my recent sessions" or "consolidate what we've
|
|
26
|
+
decided".
|
|
27
|
+
- The `/memory load` inline-review block flagged > 10 unreviewed signals
|
|
28
|
+
and the user wants to add fresh ones from the live transcript before
|
|
29
|
+
promoting.
|
|
30
|
+
|
|
31
|
+
Do NOT use as an automatic post-session hook. Mining is per-invocation
|
|
32
|
+
and confirmed.
|
|
33
|
+
|
|
34
|
+
## Flags
|
|
35
|
+
|
|
36
|
+
| Flag | Default | Purpose |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `--since <ISO-date>` | 14 days ago | Only mine turns at or after this date. Re-anchors relative phrases like "yesterday" with `YYYY-MM-DD`. |
|
|
39
|
+
| `--confirm-transcript-access` | off | Opt-in gate. Without it, the miner reads zero turns and prints the opt-in hint. Per-invocation, not persistent. |
|
|
40
|
+
| `--preview` | on | Render normalised facts to stdout. No file write. Default behaviour. |
|
|
41
|
+
| `--commit-intake` | off | Mutually exclusive with `--preview`. Append normalised facts to `agents/memory/intake/<primary-tag>.jsonl`. |
|
|
42
|
+
| `--host <claude-code\|cursor\|augment>` | auto-detect | Force the `TranscriptAdapter`. Phase 1 ships `claude-code` only; others print `not-supported-on-this-host` and exit. |
|
|
43
|
+
|
|
44
|
+
## Steps
|
|
45
|
+
|
|
46
|
+
### 1. Verify opt-in
|
|
47
|
+
|
|
48
|
+
If `--confirm-transcript-access` is absent, print:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
> Mining reads your session transcript files. Re-run with
|
|
52
|
+
> --confirm-transcript-access to proceed. The flag is per-invocation
|
|
53
|
+
> and not persisted.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Then exit with code 0. **Do not read any file.**
|
|
57
|
+
|
|
58
|
+
### 2. Resolve TranscriptAdapter
|
|
59
|
+
|
|
60
|
+
Auto-detect the host (Claude Code → `~/.claude/projects/<repo>/sessions/*.jsonl`).
|
|
61
|
+
If auto-detect fails or `--host` names an unimplemented adapter, print:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
> No TranscriptAdapter for host=<name>. Phase 1 supports: claude-code.
|
|
65
|
+
> Use /memory propose to record signals manually.
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Then exit with code 0.
|
|
69
|
+
|
|
70
|
+
### 3. Stream + extract
|
|
71
|
+
|
|
72
|
+
Iterate transcript turns within the `--since` window through the four
|
|
73
|
+
signal regex families documented in
|
|
74
|
+
[`memory-consolidation`](../../skills/memory-consolidation/SKILL.md)
|
|
75
|
+
§ Phase 2. For each match, normalise the fact (strip pronouns, IDE
|
|
76
|
+
chrome, timestamps, turn-id) and assign a primary tag from the
|
|
77
|
+
schema-routing table.
|
|
78
|
+
|
|
79
|
+
If the normalised count exceeds 5, **stop after the 5th** and print:
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
> ⚠️ Miner produced > 5 facts. Tighten patterns or narrow --since.
|
|
83
|
+
> Showing the first 5; the rest are dropped.
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
This is the strict-gate exit per the skill's exit criteria.
|
|
87
|
+
|
|
88
|
+
### 4. Render preview
|
|
89
|
+
|
|
90
|
+
Print one Markdown block to stdout:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
## Mining preview — <project> · <window> · host=<name>
|
|
94
|
+
|
|
95
|
+
| # | Tag | Key | Observation | Source turn |
|
|
96
|
+
|---|---|---|---|---|
|
|
97
|
+
| 1 | convention | <symbol> | <one-line fact> | <ts> |
|
|
98
|
+
| 2 | gotcha | <path> | <one-line fact> | <ts> |
|
|
99
|
+
|
|
100
|
+
Schemas touched: conventions, operational-gotchas
|
|
101
|
+
Stale curated entries (last_validated > 90d, not seen in 30d): <list or "none">
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
If `--preview` (default), stop here.
|
|
105
|
+
|
|
106
|
+
### 5. Commit (only with `--commit-intake`)
|
|
107
|
+
|
|
108
|
+
Append each fact as one JSONL line to
|
|
109
|
+
`agents/memory/intake/<primary-tag>.jsonl` with the contract fields:
|
|
110
|
+
`ts`, `type`, `key`, `observation`, `source: agent`,
|
|
111
|
+
`session_id`, plus the optional `tags: [<one>, <two>]` field.
|
|
112
|
+
|
|
113
|
+
Confirm:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
✅ Appended <N> intake lines across <M> files.
|
|
117
|
+
Next: /memory promote to lift validated lines into curated YAML.
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Safety
|
|
121
|
+
|
|
122
|
+
- **Never** writes outside `agents/memory/intake/`.
|
|
123
|
+
- **Never** reads transcripts without `--confirm-transcript-access`.
|
|
124
|
+
- **Never** synthesizes facts. The miner is a strict gate against
|
|
125
|
+
the four regex families; if zero matches → prints "no signals".
|
|
126
|
+
- **Never** auto-promotes. `/memory promote` is a separate, validated
|
|
127
|
+
step.
|
|
128
|
+
|
|
129
|
+
## Gotcha
|
|
130
|
+
|
|
131
|
+
- `--commit-intake` and `--preview` are mutually exclusive. Passing
|
|
132
|
+
both → exit with usage error.
|
|
133
|
+
- The `TranscriptAdapter` strips IDE chrome (tool-call boilerplate,
|
|
134
|
+
reasoning blocks, system reminders) before pattern matching. If the
|
|
135
|
+
miner under-counts, audit the adapter's redact list, not the regex.
|
|
136
|
+
- Date-discipline: relative phrases (`yesterday`, `last week`) in the
|
|
137
|
+
observation field are rejected by `scripts/check_memory.py` unless
|
|
138
|
+
re-anchored with `YYYY-MM-DD` within ±20 chars. The miner re-anchors
|
|
139
|
+
automatically using the turn's `ts`; verify before commit.
|
|
140
|
+
|
|
141
|
+
## See also
|
|
142
|
+
|
|
143
|
+
- [`memory-consolidation`](../../skills/memory-consolidation/SKILL.md) — the
|
|
144
|
+
four-phase loop (ORIENT → GATHER → CONSOLIDATE → PRUNE) this command
|
|
145
|
+
implements GATHER SIGNAL for.
|
|
146
|
+
- [`memory:propose`](propose.md) — manual fallback when no
|
|
147
|
+
`TranscriptAdapter` matches the current host.
|
|
148
|
+
- [`memory:promote`](promote.md) — lifts validated intake lines into
|
|
149
|
+
curated YAML.
|
|
150
|
+
- [`agent-memory-contract`](../../../docs/contracts/agent-memory-contract.md) —
|
|
151
|
+
intake JSONL schema, including the `tags` field.
|
|
@@ -70,8 +70,43 @@ hydrate the full frontmatter:
|
|
|
70
70
|
and well-validated — then `high`).
|
|
71
71
|
- `source:` — at minimum the intake jsonl file + line number.
|
|
72
72
|
- `owner:`, `last_validated: <today>`, `review_after_days:`.
|
|
73
|
+
- `priority:` — optional (`critical` | `normal` | `low`); defaults to
|
|
74
|
+
`normal` when omitted. Pass through from the intake signal if it
|
|
75
|
+
carries one. Mark `critical` only when the entry is meant to surface
|
|
76
|
+
on every `/memory:load` regardless of query — e.g. a tenant-isolation
|
|
77
|
+
invariant or a payment-flow rule. The validator warns when a type
|
|
78
|
+
accumulates more than 10 active critical entries; raise the bar
|
|
79
|
+
deliberately. See [`engineering-memory-data-format`](../../docs/guidelines/agent-infra/engineering-memory-data-format.md)
|
|
80
|
+
§ Priority semantics for the full contract.
|
|
81
|
+
- `ts_week:` — optional ISO-week stamp `YYYY-Www` (e.g. `2026-W17`).
|
|
82
|
+
**Convention, not enforced.** Stamp the curated entry with the week
|
|
83
|
+
it was promoted, never the day or hour. ISO-week granularity prevents
|
|
84
|
+
intra-week timing inference (e.g. "this rule was added Tuesday 3pm
|
|
85
|
+
→ that's when the incident hit") while keeping useful long-term
|
|
86
|
+
ordering. Write it via:
|
|
87
|
+
```bash
|
|
88
|
+
date -u +'%G-W%V' # POSIX ISO week-numbering year + ISO week
|
|
89
|
+
```
|
|
90
|
+
See [`engineering-memory-data-format`](../../docs/guidelines/agent-infra/engineering-memory-data-format.md)
|
|
91
|
+
§ Temporal jitter for rationale.
|
|
73
92
|
- Type-specific fields (`rule`, `symptom`, `path`, …).
|
|
74
93
|
|
|
94
|
+
If the intake signal carries `tags: [<one>, <two>]`, **resolve via tag
|
|
95
|
+
intersection** (do not pick by file extension):
|
|
96
|
+
|
|
97
|
+
| Tags on signal | Curated target |
|
|
98
|
+
|---|---|
|
|
99
|
+
| `[convention]` | `agents/memory/conventions.yml` |
|
|
100
|
+
| `[invariant]` | `agents/memory/domain-invariants.yml` |
|
|
101
|
+
| `[gotcha]` | `agents/memory/operational-gotchas.yml` |
|
|
102
|
+
| `[pattern]` | `agents/memory/recurring-patterns.yml` |
|
|
103
|
+
| `[gotcha, invariant]` | `domain-invariants` (invariant wins — structural beats operational) |
|
|
104
|
+
| `[pattern, gotcha]` | `recurring-patterns` (pattern wins — repetition beats one-off) |
|
|
105
|
+
| `[convention, invariant]` | `domain-invariants` (invariant wins) |
|
|
106
|
+
|
|
107
|
+
If the user disagrees with the tag-intersection result, ask which
|
|
108
|
+
schema to write to and record the override in the `source:` block.
|
|
109
|
+
|
|
75
110
|
Show the YAML draft and ask for confirmation before writing.
|
|
76
111
|
|
|
77
112
|
### 4. Write the curated entry (content-addressed)
|
|
@@ -62,6 +62,11 @@ Ask once, numbered. If the user picks `skip`, proceed without them:
|
|
|
62
62
|
- `owner` (ownership)
|
|
63
63
|
- `rule` (domain-invariants, product-rules)
|
|
64
64
|
- `severity` — `low` · `medium` · `high`
|
|
65
|
+
- `tags` — zero or more from `{convention, invariant, gotcha, pattern}`.
|
|
66
|
+
See [`memory-consolidation`](../../skills/memory-consolidation/SKILL.md)
|
|
67
|
+
§ Phase 3 for the schema-routing table. Two tags are allowed; the
|
|
68
|
+
primary tag picks the intake JSONL file, the promoter resolves the
|
|
69
|
+
curated target via tag intersection.
|
|
65
70
|
|
|
66
71
|
### 4. Emit via the shared helper
|
|
67
72
|
|
|
@@ -71,9 +76,13 @@ Ask once, numbered. If the user picks `skip`, proceed without them:
|
|
|
71
76
|
--path "<path>" \
|
|
72
77
|
--body "<body>" \
|
|
73
78
|
--origin "propose-memory" \
|
|
74
|
-
--extra '{"symptom":"...","severity":"medium"}'
|
|
79
|
+
--extra '{"symptom":"...","severity":"medium","tags":["convention"]}'
|
|
75
80
|
```
|
|
76
81
|
|
|
82
|
+
The `tags` array is optional (default `[]`). When present, downstream
|
|
83
|
+
consumers (`/memory promote`, `/memory load` inline review) use the
|
|
84
|
+
schema-routing table to pick the curated target.
|
|
85
|
+
|
|
77
86
|
The helper deduplicates identical `(type, path, body)` within 7 days
|
|
78
87
|
automatically — re-running the command on the same finding will
|
|
79
88
|
silently skip the write. Add `--force` only when deliberate duplication
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: memory
|
|
3
|
-
description: Memory orchestrator — routes to add, load, promote, propose
|
|
3
|
+
description: Memory orchestrator — routes to add, load, mine-session, promote, propose
|
|
4
4
|
cluster: memory
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
suggestion:
|
|
@@ -20,6 +20,7 @@ commands with a single entry point + sub-command dispatch.
|
|
|
20
20
|
|---|---|---|
|
|
21
21
|
| `/memory add` | `commands/memory/add.md` | Interactively add a validated entry to a memory file |
|
|
22
22
|
| `/memory load` | `commands/memory/load.md` | Load ALL curated entries of a given memory type into context |
|
|
23
|
+
| `/memory mine-session` | `commands/memory/mine-session.md` | Mine the active session transcript for memory signals (preview-by-default) |
|
|
23
24
|
| `/memory promote` | `commands/memory/promote.md` | Promote an intake signal to a curated memory entry |
|
|
24
25
|
| `/memory propose` | `commands/memory/propose.md` | Append a provisional signal to the intake stream |
|
|
25
26
|
|
|
@@ -36,8 +37,9 @@ Sub-command names match the locked contract in
|
|
|
36
37
|
|
|
37
38
|
> 1. add — write a curated entry interactively
|
|
38
39
|
> 2. load — load ALL entries of a type for deep analysis
|
|
39
|
-
> 3.
|
|
40
|
-
> 4.
|
|
40
|
+
> 3. mine-session — preview signals from the active session transcript
|
|
41
|
+
> 4. promote — promote an intake signal to a curated entry
|
|
42
|
+
> 5. propose — drop a provisional signal into the intake stream
|
|
41
43
|
|
|
42
44
|
## Rules
|
|
43
45
|
|
|
@@ -56,9 +56,12 @@ ignores them by construction. If the user wants narrower execution they
|
|
|
56
56
|
invoke `/roadmap:process-phase` (scope = single phase) or
|
|
57
57
|
`/roadmap:process-step` (scope = single step) instead.
|
|
58
58
|
|
|
59
|
-
Time-boxed plate / horizon framing is
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
Time-boxed plate / horizon framing is opt-in via
|
|
60
|
+
`roadmap.horizon_weeks` in `.agent-settings.yml` (default `0` =
|
|
61
|
+
forbidden, per template rule 16 in `templates/roadmaps.md`). If a
|
|
62
|
+
roadmap carries such phrasing — whether by legacy or by an opt-in
|
|
63
|
+
setting — treat it as ordinary prose during execution, never as a
|
|
64
|
+
gate. Phase ordering and explicit dependency gates govern the loop.
|
|
62
65
|
|
|
63
66
|
## Iron Law — Real-time dashboard
|
|
64
67
|
|
|
@@ -5,8 +5,9 @@ detail behind the Hard Floor restatement, the brief-before-asking
|
|
|
5
5
|
flow for separate-branch proposals, and the failure modes / bypass
|
|
6
6
|
rules around fenced steps.
|
|
7
7
|
|
|
8
|
-
**Size budget:** ≤
|
|
9
|
-
`
|
|
8
|
+
**Size budget:** soft cap ≤ 8,000 chars (context layer, on-demand
|
|
9
|
+
loaded). The mechanics file absorbs growth so `scope-control` stays
|
|
10
|
+
under the 4,000-char kernel ceiling.
|
|
10
11
|
|
|
11
12
|
## Production, infrastructure, bulk-destructive — Hard Floor
|
|
12
13
|
|
|
@@ -40,6 +41,23 @@ permission is per-operation, this-turn. Standing autonomy directives
|
|
|
40
41
|
narrow other rules but never grant permission for items in this Hard
|
|
41
42
|
Floor subset.
|
|
42
43
|
|
|
44
|
+
## Roadmap shape — no release language
|
|
45
|
+
|
|
46
|
+
Forbidden in roadmaps / plans / tickets / any planning artifact:
|
|
47
|
+
version numbers (`v2.0`, `1.4.x`), target releases (`Q4 release`,
|
|
48
|
+
`Sprint 23`), deprecation dates tied to release calendars,
|
|
49
|
+
release-tied milestones (`launch milestone`, `GA`), and git tags
|
|
50
|
+
(`tag v1.2.0`).
|
|
51
|
+
|
|
52
|
+
Roadmaps plan **work**. Releases / tags / version pins are a
|
|
53
|
+
**separate decision** the user pins explicitly on the artifact that
|
|
54
|
+
owns release shape — changelog, release PR, tag annotation — not
|
|
55
|
+
buried inside a planning document. Authoring verbs (`create / draft /
|
|
56
|
+
write the roadmap`) authorize the planning artifact, not version
|
|
57
|
+
pinning inside it. If the user names a version in a planning
|
|
58
|
+
request, ask whether the artifact tracks the work or the release;
|
|
59
|
+
default to work.
|
|
60
|
+
|
|
43
61
|
## Brief-before-asking — separate branch / PR / worktree
|
|
44
62
|
|
|
45
63
|
If a task seems to need a separate branch or PR (spike, hotfix,
|
|
@@ -105,3 +123,39 @@ benefits from a spike branch). If in doubt, do not ask.
|
|
|
105
123
|
A clear *"go ahead"*, *"start now"*, *"mach weiter"*, or an explicit
|
|
106
124
|
*"approved, implement E1.1"* on a later turn lifts the fence. Until
|
|
107
125
|
then: silence on execution.
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
## Authoring vs. implementation — verb discipline
|
|
129
|
+
|
|
130
|
+
Restated detail for [`scope-control § Authoring vs.
|
|
131
|
+
implementation`](../../rules/scope-control.md). The Iron Law is in
|
|
132
|
+
the kernel; this is the worked-out catalogue.
|
|
133
|
+
|
|
134
|
+
**Authoring verbs** (artifact-only, never execution): `create`,
|
|
135
|
+
`draft`, `write`, `author`, `prepare`, `outline`, `entwirf`,
|
|
136
|
+
`erstelle`, `schreibe`, `vorbereite`. Deliverable: a roadmap file,
|
|
137
|
+
plan, ADR, ticket, design doc, or brief. Stop after it lands; let
|
|
138
|
+
the user pick the next move.
|
|
139
|
+
|
|
140
|
+
**Execution verbs** (then the executing rules apply): `implement`,
|
|
141
|
+
`build`, `ship`, `setze um`, `baue`, `arbeite ab`, `arbeite die
|
|
142
|
+
roadmap ab`.
|
|
143
|
+
|
|
144
|
+
**Worked examples**
|
|
145
|
+
|
|
146
|
+
- *"Create the roadmap for X"* / *"Erstelle die Roadmap für X"* →
|
|
147
|
+
write the roadmap file, stop, hand back. Do **not** start
|
|
148
|
+
implementing the steps it contains; do **not** create a feature
|
|
149
|
+
branch for the work the roadmap describes.
|
|
150
|
+
- *"Draft an ADR for the auth refactor"* → ADR lands; auth refactor
|
|
151
|
+
is a separate decision.
|
|
152
|
+
- *"Write the migration plan, then start with phase 1"* → mixed
|
|
153
|
+
verbs. Default to authoring-only, ask which scope wins.
|
|
154
|
+
|
|
155
|
+
**Task-scoped autonomy carry-over**
|
|
156
|
+
|
|
157
|
+
A previous turn's standing autonomy for a *different task* does NOT
|
|
158
|
+
carry over. Concretely: *"arbeite eigenständig"* given for
|
|
159
|
+
"Roadmap A" is consumed when Roadmap A's deliverable lands. A new
|
|
160
|
+
named task (Roadmap B, ticket Y, "next slice") needs fresh
|
|
161
|
+
authorization. See [`autonomous-execution § task-scope`](../../rules/autonomous-execution.md#task-scope--autonomy-is-bound-to-the-named-task).
|
|
@@ -12,15 +12,15 @@ when the user expresses **"stop asking on trivial steps, just work"**.
|
|
|
12
12
|
The LLM recognizes the **intent**, not a literal substring, and
|
|
13
13
|
understands the semantic equivalent in either language.
|
|
14
14
|
|
|
15
|
-
## Litmus test —
|
|
15
|
+
## Litmus test — three shapes, only one flips standing mode
|
|
16
16
|
|
|
17
|
-
| Question | Outcome |
|
|
18
|
-
|
|
19
|
-
|
|
|
20
|
-
|
|
|
17
|
+
| Question | Shape | Outcome |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| Standing permission to skip trivial workflow questions, **no deliverable named**? ("stop asking", "just work") | conversation-wide | Flip standing mode. Sticky for the rest of the conversation. |
|
|
20
|
+
| Autonomous execution **bound to a named deliverable** ("arbeite Roadmap X ab", "work end-to-end on PROJ-123", "build feature Y autonomously")? | task-scoped | Execute that deliverable without per-step asks. Do **not** flip standing mode. Scope ends with the deliverable. New task → fresh confirmation, per [`autonomous-execution § task-scope`](../../rules/autonomous-execution.md#task-scope--autonomy-is-bound-to-the-named-task). |
|
|
21
|
+
| Single-decision delegation ("you decide for this step", "for this one let me know what you'd pick")? | one-shot | Handle that step autonomously. Do **not** flip standing mode. |
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
delegation is one-shot.
|
|
23
|
+
Only the first shape is sticky for the conversation. The second is sticky only for the named task. The third is one-shot.
|
|
24
24
|
|
|
25
25
|
## Speech-act check — meta-instruction or content?
|
|
26
26
|
|
|
@@ -120,8 +120,13 @@ The following are **authoring annotations**, never halt conditions. Do
|
|
|
120
120
|
configured boundary anyway. `process-full` processes every open step
|
|
121
121
|
regardless of these annotations — see
|
|
122
122
|
[`/roadmap:process-full § Iron Law`](../../commands/roadmap/process-full.md#iron-law--full-is-full).
|
|
123
|
-
Time-boxed plate / horizon framing is
|
|
124
|
-
|
|
123
|
+
Time-boxed plate / horizon framing is opt-in via
|
|
124
|
+
`roadmap.horizon_weeks` in `.agent-settings.yml` (default `0` =
|
|
125
|
+
forbidden, per template rule 16). When `0` and encountered in legacy
|
|
126
|
+
text, treat as ordinary prose; never use it to gate execution. When
|
|
127
|
+
`> 0`, plate framing is allowed in authoring but is still **not** a
|
|
128
|
+
halt condition — phase ordering and explicit dependency gates govern
|
|
129
|
+
execution either way.
|
|
125
130
|
|
|
126
131
|
## 6. Final report and archival
|
|
127
132
|
|
|
@@ -32,6 +32,31 @@ In `auto` mode, flip to `on` for the rest of the conversation when the user expr
|
|
|
32
32
|
|
|
33
33
|
Algorithm and speech-act heuristic: [`contexts/execution/autonomy-detection.md`](../contexts/execution/autonomy-detection.md). Anchor phrases (DE+EN), no-flip patterns, counter-examples, trivial-vs-blocking taxonomy, commit-policy summary, and named failure modes: [`contexts/execution/autonomy-mechanics.md`](../contexts/execution/autonomy-mechanics.md) + [`contexts/execution/autonomy-examples.md`](../contexts/execution/autonomy-examples.md).
|
|
34
34
|
|
|
35
|
+
## Task-scope — autonomy is bound to the named task
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
A STANDING AUTONOMY DIRECTIVE TIED TO A NAMED DELIVERABLE
|
|
39
|
+
DOES NOT CARRY OVER TO A DIFFERENT, LATER DELIVERABLE.
|
|
40
|
+
NEW TASK → FRESH CONFIRMATION.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Two distinct autonomy shapes — keep them apart:
|
|
44
|
+
|
|
45
|
+
| Shape | Trigger | Scope |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| **Conversation-wide trivial-question suppression** | "stop asking on trivial steps, just work" — no deliverable named. | Sticky for the rest of the conversation. Suppresses trivial workflow questions only; never lifts blocking, Hard Floor, or [`scope-control`](scope-control.md) gates. |
|
|
48
|
+
| **Task-scoped autonomous execution** | "work autonomously on X", "arbeite die Roadmap Y komplett ab", "do PROJ-123 end-to-end" — a deliverable / artifact / ticket is named. | Bound to **that** task. Ends when the task ends. Does **not** authorize starting a new, distinct task autonomously. |
|
|
49
|
+
|
|
50
|
+
Litmus test: does the directive name (or unambiguously point to) a single concrete deliverable? Yes → task-scoped, scope ends with the deliverable. No → conversation-wide, trivial-question suppression only.
|
|
51
|
+
|
|
52
|
+
When the user later issues a **new** request — different ticket, different roadmap, different artifact, different feature — treat it as a fresh task. Re-confirm autonomy for the new scope before:
|
|
53
|
+
|
|
54
|
+
- creating a branch / worktree / PR / tag for the new work,
|
|
55
|
+
- implementing a roadmap whose **authoring** was the prior turn's deliverable (per [`scope-control § authoring vs implementation`](scope-control.md#authoring-vs-implementation--verb-discipline)),
|
|
56
|
+
- expanding scope beyond the new task's literal ask.
|
|
57
|
+
|
|
58
|
+
In doubt whether the new request inherits or needs fresh confirmation → fresh confirmation. The Hard Floor and [`scope-control`](scope-control.md) gates apply to every task regardless.
|
|
59
|
+
|
|
35
60
|
## See also
|
|
36
61
|
|
|
37
62
|
- [`non-destructive-by-default`](non-destructive-by-default.md) — universal safety floor; never overridden by autonomy
|
|
@@ -28,19 +28,28 @@ The user decides the git shape. Never improvise. Commit specifics: canonical [`c
|
|
|
28
28
|
- NEVER create / switch / delete a branch without explicit permission — includes spike, scratch, throwaway, worktree branches.
|
|
29
29
|
- NEVER create, close, reopen, or change the target of a pull request without permission.
|
|
30
30
|
- NEVER push a tag or create a release without permission.
|
|
31
|
-
- NEVER
|
|
31
|
+
- NEVER pin versions, release targets, deprecation dates, or git tags in roadmaps / plans / tickets — they plan **work**, not releases. Detail: [`scope-mechanics § Roadmap shape`](../contexts/authority/scope-mechanics.md).
|
|
32
32
|
- Task seems to need a separate branch / PR → STOP and **brief before asking** ([`scope-mechanics § Brief-before-asking`](../contexts/authority/scope-mechanics.md)).
|
|
33
33
|
- BEFORE the first commit on related work, **inventory** existing branches and open PRs. Plausible base beyond the current branch → STOP and ask with numbered options — never improvise. Commands + 4-option template + diverging-stack failure mode: [`scope-mechanics § Branch-base inventory`](../contexts/authority/scope-mechanics.md).
|
|
34
34
|
|
|
35
35
|
"Explicit permission" = user said so **this turn or in a standing instruction not yet revoked**. Earlier permission for a different operation does not carry over.
|
|
36
36
|
|
|
37
|
+
## Authoring vs. implementation
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
"CREATE / DRAFT" AUTHORIZES THE ARTIFACT, NOT ITS EXECUTION.
|
|
41
|
+
NEW TASK NEVER INHERITS PRIOR AUTONOMY.
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`create / draft / write / erstelle …` → artifact only. Execution verbs flip scope; mixed → ask. Detail: [`scope-mechanics`](../contexts/authority/scope-mechanics.md).
|
|
45
|
+
|
|
37
46
|
## Production, infrastructure, bulk-destructive — Hard Floor
|
|
38
47
|
|
|
39
48
|
A subset is **never** autonomous, regardless of standing autonomy. Canonical: [`non-destructive-by-default`](non-destructive-by-default.md). Triggers (prod-branch merges, deploys, prod data / infra, bulk-destructive) + this-turn-only clarification: [`scope-mechanics § Production, infrastructure, bulk-destructive`](../contexts/authority/scope-mechanics.md).
|
|
40
49
|
|
|
41
50
|
## Kernel-rule edits — slow-rollout guarantee
|
|
42
51
|
|
|
43
|
-
|
|
52
|
+
Own PR, ≥ 24 h between merges. Autonomous mandate does not lift — soak guarantee. CI / labels / scope: [`kernel-rule-edits`](../contexts/authority/kernel-rule-edits.md).
|
|
44
53
|
|
|
45
54
|
## Decline = silence — no re-asking on the same task
|
|
46
55
|
|
|
@@ -48,13 +57,9 @@ After the user **declines** a proposal (branch switch, PR creation, tag/release,
|
|
|
48
57
|
|
|
49
58
|
## Fenced step — user-set review gates
|
|
50
59
|
|
|
51
|
-
User explicitly fences off the next step (*"plan only"*, *"review first"*, *"don't implement yet"*, German equivalents) — reply is **deliverable + handoff**, never deliverable + *"shall we start?"*.
|
|
52
|
-
|
|
53
60
|
```
|
|
54
61
|
USER FENCED OFF EXECUTION → DELIVER + HAND BACK.
|
|
55
|
-
NO
|
|
56
|
-
NO "READY TO IMPLEMENT?" RE-ASK.
|
|
57
|
-
NO "STARTEN WIR MIT PHASE 1?" PIVOT.
|
|
62
|
+
NO "READY TO IMPLEMENT?" / "PHASE 1?" RE-ASK.
|
|
58
63
|
```
|
|
59
64
|
|
|
60
|
-
Fence stands until reopened
|
|
65
|
+
Fence (*"plan only"*, *"review first"*, German equivalents) stands until reopened — like `Decline = silence`. Follow-ups cover the deliverable, not its execution. Failure modes + bypass: [`scope-mechanics § Fenced step`](../contexts/authority/scope-mechanics.md).
|