@tenkara/afm-linux-arm64 4.0.0-alpha.7 → 4.0.0-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/bin/afm +2 -2
  2. package/content/CHANGELOG.md +50 -0
  3. package/content/PRINCIPLES.md +0 -2
  4. package/content/README-light.md +0 -2
  5. package/content/README.md +0 -2
  6. package/content/core/ach.md +0 -5
  7. package/content/core/afm.md +24 -6
  8. package/content/core/prd.md +0 -2
  9. package/content/core/protocol.md +1 -3
  10. package/content/hooks/README.md +0 -2
  11. package/content/interview/bootstrap.md +4 -2
  12. package/content/interview/promotion.md +0 -2
  13. package/content/interview/refactor.md +0 -2
  14. package/content/interview/triggers.md +0 -2
  15. package/content/modules/vireya-ui/ach.patch.md +1 -1
  16. package/content/ops/analyze.md +8 -7
  17. package/content/ops/deliver.md +23 -25
  18. package/content/ops/diagnose.md +1 -4
  19. package/content/ops/evolve.md +62 -13
  20. package/content/ops/export-template.md +1 -1
  21. package/content/ops/generalize.md +1 -4
  22. package/content/ops/policy.md +0 -2
  23. package/content/ops/reflect.md +19 -17
  24. package/content/ops/remediate.md +1 -4
  25. package/content/ops/restructure.md +3 -6
  26. package/content/ops/rule.md +0 -2
  27. package/content/ops/tasks.md +18 -18
  28. package/content/ops/update.md +29 -4
  29. package/content/ops/verify.md +0 -2
  30. package/content/questions/init.questions.yaml +13 -0
  31. package/content/roles/explorer.md +1 -1
  32. package/content/roles/reviewer.md +1 -1
  33. package/content/rubrics/failure-classification.md +0 -2
  34. package/content/rubrics/solid-triggers.md +0 -2
  35. package/content/skills/adr.md +3 -3
  36. package/content/skills/analyze.md +3 -9
  37. package/content/skills/clarify.md +2 -8
  38. package/content/skills/deliver.md +4 -20
  39. package/content/skills/diagnose.md +3 -11
  40. package/content/skills/evolve.md +6 -30
  41. package/content/skills/export-template.md +2 -5
  42. package/content/skills/generalize.md +6 -22
  43. package/content/skills/gotcha.md +3 -3
  44. package/content/skills/init.md +2 -7
  45. package/content/skills/plan.md +3 -9
  46. package/content/skills/policy.md +0 -6
  47. package/content/skills/promote.md +1 -3
  48. package/content/skills/protocol.md +2 -3
  49. package/content/skills/reconcile.md +2 -6
  50. package/content/skills/refactor.md +2 -7
  51. package/content/skills/reflect.md +7 -17
  52. package/content/skills/remediate.md +3 -9
  53. package/content/skills/restructure.md +8 -14
  54. package/content/skills/rule.md +3 -4
  55. package/content/skills/specify.md +3 -9
  56. package/content/skills/tasks.md +5 -15
  57. package/content/skills/update.md +6 -4
  58. package/content/skills/verify.md +1 -3
  59. package/content/templates/adr.template.md +1 -1
  60. package/content/templates/evolution-report.template.md +5 -2
  61. package/content/templates/feature-plan.template.md +0 -2
  62. package/content/templates/feature-research.template.md +1 -2
  63. package/content/templates/feature-spec.template.md +1 -1
  64. package/content/templates/feature-tasks.induced.template.md +58 -34
  65. package/content/templates/feature-tasks.template.md +56 -34
  66. package/content/templates/protocols/p1.md +1 -1
  67. package/content/templates/protocols/p2.md +1 -1
  68. package/content/templates/protocols/p3.md +1 -1
  69. package/package.json +1 -1
  70. package/plugin/agy/plugin.json +1 -1
  71. package/plugin/agy/skills/afm-adr/SKILL.md +7 -3
  72. package/plugin/agy/skills/afm-analyze/SKILL.md +5 -7
  73. package/plugin/agy/skills/afm-clarify/SKILL.md +4 -6
  74. package/plugin/agy/skills/afm-deliver/SKILL.md +6 -20
  75. package/plugin/agy/skills/afm-diagnose/SKILL.md +5 -9
  76. package/plugin/agy/skills/afm-evolve/SKILL.md +9 -29
  77. package/plugin/agy/skills/afm-export-template/SKILL.md +6 -5
  78. package/plugin/agy/skills/afm-generalize/SKILL.md +8 -20
  79. package/plugin/agy/skills/afm-gotcha/SKILL.md +7 -3
  80. package/plugin/agy/skills/afm-init/SKILL.md +3 -6
  81. package/plugin/agy/skills/afm-plan/SKILL.md +5 -7
  82. package/plugin/agy/skills/afm-policy/SKILL.md +2 -4
  83. package/plugin/agy/skills/afm-promote/SKILL.md +4 -2
  84. package/plugin/agy/skills/afm-protocol/SKILL.md +6 -3
  85. package/plugin/agy/skills/afm-reconcile/SKILL.md +5 -5
  86. package/plugin/agy/skills/afm-refactor/SKILL.md +3 -6
  87. package/plugin/agy/skills/afm-reflect/SKILL.md +9 -15
  88. package/plugin/agy/skills/afm-remediate/SKILL.md +5 -7
  89. package/plugin/agy/skills/afm-restructure/SKILL.md +10 -12
  90. package/plugin/agy/skills/afm-rule/SKILL.md +7 -4
  91. package/plugin/agy/skills/afm-specify/SKILL.md +5 -7
  92. package/plugin/agy/skills/afm-tasks/SKILL.md +7 -13
  93. package/plugin/agy/skills/afm-update/SKILL.md +10 -4
  94. package/plugin/agy/skills/afm-verify/SKILL.md +4 -2
  95. package/plugin/claude-code/.claude-plugin/plugin.json +1 -1
  96. package/plugin/claude-code/agents/afm-explorer.md +1 -1
  97. package/plugin/claude-code/agents/afm-reviewer.md +1 -1
  98. package/plugin/claude-code/skills/adr/SKILL.md +7 -3
  99. package/plugin/claude-code/skills/analyze/SKILL.md +5 -7
  100. package/plugin/claude-code/skills/clarify/SKILL.md +4 -6
  101. package/plugin/claude-code/skills/deliver/SKILL.md +6 -20
  102. package/plugin/claude-code/skills/diagnose/SKILL.md +5 -9
  103. package/plugin/claude-code/skills/evolve/SKILL.md +9 -29
  104. package/plugin/claude-code/skills/export-template/SKILL.md +6 -5
  105. package/plugin/claude-code/skills/generalize/SKILL.md +8 -20
  106. package/plugin/claude-code/skills/gotcha/SKILL.md +7 -3
  107. package/plugin/claude-code/skills/init/SKILL.md +3 -6
  108. package/plugin/claude-code/skills/plan/SKILL.md +5 -7
  109. package/plugin/claude-code/skills/policy/SKILL.md +2 -4
  110. package/plugin/claude-code/skills/promote/SKILL.md +4 -2
  111. package/plugin/claude-code/skills/protocol/SKILL.md +6 -3
  112. package/plugin/claude-code/skills/reconcile/SKILL.md +5 -5
  113. package/plugin/claude-code/skills/refactor/SKILL.md +3 -6
  114. package/plugin/claude-code/skills/reflect/SKILL.md +9 -15
  115. package/plugin/claude-code/skills/remediate/SKILL.md +5 -7
  116. package/plugin/claude-code/skills/restructure/SKILL.md +10 -12
  117. package/plugin/claude-code/skills/rule/SKILL.md +7 -4
  118. package/plugin/claude-code/skills/specify/SKILL.md +5 -7
  119. package/plugin/claude-code/skills/tasks/SKILL.md +7 -13
  120. package/plugin/claude-code/skills/update/SKILL.md +10 -4
  121. package/plugin/claude-code/skills/verify/SKILL.md +4 -2
  122. package/plugin/opencode/afm/index.js +245 -0
  123. package/plugin/opencode/afm/tui.js +21 -0
  124. package/plugin/opencode/agents/afm-executor.md +22 -14
  125. package/plugin/opencode/agents/afm-explorer.md +73 -28
  126. package/plugin/opencode/agents/afm-reviewer.md +73 -28
  127. package/plugin/opencode/skills/afm-adr/SKILL.md +7 -3
  128. package/plugin/opencode/skills/afm-analyze/SKILL.md +5 -7
  129. package/plugin/opencode/skills/afm-clarify/SKILL.md +4 -6
  130. package/plugin/opencode/skills/afm-deliver/SKILL.md +6 -20
  131. package/plugin/opencode/skills/afm-diagnose/SKILL.md +5 -9
  132. package/plugin/opencode/skills/afm-evolve/SKILL.md +9 -29
  133. package/plugin/opencode/skills/afm-export-template/SKILL.md +6 -5
  134. package/plugin/opencode/skills/afm-generalize/SKILL.md +8 -20
  135. package/plugin/opencode/skills/afm-gotcha/SKILL.md +7 -3
  136. package/plugin/opencode/skills/afm-init/SKILL.md +3 -6
  137. package/plugin/opencode/skills/afm-plan/SKILL.md +5 -7
  138. package/plugin/opencode/skills/afm-policy/SKILL.md +2 -4
  139. package/plugin/opencode/skills/afm-promote/SKILL.md +4 -2
  140. package/plugin/opencode/skills/afm-protocol/SKILL.md +6 -3
  141. package/plugin/opencode/skills/afm-reconcile/SKILL.md +5 -5
  142. package/plugin/opencode/skills/afm-refactor/SKILL.md +3 -6
  143. package/plugin/opencode/skills/afm-reflect/SKILL.md +9 -15
  144. package/plugin/opencode/skills/afm-remediate/SKILL.md +5 -7
  145. package/plugin/opencode/skills/afm-restructure/SKILL.md +10 -12
  146. package/plugin/opencode/skills/afm-rule/SKILL.md +7 -4
  147. package/plugin/opencode/skills/afm-specify/SKILL.md +5 -7
  148. package/plugin/opencode/skills/afm-tasks/SKILL.md +7 -13
  149. package/plugin/opencode/skills/afm-update/SKILL.md +10 -4
  150. package/plugin/opencode/skills/afm-verify/SKILL.md +4 -2
  151. package/plugin/opencode/afm.js +0 -196
@@ -4,11 +4,35 @@ description: 'Runs the self-evolution cycle: five mechanisms plus update, under
4
4
  load: warm
5
5
  writes: ["docs/evolution/*.md"]
6
6
  composes: ["diagnose", "reflect", "generalize", "restructure", "update", "remediate"]
7
+ ancestors: the Reflect→Select→Improve→Evaluate→Commit loop from Autogenesis (arXiv 2604.15034), and the Weakness-Mining→Proposal→Validation loop from Self-Harness (arXiv 2606.09498).
8
+ sections:
9
+ - heading: 'Design notes (conductor, the name, Commit κ)'
10
+ read_when: 'you ask why evolve is a conductor, or change a Commit κ step'
11
+ - heading: 'What `evolve` is NOT'
12
+ read_when: 'tempted to run evolve as an atomic mechanism, optimizer, daemon or `[TBD]` resolver'
13
+ - heading: 'Cooldown criteria'
14
+ read_when: 'you need the new-signal definition, the window or the override'
15
+ - heading: 'Phase 1 procedure'
16
+ read_when: 'starting Phase 1'
17
+ - heading: 'Proposal discipline (shared)'
18
+ read_when: 'proposing any edit, before the gate'
19
+ - heading: 'Phase 2 procedure'
20
+ read_when: 'building the package or when A3 flags version drift'
21
+ - heading: 'Phase 3 procedure'
22
+ read_when: 'presenting the package at the gate'
23
+ - heading: 'Phase 4 procedure'
24
+ read_when: 'applying an approved item or running a postcondition'
25
+ - heading: 'Phase 5 procedure'
26
+ read_when: 'writing the evolution report'
27
+ - heading: 'Whitelist — evolvable vs. protected surfaces'
28
+ read_when: 'an item edits anything but gotchas, afm.md sections 3 and 1.3, other rubrics, ADR status or the doc-map bridge'
29
+ - heading: 'Suppression contract (the honest DRY guarantee)'
30
+ read_when: 'the cycle composes another op (diagnose, reflect, rule, update, remediate and so on)'
31
+ - heading: 'Conditional anti-patterns'
32
+ read_when: 'you compose an op, fix a non-restorable reference, or downgrade, renumber or re-propose a rule or item'
7
33
  ---
8
34
  # Sub-flow: orchestrator for the AFM local documentation self-evolution cycle (`evolve`)
9
35
 
10
- > **In this file:** What `evolve` is / is not · Pre-check · Phase 1 — Evidence collection · Proposal discipline · Phase 2 — Proposal · Phase 3 — Single gate (≈ Commit κ) — always ha… · Phase 4 — Application + postconditions · Phase 5 — Record + promote · Whitelist — evolvable vs. protect… · Suppression contract · Anti-patterns
11
-
12
36
 
13
37
  > **Form** — effect: `docs/evolution/<date>-NNN` · trigger: `afm evolve`, **cadence** · precondition: `.afm-version`, cooldown 14d · composed of: — (orchestrator) · **degree of freedom: medium**
14
38
 
@@ -30,6 +54,8 @@ Triggers:
30
54
  > - **To the plugin, only RECORDS:** if a lesson applies to **any** instance (not only this project), the cycle suggests `afm promote`. That op **records the finding** with `afm findings record`, in the project state, with mechanical evidence. No one applies it to the plugin from here. The boundary is absolute (#7). The maintainer applies it, in the plugin repo.
31
55
  >
32
56
 
57
+ ### Design notes (conductor, the name, Commit κ)
58
+
33
59
  > **The name.** `evolve` is a codename (not descriptive of purpose) — chosen by the framework owner. Natural-language activation does **not** depend on the name: it lives in the skill's `when_to_use`. Renaming it is a **major** change (moves a file under `ops/` and `skills/`).
34
60
  >
35
61
  > **The `composes:` list has six entries and the cycle has five mechanisms. Both are right.**
@@ -41,8 +67,6 @@ Triggers:
41
67
  >
42
68
  > This materializes, with no new principle, the combination of invariants #2 (discover-first: diagnose with evidence before proposing), #3 (mechanize-or-downgrade: the invocation signals themselves pass the test that evolve audits in others), #6 (autonomy-first with self-check: *produce → self-check → report*, with the gate as the load-bearing residue), and #8 (earned question, recommendation-first). See [`../PRINCIPLES.md`](../PRINCIPLES.md).
43
69
  >
44
- > **Ancestors:** the Reflect→Select→Improve→Evaluate→Commit loop from Autogenesis (arXiv 2604.15034), and the Weakness-Mining→Proposal→Validation loop from Self-Harness (arXiv 2606.09498).
45
- >
46
70
  > Commit(proposal):
47
71
  > 1. ε := Evaluate(proposal) # measured, per the Autogenesis order: ε before κ
48
72
  > 2. HeldOutSet := a re-runnable set that scores ε empirically
@@ -78,6 +102,8 @@ design and not an omission:
78
102
  - The last cycle **with `mechanism: evolve`** in `docs/evolution/` is **recent** (default under 14 days). Override this with `cooldown-days=` on the `<!-- evolve: ... -->` line of `docs/.afm-version`.
79
103
  - **No new signal** appeared since then.
80
104
 
105
+ ### Cooldown criteria
106
+
81
107
  "New signal" means either:
82
108
  - (a) a delta in the `diagnose` checks (Class A/A7) since the last cycle date. Verify this with the findings of `afm doctor --json` against the date of the newest report in `docs/evolution/`, **never** with self-written content. Pass `--signal` only when that delta is real.
83
109
  - (b) the stated symptom from step 3 (`--symptom`).
@@ -90,12 +116,16 @@ design and not an omission:
90
116
 
91
117
  ## Phase 1 — Evidence collection (composes `diagnose` + `reflect`)
92
118
 
119
+ Run `diagnose` and `reflect` through the suppression contract and consolidate their bundles into one set of findings. An empty diagnosis is a valid result: report "100%" and stop. Exit: one consolidated set of findings.
120
+
121
+ ### Phase 1 procedure
122
+
93
123
  `evolve` **does not reimplement** the scan or the reflection. It runs them through the suppression contract and consolidates the bundles. This is gap-driven: the symptom from the pre-check sets the depth.
94
124
 
95
125
  0. **Capture `T0=$(date +%s)`** before any read. This is the baseline for the boundary postcondition (Phase 4.3) when the content root is not a git repo. Without it, the no-git branch has nothing to compare against.
96
126
 
97
- 1. **Run `diagnose`** (**mechanical** evidence): `afm doctor --json` for A1-A6, staleness and dead gotchas, plus the A7 paired reading, as `diagnose.md` describes (Phase 0 scan of the 7 axes, plus Phase 1 φ/addressability/severity diagnosis). It returns the evidence bundle. (Run à la carte, `diagnose` prints the bundle. Here it feeds the cycle. `diagnose` does not write `docs/evolution/` — that is Phase 5.)
98
- 2. **Run `reflect`** (**behavioral** evidence). Follow `reflect.md` §§ 1-2 (collect the φ_b signatures seen in the session, plus the self-check "was it me, not the doc"). Suppress `reflect`'s own gate — it moves to the single gate. With no friction in the session, the behavioral axis stays empty. That is a valid result.
127
+ 1. **Run `diagnose`** (**mechanical** evidence): `afm doctor --json` for A1-A6, staleness and dead gotchas, plus the A7 paired reading, the `tier-drift` axis (docs and sections whose `load:` tier no longer matches their use) and the `fade` axis (cold orphan docs with no use), as `diagnose.md` describes (Phase 0 scan of the 7 axes, plus Phase 1 φ/addressability/severity diagnosis). It returns the evidence bundle. (Run à la carte, `diagnose` prints the bundle. Here it feeds the cycle. `diagnose` does not write `docs/evolution/` — that is Phase 5.)
128
+ 2. **Run `reflect`** (**behavioral** evidence). Follow `reflect.md` §§ 1-2 (collect the φ_b signatures seen in the live session and in the project's sessions since the last evolve cycle, from `afm sessions --since evolve --json` and `afm sessions signals --since evolve --json`, plus the self-check "was it me, not the doc"), with the same weighting: the live session counts on one signal, a past-session signal only when it repeats across 2 or more sessions, is an explicit correction, or is `regressed` (and `regressed` first); a `repeatedPrompt` signal is a first-class finding (see `reflect.md` Pre-check 3). The evolve report also carries `resolves:` with the fingerprints the cycle handled, and every session record covered gets `reflection:` filled. Suppress `reflect`'s own gate — it moves to the single gate. With no friction in the whole window, the behavioral axis stays empty. That is a valid result.
99
129
  3. **On-demand proposal mechanisms** (through suppression, own gate suppressed, gap-driven — with no signal, they do not run):
100
130
  - `diagnose` axis A3 flags **version drift** (pinned instance ≠ plugin `VERSION`). This composes `update` — a delta-by-delta migration proposal for consumer-facing changes (see Phase 2.2).
101
131
  - `diagnose` axis A6 flags **2 or more redundant gotchas** → composes `generalize` (merge proposal).
@@ -106,7 +136,7 @@ design and not an omission:
106
136
  This is the cycle's "self-reflection on failures". `diagnose`/rule 19 **flag** the unfixed repeat failure. The cycle **resolves** it at the gate. `remediate`'s own gate is suppressed — it moves to the single gate. This is gated by #5 (negative filters — a transient failure does not get promoted).
107
137
 
108
138
  3.5. **Guardrail axis — what is still caught by hand, and should be caught by a command**. This axis joins two sources that no one cross-checks today:
109
- - the **guardrail candidates** from `reflect § 1.2` — a defect the agent fixed by hand 2 or more times in the session.
139
+ - the **guardrail candidates** from `reflect § 1.2` — a defect the agent fixed by hand 2 or more times in the window (`--since evolve`).
110
140
  - the failures of `afm failures promotable` that the rubric classified as **mechanizable** — a precedence destination.
111
141
 
112
142
  For each one, run the **surface discovery** from `remediate.md` step 3.5. Look at the linter, type check, CI, or git hooks the project **already** runs. Propose where the check should land.
@@ -179,7 +209,11 @@ For each **addressable** finding, before it reaches the gate:
179
209
 
180
210
  ## Phase 2 — Proposal (IMPROVER role, in staging)
181
211
 
182
- Apply the **Proposal discipline (shared)** above to each consolidated finding from Phase 1. The mechanisms that already propose changes (`reflect`/`generalize`/`restructure`) bring their proposals ready — they already passed the discipline. `evolve` adds the proposals for the purely mechanical `diagnose` findings — downgrade, archive, merge. This is the logic that **originates here**. `evolve` consolidates everything into one package.
212
+ Apply the proposal discipline to each finding from Phase 1; the package asks at most 8 (b) questions per cycle. Exit: one consolidated package.
213
+
214
+ ### Phase 2 procedure
215
+
216
+ Apply the **Proposal discipline (shared)** (the section of this file with that title) to each consolidated finding from Phase 1. The mechanisms that already propose changes (`reflect`/`generalize`/`restructure`) bring their proposals ready — they already passed the discipline. `evolve` adds the proposals for the purely mechanical `diagnose` findings — downgrade, archive, merge. This is the logic that **originates here**. `evolve` consolidates everything into one package.
183
217
 
184
218
  1. **Package cap:** the cap counts **only (b) questions**. It is measured **per cycle** (8 (b) questions total, maximum). `afm evolve gate-check --critical <n> --high <n> --medium <n> --low <n>` computes it: it prints how many to ask now, in how many calls (for example `2 calls (4+4)`), and how many to stage. Present them in **at most 2 calls of at most 4 questions each** (NEVER more than 4 in one call). One **(b) item equals one `multiSelect` option** (including the A2 stance question and the A3 migration). Listed **(a) items do not use a slot**. They are seen, not asked — the user confirms the batch at the same gate.
185
219
  - **5 to 8 (b) items are NOT an "overflow"**. They fit in up to 2 calls (4 plus the rest). Staging is required only **above 8**.
@@ -195,6 +229,10 @@ Apply the **Proposal discipline (shared)** above to each consolidated finding fr
195
229
 
196
230
  ## Phase 3 — Single gate (≈ Commit κ) — **always happens, never skippable**
197
231
 
232
+ The single gate always opens, even for an (a)-only package. Each (b) item is its own `afm ask evolve` scope, never a monolithic approve. Exit: a recorded decision per item.
233
+
234
+ ### Phase 3 procedure
235
+
198
236
  `evolve` **requires a gate under every protocol**. It is a first-class exception alongside the bright lines ([`core/protocol.md`](../core/protocol.md) § 4), not the absence of a flag.
199
237
 
200
238
  The safety valve that makes "go" safe in `deliver` **does not exist here**. That valve halts on the first task that depends on an assumption. There is no execution phase in `evolve`. The doc edit *is* the effect. There is no future boundary where the human would catch drift. So the gate cannot be skipped.
@@ -214,6 +252,10 @@ Even a package with **only (a) items** opens the gate. The ceremony cost is the
214
252
 
215
253
  ## Phase 4 — Application + postconditions (≈ Commit κ applied)
216
254
 
255
+ Apply the approved items through the suppression contract, then run the two mechanical postconditions: step 4.2 (parseable format) and step 4.3 (the instance/plugin boundary). A format break rolls the edit back and is reported. Any dirt in the plugin content root means rollback plus a CRITICAL report. Exit: applied edits with both postconditions green.
256
+
257
+ ### Phase 4 procedure
258
+
217
259
  1. **Apply** the (a) items and the approved (b) items, through the **suppression contract**:
218
260
  - A rule edit follows `rule.md`.
219
261
  - A gotcha follows `gotcha.md`.
@@ -245,6 +287,10 @@ Even a package with **only (a) items** opens the gate. The ceremony cost is the
245
287
 
246
288
  ## Phase 5 — Record + promote (auditable lineage)
247
289
 
290
+ Write `docs/evolution/<date>-NNN.md` with `mechanism: evolve`, keep the rejected and reverted items, suggest `afm promote` for a finding that generalizes, and hand off to `reconcile`. Exit: the closed report.
291
+
292
+ ### Phase 5 procedure
293
+
248
294
  1. **Materialize or close** `<consumer>/docs/evolution/<date>-NNN.md` (`afm next-id evolution` prints the free NNN), with `afm new evolution-report --mechanism <...>` (fix findings with `afm lint --fix`). Include the φ findings (mechanical and behavioral), the buckets, and the audit records. Include the **rejected AND approved-then-reverted items** too — the attempt memory for future cycles. Include the before/after vital signs, and the date (`afm evolve gate-check` reads it for the cooldown). This is the Self-Harness h₀→h₁ lineage.
249
295
  2. **Does it generalize?** If a finding applies to any instance ("every pre-rc.5 instance has this drift"), **suggest** `afm promote`. Never skip its own gate (#7) — `evolve` only suggests.
250
296
  3. **Hand off to `reconcile`** to watch the effect of the changes in later sessions. This is AFM's possible form of "re-run". With no held-out set, real validation is observed future behavior.
@@ -301,17 +347,20 @@ Even a package with **only (a) items** opens the gate. The ceremony cost is the
301
347
  ## Anti-patterns
302
348
 
303
349
  - ❌ **Running by ritual or calendar** — it runs by signal. A cycle with no new signal gets a cooldown refusal (Autogenesis: an adaptive trigger beats a fixed budget).
304
- - ❌ **Reimplementing the scan or the reflection** — `evolve` composes `diagnose`/`reflect` through suppression. It does not duplicate their procedure.
305
350
  - ❌ **Treating an empty diagnosis as a failure** — a healthy instance means the cycle reports "100%" and stops. It never invents a problem to justify the invocation.
306
- - ❌ **Inventing the target for a non-restorable fix**. Examples: a dead reference with no proven rename, an ADR with no NNNN target, a trigger with no historical path. These go to the gate as options — archive, redirect, recreate. Never guess a path or ADR (#5).
307
351
  - ❌ **Classifying a trigger/hook-path edit as (a)** — it is always (b). This is the agent reducing its own oversight.
308
352
  - ❌ **Skipping the gate** — there is no "go" in `evolve`. Even a package with only (a) items opens the gate.
309
353
  - ❌ **A monolithic plan-approve** — the gate is item by item, one `afm ask evolve` scope per (b) item (the edits are independent).
310
- - ❌ **Downgrading a rule because it was violated** — a violation does not mean the rule is wrong. Downgrading needs proof the rule is *wrong* (a false positive, impossible to satisfy, or an intent proven obsolete by git). Consider "the agent was non-compliant" as the rival explanation first.
311
354
  - ❌ **Deleting** — archive it instead, with a tombstone. Deletion is a bright line and gets its own gate item. A superseded ADR, a dead gotcha, or an old marker stay institutional memory until the human says otherwise.
312
- - ❌ **Renumbering a rule** — a removed one becomes `*(removed — lives in §X)*`.
313
355
  - ❌ **Materializing after the gate what the gate did not see**. ADRs and edits must be itemized in Phase 3, or they do not happen.
314
356
  - ❌ **Editing the bundled content** — the Phase 4.3 boundary postcondition (two branches) catches this. Any dirt means rollback plus CRITICAL. A generalization is **recorded** through `promote`, never applied from here (#7).
315
- - ❌ **Re-proposing a rejected or reverted item with no new evidence**. Attempt memory, plus the per-surface flip-flop flag, catch this.
316
357
  - ❌ **Resolving `[TBD]` alone**. Age is a signal to ask if the stance still holds. It is not a reason to invent an answer (#4/#5).
358
+
359
+ ### Conditional anti-patterns
360
+
361
+ - ❌ **Reimplementing the scan or the reflection** — `evolve` composes `diagnose`/`reflect` through suppression. It does not duplicate their procedure.
362
+ - ❌ **Inventing the target for a non-restorable fix**. Examples: a dead reference with no proven rename, an ADR with no NNNN target, a trigger with no historical path. These go to the gate as options — archive, redirect, recreate. Never guess a path or ADR (#5).
363
+ - ❌ **Downgrading a rule because it was violated** — a violation does not mean the rule is wrong. Downgrading needs proof the rule is *wrong* (a false positive, impossible to satisfy, or an intent proven obsolete by git). Consider "the agent was non-compliant" as the rival explanation first.
364
+ - ❌ **Renumbering a rule** — a removed one becomes `*(removed — lives in §X)*`.
365
+ - ❌ **Re-proposing a rejected or reverted item with no new evidence**. Attempt memory, plus the per-surface flip-flop flag, catch this.
317
366
  - ❌ **Composing `reflect.md` past § 2 in Phase 1.2**. Reading further would reach the § 5 escalation step and let `reflect` propose `afm evolve` from inside the very cycle running it. The recursion guard depends on Phase 1.2 stopping at §§ 1-2 — see `§ Suppression contract`.
@@ -62,7 +62,7 @@ what to keep, the task-template induction and the final confirmation.
62
62
  the selection.
63
63
  5. **Induce a task template before `features/` goes (AWM, from a green trajectory).** Run this step only
64
64
  when the dry run lists `docs/features/`. Take the **most recent** `docs/features/NNN-*/tasks.md` with
65
- **ALL tasks `- [X]`**: it passed its own test, and never induce from incomplete work. The dry run
65
+ **ALL tasks `done: true`** in its `tasks:` list, and never induce from incomplete work. The dry run
66
66
  names the feature, or says there is none, in which case skip the step. Turn concrete values into named
67
67
  variables (product, entity, procedure, domain become `{product-name}`, `{entity}`,
68
68
  `{boundary-procedure}`, `{domain}`), following `afm path templates/feature-tasks.induced.template`, and
@@ -4,11 +4,10 @@ description: Merges several gotchas that repeat into one abstract rule.
4
4
  load: warm
5
5
  writes: ["docs/gotchas/*.md", "docs/rules/*.md", "docs/afm.md", "docs/evolution/*.md"]
6
6
  composes: []
7
+ ancestors: the *MetaReflect* step of MetaReflection (arXiv 2405.13009).
7
8
  ---
8
9
  # Sub-flow: semantic consolidation of gotchas into an abstract rule (`generalize`)
9
10
 
10
- > **In this file:** What `generalize` is / is not · Pre-check · 1. Identify the batch (clustering, ≥2) · 2. MetaReflect: propose the abstract rule (follow the shared discipline) · 3. ShowsImprovement + backtracking (validation before the gate) · 4. Own gate (à la carte) — suppressed under `evolve` · 5. Registration + handoff · Suppression contract (back-pointer) · Anti-patterns
11
-
12
11
  > **Form** — effect: rule + tombstones · trigger: `afm generalize`, composition · precondition: ≥2 similar gotchas · composed by: `evolve` 1.3 · **degree of freedom: medium**
13
12
 
14
13
  Triggers: `afm generalize`. Also natural-language **consolidation** requests. Examples: "these gotchas are all the same thing", "merge these rules". Also: "this became a pattern — generalize it", "I have 3 gotchas that say the same thing".
@@ -17,8 +16,6 @@ Triggers: `afm generalize`. Also natural-language **consolidation** requests. Ex
17
16
  >
18
17
  > **Mechanism, not conductor.** `generalize` is the mechanism-skill that **merges a batch of similar gotchas/reflections into one abstract rule** (episodic memory → semantic memory). It runs **à la carte** (its own gate) OR inside the `evolve` cycle (which composes it when `diagnose` flags inflation from redundant gotchas, and its own gate is suppressed).
19
18
  >
20
- > **Ancestor:** the *MetaReflect* step of MetaReflection (arXiv 2405.13009).
21
- >
22
19
  > Generalize(gotchas, batch):
23
20
  > 1. read the current gotchas and the batch # |batch| >= 2
24
21
  > 2. emit one abstract rule that covers the batch — ADD it, and MERGE the batch into tombstones
@@ -7,8 +7,6 @@ composes: []
7
7
  ---
8
8
  # Sub-flow: report the organisation policy (`policy`)
9
9
 
10
- > **In this file:** What policy is / is not · Procedure · What it must never do · Invariants
11
-
12
10
  > **Form** — effect: a report in chat, no file written · trigger: `afm policy` · precondition: `.afm-version` · **degree of freedom: low**
13
11
 
14
12
  Triggers: `afm policy`. Also natural language about the organisation layer. Examples: "what does the
@@ -1,14 +1,13 @@
1
1
  ---
2
2
  type: op
3
- description: Refines a doc that guided the agent wrong, using evidence from the session itself, and proposes the full cycle when that evidence outgrows one doc.
3
+ description: Refines a doc that guided the agent wrong, using evidence from the live session and the project's sessions since the last cycle, and proposes the full cycle when that evidence outgrows one doc.
4
4
  load: warm
5
5
  writes: ["docs/evolution/*.md"]
6
6
  composes: []
7
+ ancestors: the *Reflect* operator from Autogenesis (arXiv 2604.15034 — execution traces build causal hypotheses of failure), composed with the *MetaReflect* step of MetaReflection (arXiv 2405.13009 — self-reflection on failure is **episodic memory**).
7
8
  ---
8
9
  # Sub-flow: behavioral self-reflection on the docs (`reflect`)
9
10
 
10
- > **In this file:** What reflect is / is not · Pre-check · 1. Behavioral evidence collection · 2. Self-critique: doc-wrong vs agent-non-conforman… · 3. Proposal: make the doc more assertive + s… · 4. Own gate (à-la-carte) — suppressed und… · 5. Record + session closing + handoff · Suppression contract · Anti-patterns
11
-
12
11
 
13
12
  > **Form** — effect: edits + `evolution/<date>-NNN` + `sessions/<...>` + candidates for `guardrails/` · trigger: `afm reflect`, composition, **cadence** · precondition: friction lived in the session · composed by: `evolve` 1.2, `deliver` 4.D · proposes: `afm evolve` (§ 5, à-la-carte only) · **degree of freedom: medium**
14
13
 
@@ -18,8 +17,6 @@ Triggers: `afm reflect`. Also natural language about a **doc that guided badly**
18
17
  >
19
18
  > **Mechanism, not conductor.** `reflect` is one of the mechanism skills in the self-evolution cycle. `evolve` is the orchestrator that composes it. `reflect` runs **à-la-carte** (this doc, with its own gate). Or it runs inside the `evolve` cycle, which suppresses the own gate and consolidates results — see `evolve.md § Suppression contract`.
20
19
  >
21
- > **Ancestors:** the *Reflect* operator from Autogenesis (arXiv 2604.15034 — execution traces build causal hypotheses of failure), composed with the *MetaReflect* step of MetaReflection (arXiv 2405.13009 — self-reflection on failure is **episodic memory**).
22
- >
23
20
  > Reflect(session_trace) -> φ_b:
24
21
  > 1. scan session_trace for a point where a core doc guided the agent badly
25
22
  > 2. φ_b := (symptom-lived, causal-status-of-the-doc, mechanism)
@@ -41,7 +38,7 @@ Triggers: `afm reflect`. Also natural language about a **doc that guided badly**
41
38
 
42
39
  Examples: an ambiguous rule applied wrong, a doc that misled, a section that did not guide. Also a contradiction lived in practice, or the user correcting the agent against the doc.
43
40
 
44
- The evidence is **the session's trajectory** — the agent stumbled. It is not the static artifact. It produces **(a)** proposals to make the doc **more assertive and clear**. This refines what already exists. It also produces **(b)** suggestions for the human in the loop.
41
+ The evidence is **the trajectory of the live session plus the project's sessions since the last cycle** — the agent stumbled. It is not the static artifact. It produces **(a)** proposals to make the doc **more assertive and clear**. This refines what already exists. It also produces **(b)** suggestions for the human in the loop.
45
42
 
46
43
  **It is NOT:**
47
44
  - `reconcile` (code→docs, **additive**: the agent learns a new fact, then proposes a new gotcha or rule). `reflect` is **docs→docs refinement**: an existing doc guided badly, so it proposes making that doc assertive. *It never adds knowledge. It only improves the instructiveness of what is already there.*
@@ -56,7 +53,11 @@ The evidence is **the session's trajectory** — the agent stumbled. It is not t
56
53
 
57
54
  1. **Does `<consumer>/docs/.afm-version` exist?** If not, stop. Suggest `afm init` or `afm refactor` first.
58
55
  2. **Does `afm preflight` exit 0?** A non-zero exit says why: the docs are not bootstrapped, the bundled content does not resolve, or the pin does not match. Report it to the user. Do not fall back silently.
59
- 3. **Capture the events lived in this session.** The `reflect` trigger is in-session — see `interview/triggers.md`. Note which core docs the agent read or followed, and where they guided badly. With no lived event this session, and no clear symptom, stop: there is no reflection to do. Report "no doc friction observed in this session", then **record the outcome**: run `afm cadence close --arm reflect --reason "no doc friction observed"`. That writes the durable record that resets the cadence counter, so the same task and deliverable counts do not block the next Stop again. Then end. Reflection with no behavioral evidence is the agent inventing a disease. Rule #5 forbids this.
56
+ 3. **Capture the events lived in the evidence window: the live session plus the project's sessions since the last cycle.** The `reflect` trigger is in-session — see `interview/triggers.md` — but the evidence is wider. Run `afm sessions --since reflect --json` (it lists the project's sessions in every supported harness; `source` is `record`, `harness` or `both`) (pass the live session id with `--exclude <id>`) for the window, then `afm sessions signals --since reflect --json` for its deterministic signals: user turns, with a `correction` flag set by a fixed marker list, tool-error groups, AFM injection sizes and repeated reads. The signals are a heuristic that points at friction. You judge them. The command skips sessions whose record already names a `reflection:` (pass `--include-covered` to read them again), groups tool errors by tool and command, carries the repeated prompt rituals of the last 30 days under `repeatedPrompts` (`--repeat-window <N>d`; `--scope user` clusters them across every project of the user, listing the projects of each cluster), and gives every signal a `fingerprint` and a `status`: `new`, `resolved` (an evolution report listed its fingerprint in `resolves:`) or `regressed` (the signal recurs after that report, so the earlier fix did not hold).
57
+ - **Weight.** The live session is read directly, so one signal there is enough evidence. A signal from a past session counts only when it repeats across 2 or more sessions, is an explicit correction, or is `regressed`. A `resolved` signal is not a finding.
58
+ - **Order.** Take the `regressed` signals first: each one says an earlier fix did not hold, so revisit that report's change before proposing a new one.
59
+ - **Repeated prompts.** A `repeatedPrompt` signal is a first-class finding: the user types the same thing again and again. Propose the artifact that stops the retyping (a procedure, a preset in a skill, an op step, or a config default), citing the cluster sample and its sessions. A cluster that carries `suggests: procedure` (the `[runbook?]` marker in text mode) is a run of operational verbs, so propose it as an `afm new procedure` in the project where it repeats, with the steps in the order the user asks them.
60
+ - **Read-only bound.** Open a raw transcript only when a signal needs context, and read only the turns around its `ts`. Note which core docs the agent read or followed, and where they guided badly. With no lived event in the window, no signal, and no clear symptom, stop: there is no reflection to do. Report "no doc friction observed in the window", then **record the outcome**: run `afm cadence close --arm reflect --reason "no doc friction observed"`. That writes the durable record that resets the cadence counter, so the same task and deliverable counts do not block the next Stop again. Then end. Reflection with no behavioral evidence is the agent inventing a disease. Rule #5 forbids this.
60
61
 
61
62
  > **If the operator would rather skip the reflection**, run `afm cadence skip --session <id> --reason "<text>"` (the id is the one the Stop message gives; `--session` is required). It records the skip as debt in the state store and does not reset the counter. Never edit the session store by hand.
62
63
 
@@ -64,21 +65,21 @@ The evidence is **the session's trajectory** — the agent stumbled. It is not t
64
65
 
65
66
  ## 1. Behavioral evidence collection (≈ *Reflect* — traces → hypotheses)
66
67
 
67
- Core docs include `afm.md`, `ach.md`, `prd.md`, `ust.md`, the rules under `rules/`, the gotchas under `gotchas/`, and the rubrics. Find each point this session where a core doc guided badly. Record a **behavioral signature** for it: `φ_b = (symptom-lived, causal-status-of-the-doc, mechanism)`.
68
+ Core docs include `afm.md`, `ach.md`, `prd.md`, `ust.md`, the rules under `rules/`, the gotchas under `gotchas/`, and the rubrics. Find each point in the window (the live session and the signals of the earlier sessions) where a core doc guided badly. Record a **behavioral signature** for it: `φ_b = (symptom-lived, causal-status-of-the-doc, mechanism)`.
68
69
 
69
70
  - *symptom-lived* — what happened, with an anchor. Example one: the agent applied rule N of `afm.md § 3` wrong, and had to re-read it twice. The user then corrected the agent against it, in `<file>`. Example two: the agent followed `ach.md § 3.1`, and the part it named no longer existed. Example three: two docs gave opposite guidance on the same task.
70
71
  - *causal-status-of-the-doc* — was **the doc** causally implicated? This slot is the *causal status*, not "who is to blame."
71
72
  - *mechanism* — **why** the doc produced the stumble. Options include an ambiguous rule that reads two ways, or a rule with no executable trigger. Such a rule fails a 0/1 check. Other options: an outdated example, guidance buried where nobody finds it, or a contradiction with another doc.
72
73
 
73
- **Golden rule:** every signature cites **the doc passage** (`file:section`). It also cites **the session event** — what the agent did, or what the user said. Without both sides, it is not evidence. It is only an impression.
74
+ **Golden rule:** every signature cites **the doc passage** (`file:section`). It also cites **the session event** as `session:<id>@<ts>` — what the agent did, or what the user said. The id and the timestamp come from the live session or from a signal of `afm sessions signals`. Without both sides, it is not evidence. It is only an impression.
74
75
 
75
76
  ### 1.2 — The second sweep: what I corrected by hand more than once
76
77
 
77
- Beyond a doc that guided badly, `reflect` sweeps the session for **an error caught by non-mechanical review, and that came back**. Look for the same defect type fixed in two places. Or an ad-hoc `grep` run again, or a review repeated because no command did it for the agent.
78
+ Beyond a doc that guided badly, `reflect` sweeps the window for **an error caught by non-mechanical review, and that came back**. Look for the same defect type fixed in two places. Or an ad-hoc `grep` run again, or a review repeated because no command did it for the agent.
78
79
 
79
- Each occurrence becomes a **guardrail candidate**: `(the defect, how many times this session, how the agent caught it by hand)`. The promotion gate is the rubric's, from `rubrics/failure-classification.md`. It needs 2 or more occurrences, or one explicit user correction.
80
+ Each occurrence becomes a **guardrail candidate**: `(the defect, how many times in the window, how the agent caught it by hand)`. The promotion gate is the rubric's, from `rubrics/failure-classification.md`. It needs 2 or more occurrences, counted across the sessions of the window, or one explicit user correction.
80
81
 
81
- > **Why this lives in `reflect`, and not only in `remediate`.** `remediate` consumes the failure events of the state store (`afm failures promotable`). Those only record a failure recognized by a **terminal external signal** — a red test, a nonzero `tsc` result, a nonzero command result. An error the agent caught itself, while reading the diff, **never reaches those events**. It gets fixed before it becomes a signal. This is the most expensive class of error. Its cost is the agent's own context, invisible on the ledger. `reflect` is the only point in the cycle that sees it, because its evidence is the lived trajectory alone.
82
+ > **Why this lives in `reflect`, and not only in `remediate`.** `remediate` consumes the failure events of the state store (`afm failures promotable`). Those only record a failure recognized by a **terminal external signal** — a red test, a nonzero `tsc` result, a nonzero command result. An error the agent caught itself, while reading the diff, **never reaches those events**. It gets fixed before it becomes a signal. This is the most expensive class of error. Its cost is the agent's own context, invisible on the ledger. `reflect` is the only point in the cycle that sees it, because its evidence is the lived trajectory alone, across the project's sessions of the window.
82
83
 
83
84
  Before proposing a candidate, run the same **surface discovery** as `ops/remediate.md` step 3.5. Check the linter, type-check, CI, and any git hooks the project already has. A candidate with no surface to land on stays an observation. It does not become a proposal.
84
85
 
@@ -110,8 +111,8 @@ For each addressable finding, follow the **shared proposal discipline** of the e
110
111
  - **Add the executable trigger** that was missing. A rule with no `*Verification:*` 0/1 gains a trigger, or moves down to § 1.3 as a principle (rule #3).
111
112
  - Disambiguate a contradiction, or itemize an ADR for it.
112
113
  - Move buried guidance, or point to it from a clearer spot.
113
- - **(c) Guardrail candidate** (from § 1.2) — the defect the agent corrected by hand 2 or more times this session. State the existing surface where the check would land and the estimated cost. This goes to the gate as an **installation proposal**. Installing writes outside `docs/`, so it is always bucket (b). It never auto-applies, and if approved, it materializes `docs/guardrails/<slug>.md` with `afm new guardrail`, with the mandatory `## What would refute this`. Then propose the config edit to the operator.
114
- - **(b) Suggestion for the human** — for friction a text edit cannot fix, but that is still a real signal. Examples: "rule N cost you 3 corrections this session. Worth rethinking the approach, not just the text." Or: "that old `[NEEDS CLARIFICATION:]` keeps blocking every session. Do you want to decide?" This goes to the report as a recommendation. It is not an edit.
114
+ - **(c) Guardrail candidate** (from § 1.2) — the defect the agent corrected by hand 2 or more times in the window. State the existing surface where the check would land and the estimated cost. This goes to the gate as an **installation proposal**. Installing writes outside `docs/`, so it is always bucket (b). It never auto-applies, and if approved, it materializes `docs/guardrails/<slug>.md` with `afm new guardrail`, with the mandatory `## What would refute this`. Then propose the config edit to the operator.
115
+ - **(b) Suggestion for the human** — for friction a text edit cannot fix, but that is still a real signal. Examples: "rule N cost you 3 corrections in the window. Worth rethinking the approach, not just the text." Or: "that old `[NEEDS CLARIFICATION:]` keeps blocking every session. Do you want to decide?" This goes to the report as a recommendation. It is not an edit.
115
116
 
116
117
  An edit can touch a `*Verification:*` command in `afm.md § 3`. Or it can touch a path the hooks parse, like a gotcha's `trigger_path` key. Either edit is **always bucket (b), load-bearing**. It never auto-applies, for the same reason as `evolve`: narrowing your own oversight carries more weight than convenience.
117
118
 
@@ -131,7 +132,7 @@ After approval, apply the change through the writing ops — `rule.md` or `gotch
131
132
 
132
133
  ## 5. Record + session closing + handoff
133
134
 
134
- 1. **Materialize or append** the reflection bundle in `<consumer>/docs/evolution/<date>-NNN.md`. Create it with `afm new evolution-report --mechanism reflect` (fix findings with `afm lint --fix`). Include the φ_b signatures, and what got self-critiqued as "it was me" (anti-oscillation memory). Also include the refinements approved or rejected, and the suggestions for the human. À-la-carte, `reflect` generates or closes this report on its own. Under `evolve`, it feeds the cycle's report instead.
135
+ 1. **Materialize or append** the reflection bundle in `<consumer>/docs/evolution/<date>-NNN.md`. Create it with `afm new evolution-report --mechanism reflect` (fix findings with `afm lint --fix`). Include the φ_b signatures (each with its `session:<id>@<ts>` cite), list in `resolves:` the fingerprints of the signals this cycle handled (an applied or approved refinement; the next window reads it to tell `resolved` from `regressed`), and what got self-critiqued as "it was me" (anti-oscillation memory). Also include the refinements approved or rejected, and the suggestions for the human. À-la-carte, `reflect` generates or closes this report on its own. Under `evolve`, it feeds the cycle's report instead.
135
136
 
136
137
  > **The report name is `YYYY-MM-DD-NNN.md` and its frontmatter MUST carry `mechanism: reflect`.**
137
138
  > Three mechanisms write into `docs/evolution/`, and each one's cadence window is "since MY last
@@ -146,7 +147,7 @@ After approval, apply the change through the writing ops — `rule.md` or `gotch
146
147
  - **`## what was asked`** — the agent's own reading of the user's request, including where that reading changed mid-session. This is not a transcript. It is the interpretation that guided the work.
147
148
  - **`## how it was executed`** — how AFM was used: which ops ran, which rules fired, and where the harness helped. Also note where it got in the way. This is the data no other artifact has. Git records what changed, not how the agent used the method.
148
149
  - **`## afm_findings`** — what generalizes to the plugin, in the format of `ops/promote.md` step 4, with `evidence:`. An explicit empty result is a valid result.
149
- - **`reflection:`** — the link to the `docs/evolution/<date>-NNN` file from step 1. This field replaces a `docs_findings` field. What `reflect` found **and fixed** in the local docs already lives there. Duplicating it would be the inflation `reflect` itself forbids.
150
+ - **`reflection:`** — the link to the `docs/evolution/<date>-NNN` file from step 1. Fill it for **every session record the window covered**, not only the live one, with `afm sessions mark <id…> --reflection docs/evolution/<file>.md` (never by editing the store; a covered record is skipped by the next `afm sessions signals`), so the next window starts after them. This field replaces a `docs_findings` field. What `reflect` found **and fixed** in the local docs already lives there. Duplicating it would be the inflation `reflect` itself forbids.
150
151
 
151
152
  **No session with real work means no record**, because the hook writes nothing. In that case, this step is a no-op. It is not a reason to create one. The handoff block (`state:`, `open_questions`, `next_steps`) stays episodic. `state: consumed` marks **the handoff** as read, not the record itself as dead. See `rubrics/episodic-vs-semantic-boundary.md` for this dual-tier rule.
152
153
  2. **Does it generalize?** If the friction fits any instance, record it through `afm promote`. For example, every instance might share the same ambiguous rule. Attach evidence. Never apply it directly (rule #7). The destination is the `afm_findings` field of the session record from step 1.5. It is the same place, not two.
@@ -167,7 +168,7 @@ There, the signal is the task's own test or `tsc` result. The "re-run" is litera
167
168
 
168
169
  ## Anti-patterns
169
170
 
170
- - ❌ **Reflecting with no lived event** — for example "this rule seems ambiguous" with no actual stumble this session. That is an impression, not evidence (rule #5). No friction observed: report "no friction", run `afm cadence close --arm reflect --reason "no doc friction observed"` and stop.
171
+ - ❌ **Reflecting with no lived event** — for example "this rule seems ambiguous" with no actual stumble in the window. That is an impression, not evidence (rule #5). No friction observed: report "no friction" only when the whole window has no signal, then run `afm cadence close --arm reflect --reason "no doc friction observed"` and stop.
171
172
  - ❌ **Weakening a rule that embarrassed me**. A violated rule is not a wrong rule. The "it was me" hypothesis is mandatory, and it kills the refinement whenever the doc was clear.
172
173
  - ❌ **Adding new knowledge** — that is the job of `reconcile`, `gotcha`, or `rule`. `reflect` only refines the instructiveness of what already exists. Output (c) is not an exception. It converts repeated manual analysis into a check. It adds no new knowledge, because the knowledge was already in the manual correction.
173
174
  - ❌ **Proposing a guardrail from a single occurrence**. The same rubric gate applies here: 2 or more times, or one user correction. A gate born from a single case becomes a dead constraint (rule #5).
@@ -176,5 +177,6 @@ There, the signal is the task's own test or `tsc` result. The "re-run" is litera
176
177
  - ❌ **Editing the bundled content** — absolute boundary #7. Generalization gets **recorded** through `promote`. It never gets applied. See the boundary postcondition in `evolve.md § Phase 4.3`.
177
178
  - ❌ **Transcribing the session** in the session record — the transcript already exists, and `session_ref` (harness and id) points to it. The two timeline sections hold **interpretation** — what the agent understood, how it used AFM — not a log. Transcribing adds inflation and a reading cost.
178
179
  - ❌ **Pasting a credential into the narrative**. Quoting the command run is the common leak path. Write the command with the secret redacted. Hard rule 13 covers it.
180
+ - ❌ **Reading a raw transcript when the signals suffice**, or **quoting text that did not pass the redaction**. `afm sessions signals` already extracts and redacts what the cycle needs. A raw read costs context and risks a secret. Quote only signal text. If a signal is not enough, say so in the report instead of opening the transcript.
179
181
  - ❌ **Confusing this with `diagnose`** — `reflect` does not run the static 7-axis scan. Its evidence is behavioral. For the mechanical sweep of the instance, use `afm diagnose` instead.
180
182
  - ❌ **Reaching § 5 step 3 while running under `evolve`** — the recursion guard. `evolve` Phase 1.2 composes only `reflect.md §§ 1-2`. The escalation step is scoped out of that composition on purpose. Escalating from inside the cycle that is already running `reflect` would be `reflect` calling back into its own caller.
@@ -4,11 +4,10 @@ description: Turns a failure that repeats into a durable artifact, recognized by
4
4
  load: warm
5
5
  writes: ["docs/procedures/*.md", "docs/learnings/*.md", "docs/guardrails/*.md"]
6
6
  composes: []
7
+ ancestors: "CRITIC (arXiv 2305.11738) — failure recognition is anchored in an **external tool or signal**. Self-critique with no tool degrades (PRINCIPLES #3). This op complements the short in-task loop in `afm.md § 5.1` (ephemeral Reflexion, cap 2). `remediate` is the **long loop**: when a failure crosses the § 5.1 terminal (non-transient) and recurs, it becomes a **durable** remediation."
7
8
  ---
8
9
  # Sub-flow: remediation of a recognized failure (`remediate`) — CRITIC loop
9
10
 
10
- > **In this file:** What `remediate` is / is not · Pre-check · Procedure · Composition (suppression contract) · Anti-patterns
11
-
12
11
  > **Form** — effect: `guardrails/`, `procedures/`, or `learnings/` · trigger: `afm remediate`, composition · precondition: a failure in the state store that `afm failures promotable` lists · composed by: `evolve` 1.3, `reconcile` · **degree of freedom: medium**
13
12
 
14
13
  Triggers: `afm remediate`.
@@ -23,8 +22,6 @@ Example phrases:
23
22
  > **Installing a guardrail uses one procedure.** When the rubric classifies the failure as *mechanizable* and the target is `docs/guardrails/`, follow [`rule.md` § Install the gate](./rule.md) — it covers discovery of the surface the project already runs, the runner built from [`../templates/guardrail-runner.template.md`](../templates/guardrail-runner.template.md), **measuring HEAD before turning the gate on** (a gate that starts red gets turned off the next day), measured cost, doc-runner sync, and recording with `origin: recurring-failure`. This op does not repeat those steps (rule 34): the origin differs, but the install path is the same.
24
23
 
25
24
  > **Target = this project's local docs (`<consumer>/docs/`), never the plugin.** Like every AFM write family, `remediate` writes to `<consumer>/docs/` (guardrails/procedures/learnings) and **proposes** — the human approves (#6). No op writes to the plugin: `afm promote` only records a finding for it.
26
- >
27
- > **Ancestor:** CRITIC (arXiv 2305.11738) — failure recognition is anchored in an **external tool or signal**. Self-critique with no tool degrades (PRINCIPLES #3). This op complements the short in-task loop in `afm.md § 5.1` (ephemeral Reflexion, cap 2). `remediate` is the **long loop**: when a failure crosses the § 5.1 terminal (non-transient) and recurs, it becomes a **durable** remediation.
28
25
 
29
26
  ---
30
27
 
@@ -4,11 +4,10 @@ description: Checks the health of the context architecture and finds what went s
4
4
  load: warm
5
5
  writes: ["docs/evolution/*.md"]
6
6
  composes: []
7
+ ancestors: Codified-Context (arXiv 2602.20478).
7
8
  ---
8
9
  # Sub-flow: context architecture health (`restructure`)
9
10
 
10
- > **In this file:** What restructure is / is not · Pre-check · 1. Staleness scan · 2. Findability · 3. Partition by temperature · 4. Own gate (a-la-carte) + application — s… · 5. Record + handoff · Suppression contract · Anti-patterns
11
-
12
11
 
13
12
  > **Form** — effect: edits + opt-in ADR · trigger: `afm restructure`, composition · pre-condition: git + `bites`/`last_bite` · composed by: `evolve` 1.3 · **degree of freedom: medium**
14
13
 
@@ -18,8 +17,6 @@ Triggers: `afm restructure`, or natural language about **structure/staleness** (
18
17
  >
19
18
  > **Mechanism, not conductor.** `restructure` is the mechanism skill that checks whether the docs are **structured to load efficiently** and **keep pace with the code**. It runs **a-la-carte** (own gate) OR inside the `evolve` cycle (which composes it when `diagnose` flags staleness or a badly partitioned doc — the own gate is then suppressed).
20
19
  >
21
- > **Ancestor:** Codified-Context (arXiv 2602.20478).
22
- >
23
20
  > CodifiedContext(doc, path):
24
21
  > 1. Tier(content) := its memory temperature: hot-always (every turn) | per-task | on-demand (deep reference)
25
22
  > 2. GitEvidence(claim) := a `git log` comparison that confirms or refutes claim # PRINCIPLES.md #2
@@ -43,7 +40,7 @@ Triggers: `afm restructure`, or natural language about **structure/staleness** (
43
40
  1. **Staleness** — a doc references code that changed. The doc was not updated.
44
41
  2. **Findability** — guidance exists but sits in the wrong layer or place. Retrieval failed even though the content was present.
45
42
  3. **Partition by temperature** — what is always-read vs. deep on-demand reference. This is an opt-in loading-strategy proposal.
46
- 4. **Dead-gotcha pruning** — a gotcha whose last-bite date is old and whose count has stopped. A dry incidence is a tombstone candidate.
43
+ 4. **Dead-gotcha pruning** — a gotcha whose last-bite date is old and whose count has stopped. A dry incidence is a tombstone candidate. The `fade` axis of `afm doctor` generalizes this: a cold orphan doc with no inject, read or edit in the window and no recent bite is a tombstone candidate too.
47
44
 
48
45
  **It is not:**
49
46
  - `diagnose` axis A1 (**dead reference** = the path does not exist). `restructure` staleness means the path **still exists but changed** while the doc did not. The two do not overlap.
@@ -97,7 +94,7 @@ Apply this only when a doc has **actually grown too large** (a `diagnose` A6 sig
97
94
 
98
95
  - Propose a **loading strategy** mark. *Hot-always* content is needed every turn — conventions, commands, § 3 rules. *On-demand* content is deep subsystem reference. It becomes an appendix, read only when needed. The paper's split is hot / per-task / on-demand.
99
96
  - The change is **an ADR proposal** (a doc architecture decision), **not** an automatic cut. Moving content to an on-demand appendix keeps 100% of the content (only re-partitions it) and follows the minimal-change discipline.
100
- - **Opt-in:** without a real inflated doc, **do not propose** tiering. Small docs do not need it (YAGNI), and forced tiering is ceremony. This is the only `restructure` axis that can have zero findings in a healthy instance.
97
+ - **Opt-in:** without a real inflated doc, **do not propose** tiering. Small docs do not need it (YAGNI), and forced tiering is ceremony. This is the only `restructure` axis that can have zero findings in a healthy instance. The evidence for a tier change is the `tier-drift` axis of `afm doctor` (a cold doc used often, an idle hot or warm doc, an on-demand section read in most runs of its op). It stays a proposal at the gate: nothing changes `load:` on its own.
101
98
 
102
99
  ---
103
100
 
@@ -7,8 +7,6 @@ composes: []
7
7
  ---
8
8
  # Sub-flow: new hard rule
9
9
 
10
- > **In this file:** Procedure · Install the gate · Inalienable rule · Additional for a refactored project
11
-
12
10
  > **Form** — effect: one file under `docs/rules/` plus its index line in `afm.md § 3` (or a principle in `§ 1.3`) · trigger: `afm rule`, composition · precondition: executable 0/1 trigger · composed by: `evolve`, `reflect`, `generalize` · **degree of freedom: low**
13
11
 
14
12
  Triggers: `afm rule`, or natural language ("new hard rule", "this should be a rule").
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  type: op
3
- description: Breaks a plan into tasks in TDD order, each one a cycle of the loop.
3
+ description: Breaks a plan into the tasks list of tasks.md in TDD order, added with afm task add.
4
4
  load: warm
5
5
  writes: ["docs/features/*/tasks.md"]
6
6
  composes: []
@@ -31,37 +31,37 @@ Procedure:
31
31
 
32
32
  3. **Read `spec.md` and `plan.md`** in full, for the feature.
33
33
 
34
- 4. **Make the tasks** with `afm new feature-tasks --feature NNN-slug --description "..."` (it writes the frontmatter and the template body), then fill the body:
35
- - **Phase 1 — Setup:** empty files with a signature and the test fixtures. Typically `[P]` (parallel with each other).
36
- - **Phase 2 — Foundation:** for each Gherkin scenario of spec § 3, at least two tasks: a RED test task and a GREEN implementation task. REFACTOR becomes its own task when it adds expected clarity.
37
- - **Phase 3 — Boundary:** for each new component of plan § 2, one creation task and one test task. For each boundary of plan § 5, one Zod validation task (rule 16) and one procedure task.
38
- - **Phase 4 — Reconciliation (8.5):** fixed tasks. Update `ach.md § 3` if a component is new. Add an ADR (`afm adr new <slug>`, see [`adr.md`](adr.md)) if the work materializes an architectural decision. Set the US status to `done`. **The last task** sets the `status:` frontmatter key of `spec.md`, `plan.md` and `tasks.md` to `done` (or `cancelled` for a feature dropped; hard rule 39). No body line carries the status. It must be last: those edits change the hashed documents, so the delivery approval (`afm approve --check`) goes stale by design and nothing may run after it.
34
+ 4. **Make the tasks.** Create the file with `afm new feature-tasks --feature NNN-slug --description "..."` (it writes the frontmatter and the template body), then add every task with `afm task add <NNN>`. The tasks live in the frontmatter `tasks:` list, never as a checklist in the body. The CLI assigns the id, validates the item and refuses one that breaks a rule `afm feature lint` grades (exit 1, the findings printed); you fill only the fields. The body is free prose (phases, notes). Build the list in this order:
35
+ - **Setup:** empty files with a signature and the test fixtures: `--kind setup --files <paths> --refs <US/RF> --text "..."`, typically `--parallel`.
36
+ - **Foundation:** for each Gherkin scenario `N` of spec § 3, a red task (`--kind red --scenario N --files <test path>`), then the green task that closes it (`--kind green --closes <the red's id> --files <code path>`). A refactor (`--kind refactor`) follows a green or another refactor, when it adds expected clarity.
37
+ - **Boundary:** each new component of plan § 2 is in the `--files` of one task, with the exact path of the plan cell. For each boundary of plan § 5 (`### Boundary <name>`), a red task and the green task with the Zod validation (rule 16), added with `--validates <name>`: the lint matches the boundary by that field, never by the task text.
38
+ - **Reconciliation (8.5):** one task, `--kind reconcile`, always the last (`afm task add` keeps it last, and reopens it when a task lands after it was done): update `ach.md § 3` if a component is new, add an ADR (`afm adr new <slug>`, see [`adr.md`](adr.md)) if the work materializes an architectural decision, set the US status to `done`, and set the `status:` frontmatter key of `spec.md`, `plan.md` and `tasks.md` to `done` (or `cancelled` for a feature dropped; hard rule 39). No body line carries the status. It is last because those edits change the hashed documents, so the delivery approval (`afm approve --check`) goes stale by design and nothing may run after it. `afm task done` refuses it while another task is open, a green while its red is open, and a refactor while the task before it is open.
39
39
 
40
- 5. **Mark `[P]`** where a task has no dependency on the task immediately before it. Heuristic:
41
- - Fixture tasks, tasks that touch different test files and doc tasks are typically `[P]`.
42
- - A GREEN task always depends on the RED task immediately before it: never `[P]`.
43
- - A REFACTOR task depends on its GREEN task: never `[P]`.
40
+ 5. **Mark `--parallel`** where a task has no dependency on the task immediately before it. Heuristic:
41
+ - Fixture tasks, tasks that touch different test files and doc tasks are typically parallel.
42
+ - A green task depends on the red task it closes: never parallel.
43
+ - A refactor depends on its green task: never parallel.
44
44
 
45
- 6. **Every task references `US-NNN` or `RF-NN`.** The rule is `core/afm.md` § 2, step 7 COMMIT: a commit references a US or RF. If the feature has no linked US, fail earlier, at the pre-check.
45
+ 6. **Every task references `US-NNN` or `RF-NN`** (`--refs`; the CLI refuses a task without one, except the reconcile task). The rule is `core/afm.md` § 2, step 7 COMMIT: a commit references a US or RF. If the feature has no linked US, fail earlier, at the pre-check.
46
46
 
47
- 7. **Mechanical validation before you report** (auto-correct, do not ask). Run `afm feature lint <NNN>`. It checks the structure of `tasks.md` (task lines present, a RED before each GREEN, a US or RF on every task, scenario and component coverage) and exits 1 on CRITICAL or HIGH. For a task without a reference, **add the US linked in the `spec.md` header** at the end of the task: a deterministic fix, no question. Re-run until the exit is 0. Step 6 is the declarative rule; this step is the safety net for an attention lapse.
47
+ 7. **Mechanical validation before you report** (auto-correct, do not ask). Run `afm feature lint <NNN>`. It reads the `tasks:` list and checks: each spec scenario has a red task with its number and a later green that closes it, a green closes an earlier red (CRITICAL), a refactor follows a green or a refactor, no green or refactor is parallel, each new plan component is in the `files` of a task, each plan boundary has a task whose `validates` is its name, there is exactly one reconcile task and it is last, every `US-NNN` exists in `ust.md` and every `RF-NN` in `prd.md`, and no checklist line is left in the body. It exits 1 on CRITICAL or HIGH. Fix a finding with `afm task add` (a missing task), `afm task set <NNN> <Txxx> [--kind] [--text] [--files] [--refs] [--scenario] [--closes] [--validates] [--parallel|--no-parallel] [--clear <field>]` (the field the finding names; `--clear scenario|closes|validates|files|refs` clears one), or `afm task remove <NNN> <Txxx>` (a task that should not exist; refused while a green closes it), then re-run until the exit is 0. `afm task set` and `afm task remove` run the same rules as `afm task add` and write only the lines they change; a new `--kind` brings its own needs (a green `--closes`, a red `--scenario`). Step 6 is the declarative rule; this step is the safety net for an attention lapse.
48
48
 
49
49
  8. **Materialize and report** (#6, see [`../PRINCIPLES.md`](../PRINCIPLES.md)): `tasks.md` is written by step 4; print the summary (step 9) with the path. Review happens through `git diff`; no blocking question.
50
50
 
51
- **Check the frontmatter the template's `frontmatter_for_output:` names** (hard rule 39): `type: feature-tasks`, `description`, `load: cold`, and `for_paths`/`us`/`rf` carried from `plan.md`, unchanged, and `status: planned`. `status` moves to `in_progress` with the first task and to `done` only in the last Reconciliation task (step 4), never earlier.
51
+ **Check the frontmatter the template's `frontmatter_for_output:` names** (hard rule 39): `type: feature-tasks`, `description`, `load: cold`, and `for_paths`/`us`/`rf` carried from `plan.md`, unchanged, `status: planned`, and the `tasks:` list. `status` moves to `in_progress` with the first task and to `done` only in the reconcile task (step 4), never earlier.
52
52
 
53
53
  9. **Output to the operator:**
54
54
  - The path of `tasks.md`.
55
- - The summary `N tasks total / M parallelizable ([P]) / 4 phases`.
55
+ - The summary `N tasks total / M parallel / red, green, refactor and reconcile counts`.
56
56
  - The `[TBD]` markers still in the plan (a flag, not a block).
57
- - **Next step:** "Before you start T001, consider `afm analyze` to cross-check coverage between scenarios, tasks and hard rules. It is a read-only report in chat, a safety net and not a gate. After that, each task is one cycle of `core/afm.md` § 2: start with T001. When a task is done, mark it with `afm task done <NNN> <Txxx>`."
57
+ - **Next step:** "Before you start T001, consider `afm analyze` to cross-check coverage between scenarios, tasks and hard rules. It is a read-only report in chat, a safety net and not a gate. After that, run the tasks in list order: a red task, the green task that closes it, an optional refactor (`core/afm.md` § 2). When a task is done, close it with `afm task done <NNN> <Txxx>`."
58
58
 
59
59
  ## Anti-patterns
60
60
 
61
- - ❌ Skip RED. This violates rule 1 (TDD).
61
+ - ❌ Skip the red task. This violates rule 1 (TDD).
62
62
  - ❌ Create a task with no US or RF reference.
63
63
  - ❌ Write a subjective task ("clean up code", "improve naming") with no mechanical criterion.
64
- - ❌ Mark `[P]` on a GREEN task that depends on the RED task immediately before it.
64
+ - ❌ Mark a green task `--parallel`: it depends on the red task it closes.
65
65
  - ❌ Block with a question before writing. Materialize and report; review through `git diff`.
66
66
  - ❌ Tolerate an open `[NEEDS CLARIFICATION:]` in the plan. The block is hard: a mechanical refusal, not a question.
67
- - ❌ Tick a box by hand-editing `tasks.md` during execution. `afm task done` marks it atomically.
67
+ - ❌ Write a task as a checklist line in the body, or edit the `tasks:` list by hand. `afm task add` adds a task, `afm task set` corrects one (its kind included), `afm task remove` drops one and `afm task done` closes it, atomically. When the CLI cannot write an edit it prints `held:` and a `task:` line with its verify; follow that task.
@@ -7,8 +7,6 @@ composes: []
7
7
  ---
8
8
  # Sub-flow: sync of the materialized instance with the current plugin version (`update`)
9
9
 
10
- > **In this file:** What update is / is not · Procedure · What the codemods can do · Instances older than 4.0 · 1.6 Language migration · Opt-in deltas · Post-conditions · Suppression contract · Anti-patterns
11
-
12
10
  > **Form** — effect: deltas in the instance + bump · trigger: `afm update`, composition · precondition: pin ≠ the shipped version · composed by: `evolve` 2.2 · **degree of freedom: low**
13
11
 
14
12
  Triggers: `afm update`, or natural language for **version bump / sync with the plugin**. Examples:
@@ -161,9 +159,36 @@ noticing during the work, and that is the branch that damages a product.
161
159
  scope empty, and the rest is unchanged. `afm lang` reports the language each file is written in.
162
160
  4. **Ask ONE question about the artifacts: `afm ask update-artifacts`** (questions in
163
161
  `content/questions/update-artifacts.questions.yaml`). Ask it once, never per file. `Keep the current language` records the choice, because the next update must not ask again.
162
+ Record the answer with `afm config set language.artifacts <tag>` (for example `pt-BR`). The command
163
+ validates the tag and edits `.afm/config.toml` in place. Never write that key by hand. A language agent task the
164
+ update prints (`artifact-language:*`) names the exact command; run it, then its 0/1 check.
164
165
  5. **On migrate, fan out over the artifacts outside the excluded scope**: the local `docs/`, the code
165
- comments, the test names. Each file gets a rewrite. Then an adversarial check asks what fact, number,
166
- path, marker or caveat disappeared. The checker reports; it never rewrites.
166
+ comments, the test names. Each file gets a rewrite of its language and writing style. Then an
167
+ adversarial check asks what fact, number, path, marker or caveat disappeared. The checker reports; it
168
+ never rewrites.
169
+
170
+ **Run the fan-out as one orchestrated batch, never file by file in the main session.** A file-by-file
171
+ rewrite in the session context spends the capable model on mechanical volume and fills the context
172
+ with text it reads once. Use the orchestration primitive of the harness: a workflow script (an
173
+ ultracode run, where the harness has one) or, failing that, its batch of parallel subagents. Build
174
+ the file list from step 3 BEFORE the batch starts, and pass it to the batch as data. A file the list does not name is never touched.
175
+
176
+ **The model tier follows the task tier** (`afm.md` § 1, the fan-out principle). Translation and
177
+ style rewrite under a fixed contract is mechanical, high-volume work:
178
+ - **Rewrite: the light tier** (a Haiku-class model, Haiku 5.5 today). Set the model on each
179
+ agent call, never once for the whole run. Give each agent a chunk of files, not one file, so the
180
+ concurrency stays inside `MAX_PARALLEL_SUBAGENTS`.
181
+ - **Check: the light tier too.** Its contract is a comparison, not a judgment: list the facts,
182
+ numbers, paths, markers (`[TBD]`, `[NEEDS CLARIFICATION:]`), code spans and caveats of the original,
183
+ and report each one the rewrite lost. Escalate ONLY a file the check flags to a capable model, for
184
+ one more rewrite of that file.
185
+ - **The orchestrator keeps the judgment**: the excluded scope, the final gate and the report to the
186
+ operator. Those stay on the session model.
187
+
188
+ Each rewrite brief carries the same contract: translate the prose, keep every code span, path,
189
+ identifier, frontmatter key and marker byte for byte, keep the headings structure, and never shorten
190
+ (hard rule 17). After the batch, `afm lang` reports the language of each file: a file still in the
191
+ old language goes back into the batch once, then to the operator.
167
192
  6. **Never touch the excluded scope.** Not the UI strings, not the user-facing error messages, not the
168
193
  email copy, not the seed data a user reads. An ambiguous file stays.
169
194
 
@@ -7,8 +7,6 @@ composes: []
7
7
  ---
8
8
  # Sub-flow: stamp a human verification (`verify`)
9
9
 
10
- > **In this file:** What verify is / is not · Why only a human · Procedure · What it must never do · Invariants
11
-
12
10
  > **Form** — effect: adds `verified:` to the frontmatter of one file · trigger: `afm verify <path>` · precondition: `.afm-version` · **degree of freedom: low**
13
11
 
14
12
  Triggers: `afm verify <path>`. Also natural language that states a person checked a document.
@@ -26,3 +26,16 @@ questions:
26
26
  description: User-facing strings are in Spanish.
27
27
  - label: Decide later
28
28
  description: Records [TBD] in the PRD; the language migration stops and asks.
29
+ - id: artifact-language
30
+ prompt: In which language are the artifacts of this project written (docs, code comments, test names)?
31
+ header: Artifacts
32
+ recommended: en
33
+ options:
34
+ - label: en
35
+ description: English, the default. Nothing is recorded.
36
+ - label: pt-BR
37
+ description: Recorded with afm config set language.artifacts pt-BR; the gate skips the English-prose rules.
38
+ - label: es
39
+ description: Recorded with afm config set language.artifacts es; the gate skips the English-prose rules.
40
+ - label: other
41
+ description: Another tag. Init prints the command to run with the tag the owner names.