@tenkara/afm-linux-arm64 0.0.0-stage → 4.0.0-alpha.11
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/bin/afm +4 -0
- package/content/.coupling-baseline.tsv +1 -0
- package/content/.pending-commands.txt +2 -0
- package/content/CHANGELOG-archive.md +806 -0
- package/content/CHANGELOG.md +4330 -0
- package/content/PRINCIPLES.md +119 -0
- package/content/README-light.md +158 -0
- package/content/README.md +150 -0
- package/content/code-style/_any/file-size.md +62 -0
- package/content/code-style/_any/imports.md +68 -0
- package/content/code-style/_any/naming.md +72 -0
- package/content/code-style/_any/test-placement.md +57 -0
- package/content/code-style/nextjs-app-router/imports.md +50 -0
- package/content/code-style/nextjs-app-router/naming.md +50 -0
- package/content/code-style/prisma-postgres/error-boundary.md +55 -0
- package/content/code-style/prisma-postgres/imports.md +61 -0
- package/content/code-style/shadcn-ui/naming.md +48 -0
- package/content/code-style/stripe-billing/naming.md +76 -0
- package/content/code-style/trigger-dev-v4/imports.md +58 -0
- package/content/code-style/trigger-dev-v4/naming.md +49 -0
- package/content/code-style/trigger-dev-v4/test-placement.md +61 -0
- package/content/code-style/trpc-v11/error-boundary.md +51 -0
- package/content/code-style/trpc-v11/file-size.md +44 -0
- package/content/code-style/trpc-v11/naming.md +60 -0
- package/content/code-style/trpc-v11/test-placement.md +52 -0
- package/content/core/ach.md +260 -0
- package/content/core/afm.md +514 -0
- package/content/core/gotchas.md +18 -0
- package/content/core/prd.md +141 -0
- package/content/core/protocol.md +158 -0
- package/content/core/ust.md +65 -0
- package/content/guardrails/README.md +55 -0
- package/content/guardrails/dsl-com-ordem-obrigatoria.md +47 -0
- package/content/guardrails/exaustividade-de-union.md +48 -0
- package/content/guardrails/fronteira-de-import.md +57 -0
- package/content/hooks/README.md +70 -0
- package/content/interview/bootstrap.md +417 -0
- package/content/interview/promotion.md +115 -0
- package/content/interview/refactor.md +379 -0
- package/content/interview/triggers.md +107 -0
- package/content/modules/nextjs-app-router/ach.patch.md +44 -0
- package/content/modules/nextjs-app-router/gotchas.seed.md +78 -0
- package/content/modules/nextjs-app-router/rules.patch.md +35 -0
- package/content/modules/prisma-postgres/ach.patch.md +65 -0
- package/content/modules/prisma-postgres/rules.patch.md +28 -0
- package/content/modules/shadcn-ui/ach.patch.md +42 -0
- package/content/modules/stripe-billing/ach.patch.md +46 -0
- package/content/modules/stripe-billing/gotchas.seed.md +73 -0
- package/content/modules/stripe-billing/rules.patch.md +30 -0
- package/content/modules/trigger-dev-v4/ach.patch.md +64 -0
- package/content/modules/trigger-dev-v4/gotchas.seed.md +53 -0
- package/content/modules/trigger-dev-v4/rules.patch.md +35 -0
- package/content/modules/trpc-v11/ach.patch.md +56 -0
- package/content/modules/trpc-v11/rules.patch.md +34 -0
- package/content/modules/vireya-ui/ach.patch.md +85 -0
- package/content/modules/vireya-ui/gotchas.seed.md +98 -0
- package/content/modules/vireya-ui/rules.patch.md +36 -0
- package/content/ops/adr.md +54 -0
- package/content/ops/analyze.md +130 -0
- package/content/ops/clarify.md +86 -0
- package/content/ops/deliver.md +209 -0
- package/content/ops/diagnose.md +143 -0
- package/content/ops/evolve.md +366 -0
- package/content/ops/export-template.md +97 -0
- package/content/ops/generalize.md +117 -0
- package/content/ops/gotcha.md +46 -0
- package/content/ops/obligations.md +145 -0
- package/content/ops/plan.md +61 -0
- package/content/ops/policy.md +61 -0
- package/content/ops/promote.md +72 -0
- package/content/ops/protocol.md +51 -0
- package/content/ops/reconcile.md +44 -0
- package/content/ops/reflect.md +182 -0
- package/content/ops/remediate.md +143 -0
- package/content/ops/restructure.md +142 -0
- package/content/ops/rule.md +170 -0
- package/content/ops/specify.md +62 -0
- package/content/ops/tasks.md +67 -0
- package/content/ops/update.md +252 -0
- package/content/ops/verify.md +67 -0
- package/content/patterns/adapter.md +46 -0
- package/content/patterns/facade.md +47 -0
- package/content/patterns/factory.md +46 -0
- package/content/patterns/null-object.md +55 -0
- package/content/patterns/result-vs-exception.md +52 -0
- package/content/patterns/strategy.md +45 -0
- package/content/patterns/template-method-vs-composition.md +50 -0
- package/content/questions/adr.questions.yaml +14 -0
- package/content/questions/analyze.questions.yaml +12 -0
- package/content/questions/bootstrap-mapping.questions.yaml +14 -0
- package/content/questions/bootstrap-rules.questions.yaml +10 -0
- package/content/questions/bootstrap-stack.questions.yaml +23 -0
- package/content/questions/clarify.questions.yaml +10 -0
- package/content/questions/code-style.questions.yaml +12 -0
- package/content/questions/confirm.questions.yaml +12 -0
- package/content/questions/deliver.questions.yaml +23 -0
- package/content/questions/evolve.questions.yaml +15 -0
- package/content/questions/export-template-apply.questions.yaml +11 -0
- package/content/questions/export-template.questions.yaml +23 -0
- package/content/questions/gates.questions.yaml +27 -0
- package/content/questions/generalize.questions.yaml +13 -0
- package/content/questions/gotcha.questions.yaml +11 -0
- package/content/questions/init-template.questions.yaml +10 -0
- package/content/questions/init.questions.yaml +41 -0
- package/content/questions/obligations.questions.yaml +17 -0
- package/content/questions/plan.questions.yaml +14 -0
- package/content/questions/refactor.questions.yaml +23 -0
- package/content/questions/reflect.questions.yaml +13 -0
- package/content/questions/remediate.questions.yaml +27 -0
- package/content/questions/restructure.questions.yaml +15 -0
- package/content/questions/rf-mapping.questions.yaml +12 -0
- package/content/questions/rule-scope.questions.yaml +12 -0
- package/content/questions/rule.questions.yaml +12 -0
- package/content/questions/specify.questions.yaml +23 -0
- package/content/questions/update-artifacts.questions.yaml +10 -0
- package/content/questions/update-strings.questions.yaml +14 -0
- package/content/questions/update.questions.yaml +10 -0
- package/content/questions/verify.questions.yaml +9 -0
- package/content/roles/executor.md +18 -0
- package/content/roles/explorer.md +22 -0
- package/content/roles/reviewer.md +23 -0
- package/content/rubrics/enum-vs-union-vs-branded.md +40 -0
- package/content/rubrics/episodic-vs-semantic-boundary.md +37 -0
- package/content/rubrics/error-classification.md +98 -0
- package/content/rubrics/failure-classification.md +111 -0
- package/content/rubrics/negative-filters.md +38 -0
- package/content/rubrics/solid-triggers.md +119 -0
- package/content/rubrics/template-vs-streaming-precedence.md +34 -0
- package/content/rubrics/validation-boundary.md +94 -0
- package/content/rubrics/when-to-create-dsl.md +65 -0
- package/content/rubrics/when-to-create-lib.md +49 -0
- package/content/rubrics/when-to-create-module.md +39 -0
- package/content/rubrics/when-to-evolve-methodology.md +62 -0
- package/content/skills/adr.md +42 -0
- package/content/skills/analyze.md +28 -0
- package/content/skills/clarify.md +28 -0
- package/content/skills/deliver.md +26 -0
- package/content/skills/diagnose.md +42 -0
- package/content/skills/evolve.md +43 -0
- package/content/skills/export-template.md +37 -0
- package/content/skills/generalize.md +31 -0
- package/content/skills/gotcha.md +40 -0
- package/content/skills/init.md +77 -0
- package/content/skills/obligations.md +27 -0
- package/content/skills/plan.md +28 -0
- package/content/skills/policy.md +25 -0
- package/content/skills/promote.md +39 -0
- package/content/skills/protocol.md +41 -0
- package/content/skills/reconcile.md +45 -0
- package/content/skills/refactor.md +79 -0
- package/content/skills/reflect.md +43 -0
- package/content/skills/remediate.md +33 -0
- package/content/skills/restructure.md +46 -0
- package/content/skills/rule.md +43 -0
- package/content/skills/specify.md +28 -0
- package/content/skills/tasks.md +24 -0
- package/content/skills/update.md +58 -0
- package/content/skills/verify.md +29 -0
- package/content/templates/adr.template.md +51 -0
- package/content/templates/evolution-report.template.md +132 -0
- package/content/templates/feature-plan.template.md +84 -0
- package/content/templates/feature-research.template.md +56 -0
- package/content/templates/feature-spec.template.md +86 -0
- package/content/templates/feature-tasks.induced.template.md +91 -0
- package/content/templates/feature-tasks.template.md +82 -0
- package/content/templates/focus.template.md +30 -0
- package/content/templates/gotcha.template.md +31 -0
- package/content/templates/guardrail-runner.template.md +97 -0
- package/content/templates/guardrail.template.md +63 -0
- package/content/templates/learning.template.md +40 -0
- package/content/templates/procedure.template.md +47 -0
- package/content/templates/protocols/p1.md +29 -0
- package/content/templates/protocols/p2.md +28 -0
- package/content/templates/protocols/p3.md +47 -0
- package/content/templates/research.template.md +50 -0
- package/content/templates/session-handoff.template.md +58 -0
- package/content/templates/us.template.md +39 -0
- package/content/tools/gate/core-rules/PLUGIN-13-secrets.sh +36 -0
- package/content/tools/gate/core-rules/PLUGIN-21-code-language.sh +27 -0
- package/content/tools/gate/core-rules/PLUGIN-35-gate-complete.sh +19 -0
- package/content/tools/gate/core-rules/PLUGIN-36-absolute-path.sh +38 -0
- package/content/tools/gate/core-rules/PLUGIN-37-prose-language.sh +56 -0
- package/content/tools/gate/core-rules/PLUGIN-38-parser-marker.sh +82 -0
- package/content/tools/gate/core-rules/PLUGIN-39-frontmatter-ops.sh +325 -0
- package/content/tools/gate/core-rules/PLUGIN-40-dead-reference.sh +74 -0
- package/content/tools/gate/core-rules/README.md +55 -0
- package/content/tools/gate/guardrails.sh +740 -0
- package/content/tools/gate/lib/ratchet.sh +119 -0
- package/content/tools/gate/lib/scope.sh +85 -0
- package/content/tools/gate/ratchet.seed.tsv +1 -0
- package/content/tools/gate/rules/README.md +50 -0
- package/package.json +19 -5
- package/plugin/agy/hooks.json +29 -0
- package/plugin/agy/mcp_config.json +7 -0
- package/plugin/agy/plugin.json +6 -0
- package/plugin/agy/skills/afm-adr/SKILL.md +48 -0
- package/plugin/agy/skills/afm-analyze/SKILL.md +34 -0
- package/plugin/agy/skills/afm-clarify/SKILL.md +34 -0
- package/plugin/agy/skills/afm-deliver/SKILL.md +30 -0
- package/plugin/agy/skills/afm-diagnose/SKILL.md +46 -0
- package/plugin/agy/skills/afm-evolve/SKILL.md +49 -0
- package/plugin/agy/skills/afm-export-template/SKILL.md +43 -0
- package/plugin/agy/skills/afm-generalize/SKILL.md +37 -0
- package/plugin/agy/skills/afm-gotcha/SKILL.md +46 -0
- package/plugin/agy/skills/afm-init/SKILL.md +81 -0
- package/plugin/agy/skills/afm-obligations/SKILL.md +31 -0
- package/plugin/agy/skills/afm-plan/SKILL.md +34 -0
- package/plugin/agy/skills/afm-policy/SKILL.md +29 -0
- package/plugin/agy/skills/afm-promote/SKILL.md +43 -0
- package/plugin/agy/skills/afm-protocol/SKILL.md +45 -0
- package/plugin/agy/skills/afm-reconcile/SKILL.md +49 -0
- package/plugin/agy/skills/afm-refactor/SKILL.md +83 -0
- package/plugin/agy/skills/afm-reflect/SKILL.md +49 -0
- package/plugin/agy/skills/afm-remediate/SKILL.md +39 -0
- package/plugin/agy/skills/afm-restructure/SKILL.md +52 -0
- package/plugin/agy/skills/afm-rule/SKILL.md +49 -0
- package/plugin/agy/skills/afm-specify/SKILL.md +34 -0
- package/plugin/agy/skills/afm-tasks/SKILL.md +28 -0
- package/plugin/agy/skills/afm-update/SKILL.md +64 -0
- package/plugin/agy/skills/afm-verify/SKILL.md +35 -0
- package/plugin/claude-code/.claude-plugin/marketplace.json +15 -0
- package/plugin/claude-code/.claude-plugin/plugin.json +9 -0
- package/plugin/claude-code/.mcp.json +7 -0
- package/plugin/claude-code/agents/afm-executor.md +18 -0
- package/plugin/claude-code/agents/afm-explorer.md +20 -0
- package/plugin/claude-code/agents/afm-reviewer.md +21 -0
- package/plugin/claude-code/hooks/hooks.json +85 -0
- package/plugin/claude-code/skills/adr/SKILL.md +48 -0
- package/plugin/claude-code/skills/analyze/SKILL.md +34 -0
- package/plugin/claude-code/skills/clarify/SKILL.md +34 -0
- package/plugin/claude-code/skills/deliver/SKILL.md +30 -0
- package/plugin/claude-code/skills/diagnose/SKILL.md +46 -0
- package/plugin/claude-code/skills/evolve/SKILL.md +49 -0
- package/plugin/claude-code/skills/export-template/SKILL.md +43 -0
- package/plugin/claude-code/skills/generalize/SKILL.md +37 -0
- package/plugin/claude-code/skills/gotcha/SKILL.md +46 -0
- package/plugin/claude-code/skills/init/SKILL.md +81 -0
- package/plugin/claude-code/skills/obligations/SKILL.md +31 -0
- package/plugin/claude-code/skills/plan/SKILL.md +34 -0
- package/plugin/claude-code/skills/policy/SKILL.md +29 -0
- package/plugin/claude-code/skills/promote/SKILL.md +43 -0
- package/plugin/claude-code/skills/protocol/SKILL.md +45 -0
- package/plugin/claude-code/skills/reconcile/SKILL.md +49 -0
- package/plugin/claude-code/skills/refactor/SKILL.md +83 -0
- package/plugin/claude-code/skills/reflect/SKILL.md +49 -0
- package/plugin/claude-code/skills/remediate/SKILL.md +39 -0
- package/plugin/claude-code/skills/restructure/SKILL.md +52 -0
- package/plugin/claude-code/skills/rule/SKILL.md +49 -0
- package/plugin/claude-code/skills/specify/SKILL.md +34 -0
- package/plugin/claude-code/skills/tasks/SKILL.md +28 -0
- package/plugin/claude-code/skills/update/SKILL.md +64 -0
- package/plugin/claude-code/skills/verify/SKILL.md +35 -0
- package/plugin/opencode/afm/index.js +245 -0
- package/plugin/opencode/afm/tui.js +21 -0
- package/plugin/opencode/agents/afm-executor.md +39 -0
- package/plugin/opencode/agents/afm-explorer.md +92 -0
- package/plugin/opencode/agents/afm-reviewer.md +93 -0
- package/plugin/opencode/skills/afm-adr/SKILL.md +48 -0
- package/plugin/opencode/skills/afm-analyze/SKILL.md +34 -0
- package/plugin/opencode/skills/afm-clarify/SKILL.md +34 -0
- package/plugin/opencode/skills/afm-deliver/SKILL.md +30 -0
- package/plugin/opencode/skills/afm-diagnose/SKILL.md +46 -0
- package/plugin/opencode/skills/afm-evolve/SKILL.md +49 -0
- package/plugin/opencode/skills/afm-export-template/SKILL.md +43 -0
- package/plugin/opencode/skills/afm-generalize/SKILL.md +37 -0
- package/plugin/opencode/skills/afm-gotcha/SKILL.md +46 -0
- package/plugin/opencode/skills/afm-init/SKILL.md +81 -0
- package/plugin/opencode/skills/afm-obligations/SKILL.md +31 -0
- package/plugin/opencode/skills/afm-plan/SKILL.md +34 -0
- package/plugin/opencode/skills/afm-policy/SKILL.md +29 -0
- package/plugin/opencode/skills/afm-promote/SKILL.md +43 -0
- package/plugin/opencode/skills/afm-protocol/SKILL.md +45 -0
- package/plugin/opencode/skills/afm-reconcile/SKILL.md +49 -0
- package/plugin/opencode/skills/afm-refactor/SKILL.md +83 -0
- package/plugin/opencode/skills/afm-reflect/SKILL.md +49 -0
- package/plugin/opencode/skills/afm-remediate/SKILL.md +39 -0
- package/plugin/opencode/skills/afm-restructure/SKILL.md +52 -0
- package/plugin/opencode/skills/afm-rule/SKILL.md +49 -0
- package/plugin/opencode/skills/afm-specify/SKILL.md +34 -0
- package/plugin/opencode/skills/afm-tasks/SKILL.md +28 -0
- package/plugin/opencode/skills/afm-update/SKILL.md +64 -0
- package/plugin/opencode/skills/afm-verify/SKILL.md +35 -0
- package/README.md +0 -3
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: diagnose
|
|
3
|
+
description: |
|
|
4
|
+
Scans the health of the local docs on 7 axes. The axes are dead reference, stale marker, instance-to-plugin drift, broken ADR chain, dead rule trigger, inflation or orphan, and cross-doc contradiction. It reads only `<consumer>/docs/` and returns evidence as `command + file:line`. It proposes no edit.
|
|
5
|
+
Activates: `afm diagnose`, "diagnose the methodology", "what is broken in the docs?", "run the AFM health check".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# AFM — Diagnose (mechanical weakness-mining, read-only)
|
|
10
|
+
|
|
11
|
+
> **Carve-out (does not overlap existing ops):** `afm analyze` audits **one feature**. `diagnose` audits the **whole instance** of `/docs/`. `afm reflect` uses **behavioral** evidence, where the agent stumbled. `diagnose` is **static**, based on filesystem and git. `afm evolve` is the **orchestrator**. It combines `diagnose` (mechanical evidence) with `afm reflect` (behavioral evidence) into one proposal and one gate. `diagnose` is **read-only**. It never proposes an edit or opens a gate.
|
|
12
|
+
|
|
13
|
+
## When NOT to activate
|
|
14
|
+
|
|
15
|
+
This section disambiguates for a skill that already activated. It does not define activation, so it stays in the body, not in the resident listing.
|
|
16
|
+
|
|
17
|
+
Validation of ONE feature is `afm analyze`. Behavioral friction, where a doc misguided the agent at apply time, is `afm reflect`. Proposing or applying a fix is `afm evolve` (the full cycle, which includes diagnose).
|
|
18
|
+
|
|
19
|
+
## Pre-check
|
|
20
|
+
|
|
21
|
+
1. **Does `<consumer>/docs/.afm-version` exist?** If not, stop. Suggest `afm init` (greenfield) or `afm refactor` (brownfield) first.
|
|
22
|
+
2. **Does `afm preflight` exit 0?** A non-zero exit says why (docs not bootstrapped, content unresolved, pin mismatch). Report it to the user. Do not fall back silently.
|
|
23
|
+
|
|
24
|
+
## Procedure
|
|
25
|
+
|
|
26
|
+
The procedure has two phases. **Phase 0 — Scan** is gap-driven. Run `afm doctor --json`: it checks A1-A6, staleness and dead gotchas mechanically, and every finding carries a command plus `file:line`. You add A7 yourself. All 7 axes are checked, every time.
|
|
27
|
+
|
|
28
|
+
Axis A7, cross-doc contradiction, uses a paired read. That read applies an anti-false-positive layer test. An axis that cannot be covered becomes "not-covered: <reason>".
|
|
29
|
+
|
|
30
|
+
**Phase 1 — Diagnosis** has the ANALYZER role. **It must not propose an edit.** The signature is φ = `(symptom, causal-status-of-behavior, mechanism)`.
|
|
31
|
+
|
|
32
|
+
Phase 1 requires rival mechanisms, for example "agent non-compliant" versus "target legitimately removed". It applies an addressability filter and a self-sufficient severity matrix.
|
|
33
|
+
|
|
34
|
+
**Output** is an evidence bundle ordered by severity. Run à la carte, the skill prints the report to chat. It does not write to disk. It opens no gate. Under `afm evolve`, it feeds the proposal instead.
|
|
35
|
+
|
|
36
|
+
This scan has no cooldown. It is read-only and cheap. The cycle's cooldown belongs to the orchestrator.
|
|
37
|
+
|
|
38
|
+
## Invariant principles
|
|
39
|
+
|
|
40
|
+
Most relevant here: #2 (discover-first — diagnose with evidence before any proposal). Also #3 (mechanize-or-demote — the checks must pass the test they audit). Also #5 (no finding without evidence external to the text).
|
|
41
|
+
|
|
42
|
+
**No new principle here.** `diagnose` is a composed materialization. The doctrine lives in the op file.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: evolve
|
|
3
|
+
description: |
|
|
4
|
+
Runs the full self-evolution cycle over `<consumer>/docs/`. It combines diagnose and reflect, adds generalize, restructure, update and remediate on demand, and delivers one package through one gate (`afm ask evolve`). It conducts the mechanisms and never touches the plugin.
|
|
5
|
+
Activates: `afm evolve`, "audit the methodology", "the docs are a mess", "the rules no longer trigger", "clean up the docs", "reorganize the docs".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# AFM — Evolve (orchestrator for the self-evolution cycle)
|
|
10
|
+
|
|
11
|
+
This is an orchestrator skill of AFM. The canonical procedure is the op file that `afm path ops/evolve.md` prints.
|
|
12
|
+
|
|
13
|
+
> **Carve-outs (it does not override existing ops):** `afm diagnose`, `afm reflect`, `afm generalize` and `afm restructure` are the **mechanisms** (each runs à la carte). `afm analyze` audits **one feature** (read-only). Passive mode (`afm reconcile`) proposes **one single edit** at the end of a turn. `afm promote` **records** a finding meant for the plugin (it does not edit the plugin). `evolve` is the **cycle** that chains the mechanisms with one gate and one log — the level no other op covers.
|
|
14
|
+
|
|
15
|
+
## When NOT to activate
|
|
16
|
+
|
|
17
|
+
This section helps someone who already activated the skill decide if it fits. It is not an activation trigger, so it stays in the body, not in the resident listing.
|
|
18
|
+
|
|
19
|
+
Use a single mechanism instead when the need is narrow. A report is `afm diagnose`. Refining a doc that misled you is `afm reflect`. Merging gotchas is `afm generalize`.
|
|
20
|
+
|
|
21
|
+
A structure or staleness check is `afm restructure`. A version bump is `afm update`. Passive mode (`afm reconcile`) proposes a one-off additive signal (new gotcha, rule, or ADR) directly.
|
|
22
|
+
|
|
23
|
+
A feature-level check is `afm analyze` or `afm deliver`. Recording a finding for the plugin is `afm promote`.
|
|
24
|
+
|
|
25
|
+
## Pre-check
|
|
26
|
+
|
|
27
|
+
1. **Does `<consumer>/docs/.afm-version` exist?** If not, stop. Suggest `afm init` (greenfield) or `afm refactor` (brownfield) first.
|
|
28
|
+
2. **Does `afm preflight` exit 0?** A non-zero exit says why (docs not bootstrapped, content unresolved, pin mismatch). Report it to the user. Do not fall back silently.
|
|
29
|
+
3. **Does `afm evolve gate-check` allow a cycle?** Pass `--symptom "<what the user said>"` when there is one. Exit 0 runs; exit 1 is the cooldown refusing (no new signal inside the window), so say so and stop; 3 and 4 mean not a project or undecided.
|
|
30
|
+
|
|
31
|
+
## Procedure
|
|
32
|
+
|
|
33
|
+
Read the op (`afm path ops/evolve.md`) end to end and follow it exactly. The op has 5 phases: evidence collection (diagnose plus reflect), proposal in 3 buckets, a single gate (`afm ask evolve`), apply with post-conditions, and the log in `docs/evolution/`.
|
|
34
|
+
|
|
35
|
+
Consult the rubric `rubrics/when-to-evolve-methodology.md` (`afm path rubrics/when-to-evolve-methodology.md`) to decide between a full cycle, a single mechanism, or a one-off fix.
|
|
36
|
+
|
|
37
|
+
## Most relevant principles
|
|
38
|
+
|
|
39
|
+
#2 (discover-first): diagnose with evidence before you propose. #3 (mechanize-or-downgrade): evolve's own signals must pass the same test evolve applies to others. #6 (autonomy-first with self-check): the gate is the load-bearing residue, and the bright lines for #7 plugin, deletion, and push still apply. #8 (earned questions, recommendation-first).
|
|
40
|
+
|
|
41
|
+
## Continuous doctrine
|
|
42
|
+
|
|
43
|
+
Passive mode (`afm reconcile`) is always on. It may **suggest** `afm evolve` when it detects a Class B signal. That signal is a lived contradiction between docs, or perceived inflation at apply time. Only the user can invoke the full cycle.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: export-template
|
|
3
|
+
description: |
|
|
4
|
+
Converts a bootstrapped project into an architectural template. It deletes the product files, keeps ach, afm, gotchas and adr, and writes the `docs/.template` marker. It touches `docs/` only.
|
|
5
|
+
Activates: `afm export-template`, "export as template", "turn this project into a starter".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Export-template
|
|
9
|
+
|
|
10
|
+
The CLI owns the plan, the diff and the marker. This skill keeps the judgment.
|
|
11
|
+
|
|
12
|
+
## When NOT to activate
|
|
13
|
+
|
|
14
|
+
This is a criterion for a skill already active, not an activation trigger. If the project is already a
|
|
15
|
+
template (`docs/.template` exists), the op is idempotent but asks first.
|
|
16
|
+
|
|
17
|
+
## Pre-check
|
|
18
|
+
|
|
19
|
+
`afm template export --dry-run` does it: a project with no `docs/.afm-version` is not bootstrapped yet, so
|
|
20
|
+
stop and suggest `afm init` (greenfield) or `afm refactor` (brownfield) first.
|
|
21
|
+
|
|
22
|
+
## Procedure (judgment only)
|
|
23
|
+
|
|
24
|
+
1. Collect the template name and version as free text. A blank answer stays `[TBD]`; never derive the name
|
|
25
|
+
from the folder.
|
|
26
|
+
2. Ask what to keep: `afm ask export-template`. Put every coherence warning of the dry run to the operator.
|
|
27
|
+
3. Induce the reusable task template from the latest all-green feature BEFORE `docs/features/` goes.
|
|
28
|
+
4. Show the full diff with `afm template export --dry-run ...`, then ask `afm ask export-template-apply`.
|
|
29
|
+
Deleting files is a bright line: it is never applied without that confirmation.
|
|
30
|
+
5. Apply with the same flags and `--yes`, and suggest the commit message the command prints.
|
|
31
|
+
|
|
32
|
+
## Invariant principles
|
|
33
|
+
|
|
34
|
+
Most relevant here: #5 (do not invent metadata when the operator leaves it blank: use `[TBD]` in the JSON). Also #6
|
|
35
|
+
(autonomy-first, but deleting files is a bright line): confirm the diff before you delete.
|
|
36
|
+
|
|
37
|
+
Passive mode (`afm reconcile`) is always on. This skill focuses only on the active conversion to a template.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: generalize
|
|
3
|
+
description: |
|
|
4
|
+
Merges two or more similar gotchas into one abstract rule, from episodic to semantic. Merged entries become tombstones and nothing is deleted.
|
|
5
|
+
Activates: `afm generalize`, "these gotchas are all the same thing", "merge these rules", "I have 3 gotchas that say the same thing".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# AFM — Generalize (semantic consolidation of gotchas)
|
|
10
|
+
|
|
11
|
+
> **Carve-out (does not overlap existing ops):** `afm promote` **registers** a finding meant for the plugin. It does not write to the plugin. `afm generalize` merges **inside the instance** (N gotchas become 1 rule in the same `/docs/`). `afm reconcile` **adds** a new gotcha. `afm generalize` **merges** gotchas that already exist. `afm reflect` refines **one** doc. `afm generalize` consolidates **many**. `afm evolve` is the **orchestrator** and it composes this skill when `afm diagnose` flags inflation from redundant gotchas.
|
|
12
|
+
|
|
13
|
+
## When NOT to activate
|
|
14
|
+
|
|
15
|
+
This is a disambiguation criterion for someone who already activated the skill, not an activation trigger. That is why it lives in the body, not in the resident listing.
|
|
16
|
+
|
|
17
|
+
Sending ONE learning to the plugin is `afm promote`. ADDING a new gotcha or rule is `afm reconcile` -> `afm gotcha`/`afm rule` (`afm generalize` only merges what already exists). Refining the clarity of ONE doc is `afm reflect`. With fewer than 2 similar candidates, there is no generalization to do.
|
|
18
|
+
|
|
19
|
+
## Pre-check
|
|
20
|
+
|
|
21
|
+
1. **Does `<consumer>/docs/.afm-version` exist?** If not, stop and suggest `afm init` (greenfield) or `afm refactor` (brownfield) first.
|
|
22
|
+
2. **Does `afm preflight` exit 0?** A non-zero exit says why (docs not bootstrapped, content unresolved, pin mismatch). Report it to the user. Do not fall back silently.
|
|
23
|
+
3. **Is there a batch of >=2** similar gotchas/reflections? If not, report "nothing to generalize (no batch)" and stop. Generalizing from 1 case is forbidden (#5).
|
|
24
|
+
|
|
25
|
+
## Gate
|
|
26
|
+
|
|
27
|
+
The merge is load-bearing and goes through its own earned gate, `afm ask generalize` (suppressed under `afm evolve`). Merged entries become tombstones; never delete.
|
|
28
|
+
|
|
29
|
+
## Most relevant here
|
|
30
|
+
|
|
31
|
+
#1 (episodic `gotchas.md` -> semantic `afm.md`), #3 (a merged rule becomes hard only with an executable 0/1 trigger), #5 (no abstraction without a real batch), #6/#8 (self-verify before an earned gate; deletion is a bright line, so archive as tombstones). No new principle here: the doctrine lives in the op.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gotcha
|
|
3
|
+
description: |
|
|
4
|
+
Writes a counterintuitive surprise to `<consumer>/docs/gotchas/`. The entry gate is mandatory: the issue must have bitten twice, or it must be documented behavior of an external SDK or runtime.
|
|
5
|
+
Activates: `afm gotcha`, "register a gotcha", "this has confused me before", "note this surprise for the next person".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Gotcha
|
|
9
|
+
|
|
10
|
+
The CLI owns the entry gate, the number, the frontmatter the trigger index reads and the index. This skill
|
|
11
|
+
keeps only the judgment.
|
|
12
|
+
|
|
13
|
+
## When NOT to activate
|
|
14
|
+
|
|
15
|
+
This is a disambiguation for a skill that already activated. An architectural decision belongs to
|
|
16
|
+
`afm adr`. A rule with an executable trigger belongs to `afm rule`. A recurring failure with an external
|
|
17
|
+
signal belongs to `afm remediate`.
|
|
18
|
+
|
|
19
|
+
## Pre-check
|
|
20
|
+
|
|
21
|
+
`afm preflight`. Exit 3 means there is no instance: stop and suggest `afm init` or `afm refactor` first.
|
|
22
|
+
|
|
23
|
+
## Procedure (judgment only)
|
|
24
|
+
|
|
25
|
+
1. Validate the entry rule BEFORE you collect content: `afm ask gotcha`. `neither` stops: reject a gotcha
|
|
26
|
+
without a 2x incidence or an external doc.
|
|
27
|
+
2. Collect the area, trigger, behavior, solution and references as free text. Decide how it fires: an
|
|
28
|
+
`event` when no file shape can fire it, a `file-shape` only with a narrow glob. A guessed trigger is worse
|
|
29
|
+
than one that never fires.
|
|
30
|
+
3. Run `afm gotcha new <slug> --basis <bitten-twice|documented-sdk> ...` and report the path (#6). A later
|
|
31
|
+
re-bite is `afm gotcha bite <id>`.
|
|
32
|
+
|
|
33
|
+
## Invariant principles
|
|
34
|
+
|
|
35
|
+
Most relevant here: #5 (do not
|
|
36
|
+
invent a gotcha without a real case; the 2x entry check is a strong gate) and #6 (autonomy-first: save the
|
|
37
|
+
result and report it).
|
|
38
|
+
|
|
39
|
+
Passive mode (`afm reconcile`) is always on and can propose `afm gotcha` when it detects the signal "the
|
|
40
|
+
same runtime surprise blocked work twice." This skill covers only active registration.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: init
|
|
3
|
+
description: |
|
|
4
|
+
Bootstraps AFM in a greenfield project. The CLI materializes `<consumer>/docs/` mechanically; the skill runs the interview for what only the operator knows, asking closed questions through `afm ask`. It detects the `docs/.template` marker and branches to the from-template path. It activates ONLY on explicit invocation and never from project state.
|
|
5
|
+
Activates: `afm init`, "build the AFM doc", "bootstrap AFM".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Init (greenfield bootstrap)
|
|
9
|
+
|
|
10
|
+
This skill of `afm` handles **greenfield bootstrap** and the from-template branch. It has a single
|
|
11
|
+
responsibility. It does not route ops (each op is its own skill).
|
|
12
|
+
|
|
13
|
+
The interview script is `afm path interview/bootstrap`. This skill is a router. It **never invents a
|
|
14
|
+
procedure. It always reads the source first.** The layout of the shipped content is `afm path README`.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## When NOT to activate
|
|
19
|
+
|
|
20
|
+
This is a disambiguation criterion for a skill that already activated. It is not an activation trigger.
|
|
21
|
+
|
|
22
|
+
If the project already has `docs/.afm-version`, use the atomic skills instead. To move to a new version, use
|
|
23
|
+
`afm update`. A brownfield codebase with no docs needs `afm refactor` instead.
|
|
24
|
+
|
|
25
|
+
## Pre-check (before any action)
|
|
26
|
+
|
|
27
|
+
1. **`afm preflight`.** Exit 3 means there is no `docs/.afm-version`: continue. Any other exit means the
|
|
28
|
+
project is already bootstrapped. **Do not run bootstrap again.** The atomic skills stay available
|
|
29
|
+
(`afm gotcha`, `afm adr`, `afm rule`, `afm promote`, `afm specify`, `afm plan`, `afm tasks`, `afm clarify`,
|
|
30
|
+
`afm analyze`, `afm export-template`), and passive mode (`afm reconcile`) stays always-on.
|
|
31
|
+
2. **Does `docs/.template` exist?** Yes means the project comes from a template: ask `afm ask init-template`
|
|
32
|
+
whether to run the from-template branch, a subset focused on the product (default `Product only`). `Full
|
|
33
|
+
interview` goes to pre-check 3.
|
|
34
|
+
3. **Does the project have significant pre-existing code?** A populated source root and a manifest with real
|
|
35
|
+
dependencies, or a git log with more than 20 commits. If so this is NOT the right path: stop and suggest
|
|
36
|
+
`afm refactor`: *"This project already has code. Greenfield bootstrap would make you pretend it is new.
|
|
37
|
+
`afm refactor` infers the docs from the existing code. Want to run it?"* `afm refactor --mechanical
|
|
38
|
+
--dry-run` states the verdict with its reasons.
|
|
39
|
+
4. **Is the shipped content resolved?** `afm preflight` exit 4 means it is not. Tell the operator. Do not
|
|
40
|
+
guess the content and do not fail silently.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Procedure (greenfield bootstrap)
|
|
45
|
+
|
|
46
|
+
For projects without `docs/.afm-version`:
|
|
47
|
+
|
|
48
|
+
1. Read `afm path interview/bootstrap` end to end.
|
|
49
|
+
2. Ask the closed decisions the mechanical pass needs: `afm ask init`. Then run `afm init --mechanical`
|
|
50
|
+
(preview with `--dry-run`, or `--answers <file>` for a headless run). It creates `docs/` and `docs/adr/`,
|
|
51
|
+
fills the skeletons with the measured rule constants and `[TBD]` where the code answers nothing, copies
|
|
52
|
+
every rubric and pattern, writes `AGENTS.md` plus the harness stubs, and writes `docs/.afm-version` last.
|
|
53
|
+
3. **Run the 7-step interview literally.** One question per turn. Free text only for open descriptions. For
|
|
54
|
+
everything with closed options, ask through `afm ask <op>` with the recommendation first (invariant
|
|
55
|
+
principle #8). Validate each answer with `afm ask confirm`. Fill each step into the matching
|
|
56
|
+
`docs/<file>.md`, replacing `{{placeholders}}` with the operator's answers and leaving unknown answers as
|
|
57
|
+
`[TBD]` (invariant principle #4).
|
|
58
|
+
4. Apply opt-in modules. For each stack the operator confirms, read `afm path modules/<stack>/ach.patch` and
|
|
59
|
+
`afm path modules/<stack>/rules.patch` and merge them into `docs/ach.md` and `docs/afm.md`. A
|
|
60
|
+
`gotchas.seed` is a **commented reference** only: the project's `docs/gotchas/` starts empty.
|
|
61
|
+
5. Generate the indexes (`afm index --materialize`) and print a summary: list every `[TBD]` and ask which ones
|
|
62
|
+
to fill in now.
|
|
63
|
+
|
|
64
|
+
**Branch from-template** (if pre-check 2 found `docs/.template`): run a subset of the steps. The subset is
|
|
65
|
+
0 + 3 + 6 short + 7 adapted. Skip steps 1, 2, 4 and 5, because the template already has them. The full
|
|
66
|
+
procedure is in `afm path interview/bootstrap` § Alternate branch. `.afm-version` gets an inheritance line.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Invariant principles
|
|
71
|
+
|
|
72
|
+
For this skill (greenfield), #9 (retroactive ADR, load-bearing) does NOT apply to init. Bootstrap forbids a retroactive ADR.
|
|
73
|
+
|
|
74
|
+
## Continuous doctrine
|
|
75
|
+
|
|
76
|
+
Passive mode (`afm reconcile`) stays always-on in any AFM
|
|
77
|
+
project session. This skill covers only the active bootstrap procedure.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: obligations
|
|
3
|
+
description: |
|
|
4
|
+
Maps a contract into an obligations root in a parent folder that holds a client's repositories. Each obligation of the operator becomes a typed entry, and git enforces the mechanical ones on every repository below the folder, with no AI and no harness. It never gives legal advice.
|
|
5
|
+
Activates: `afm obligations`, "map this contract", "turn my contract into rules", "what does this contract make me do", "set up the obligations for this client folder".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Obligations (map a contract into an obligations root)
|
|
9
|
+
|
|
10
|
+
The CLI owns the scaffold, the schema, the lint, the approvals log and the hooks. This skill keeps the
|
|
11
|
+
judgment: reading the contract and mapping each obligation honestly.
|
|
12
|
+
|
|
13
|
+
## When NOT to activate
|
|
14
|
+
|
|
15
|
+
To record an approval the operator received, run `afm approval add`. To check a project's code against
|
|
16
|
+
the AFM rules, run `afm gate`. A project's own rules belong to `afm rule`.
|
|
17
|
+
|
|
18
|
+
## Pre-check
|
|
19
|
+
|
|
20
|
+
None: the op runs in a parent folder, which is not an AFM project. The operator must point to the
|
|
21
|
+
contract file. Without one, ask for it in plain words and stop.
|
|
22
|
+
|
|
23
|
+
## Procedure (judgment only)
|
|
24
|
+
|
|
25
|
+
Map honestly: an obligation is `hard` only when a built-in check can prove it, and every entry cites
|
|
26
|
+
its clause. Outside an AFM project `afm ask` exits 1: put the op's two questions to the operator in plain
|
|
27
|
+
words, and never install without an explicit `install-now`.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan
|
|
3
|
+
description: |
|
|
4
|
+
Fills `plan.md` for the active feature. It reads the stack from `ach.md` and infers the affected components from the code. It records each decision with its rejected alternatives. It soft-blocks on an open `[NEEDS CLARIFICATION:]` in the spec.
|
|
5
|
+
Activates: `afm plan [<feature>]`, "plan feature", "draft plan for feature X".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Plan
|
|
9
|
+
|
|
10
|
+
## When NOT to activate
|
|
11
|
+
|
|
12
|
+
There is no `spec.md` yet: run `afm specify` first. An end-to-end delivery is `afm deliver`, which composes this op.
|
|
13
|
+
|
|
14
|
+
## Pre-check
|
|
15
|
+
|
|
16
|
+
Run `afm preflight` (exit 3: stop and suggest `afm init` or `afm refactor`). Run `afm feature status <NNN> --json`: a non-empty `blockers` means open `[NEEDS CLARIFICATION:]` markers in the spec, and the op asks the `open-markers` question (`afm ask plan`) before it goes on.
|
|
17
|
+
|
|
18
|
+
## Procedure
|
|
19
|
+
|
|
20
|
+
Read the stack from `docs/ach.md` and never reopen it. Infer the components, decisions, contracts and complexity from the code scan, and ask only for what the scan cannot resolve. Create the plan with `afm new feature-plan --feature NNN-slug` and fill it, including the first real `for_paths`. List the hard rules of `docs/afm.md` § 3 that apply, each binary. Suggest an ADR (`afm adr new <slug>`) for a load-bearing decision. Autonomy-first: write and report.
|
|
21
|
+
|
|
22
|
+
## Invariant principles
|
|
23
|
+
|
|
24
|
+
Most relevant here: #2 (discover-first: scan before you ask), #5 (do not invent contracts or a stack) and #8 (a question carries a recommendation).
|
|
25
|
+
|
|
26
|
+
## Continuous doctrine
|
|
27
|
+
|
|
28
|
+
Passive mode (`afm reconcile`) is always on. This skill covers only the planning.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: policy
|
|
3
|
+
description: |
|
|
4
|
+
Reports what the organisation policy bundle imposes in this project. It answers which rules apply, which gotchas apply, whether the bundle can block, and what the reader may not edit here. It reads only and writes to neither bundle.
|
|
5
|
+
Activates: `afm policy`, "what does the organisation impose here", "which rules come from outside this repository", "why can I not edit this rule".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Policy (report the organisation layer)
|
|
9
|
+
|
|
10
|
+
## When not to activate
|
|
11
|
+
|
|
12
|
+
Never to CHANGE the policy. This skill reads. The organisation bundle belongs to whoever owns it, and no
|
|
13
|
+
operation in this plugin writes to it.
|
|
14
|
+
|
|
15
|
+
## Pre-check
|
|
16
|
+
|
|
17
|
+
`afm preflight`. Exit 3 means there is no instance: stop. No organisation policy configured is a valid state
|
|
18
|
+
that `afm policy report` says plainly, and a bundle with no `policy.md` is not a policy bundle: report it
|
|
19
|
+
and stop.
|
|
20
|
+
|
|
21
|
+
## Procedure (judgment only)
|
|
22
|
+
|
|
23
|
+
Run `afm policy report` and read it by family. Say plainly that a policy bundle injects context and blocks
|
|
24
|
+
nothing, and name what the reader may not edit here and who owns it. Never report a policy rule as
|
|
25
|
+
enforced.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: promote
|
|
3
|
+
description: |
|
|
4
|
+
Records an instance learning that applies to every AFM project. It stores the finding in the project's machine state, classifies the target, and formats it as an issue body. It needs reproducible mechanical evidence. It never edits the plugin.
|
|
5
|
+
Activates: `afm promote`, "this applies to any project", "this rule should be in the template", "this gotcha should be in the template".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Promote
|
|
9
|
+
|
|
10
|
+
## When NOT to activate
|
|
11
|
+
|
|
12
|
+
This disambiguation applies once this skill has already activated. Project-specific learning stays in
|
|
13
|
+
`<consumer>/docs/`. Use `afm generalize` to consolidate gotchas INSIDE the instance. Use `afm update` to
|
|
14
|
+
bring the plugin INTO the instance (the opposite direction).
|
|
15
|
+
|
|
16
|
+
## Pre-check
|
|
17
|
+
|
|
18
|
+
`afm preflight`. Exit 3 means there is no instance: stop and suggest `afm init` or `afm refactor` first.
|
|
19
|
+
|
|
20
|
+
## Procedure (judgment only)
|
|
21
|
+
|
|
22
|
+
1. Read `afm path interview/promotion` and apply the gate for reproducible mechanical evidence: the command
|
|
23
|
+
that proves the defect or the learning, with its output before and expected after. No command means an
|
|
24
|
+
observation in the report, not a finding.
|
|
25
|
+
2. Walk the classification (project entity, one stack, a convention, a pattern, or universal) to set the
|
|
26
|
+
`target`. A learning that names a project entity stays in `docs/`.
|
|
27
|
+
3. Record it: `afm findings record --target <target> --title "<title>" --evidence "<command> → <output>"
|
|
28
|
+
--note "<why it applies to any instance>"`. Report and stop.
|
|
29
|
+
|
|
30
|
+
## Invariant principles
|
|
31
|
+
|
|
32
|
+
Most relevant here: #5: never record a
|
|
33
|
+
project-specific learning, and never one without a real case; the list grows on demand.
|
|
34
|
+
|
|
35
|
+
It also includes #6/#7: the plugin boundary is **absolute**. This op records a finding and never applies a
|
|
36
|
+
change.
|
|
37
|
+
|
|
38
|
+
Passive mode (`afm reconcile`) is always on and can propose `afm promote` when it detects a signal that a
|
|
39
|
+
learning generalizes to any project.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: protocol
|
|
3
|
+
description: |
|
|
4
|
+
Declares or reports the autonomy protocol of the project. The protocol parametrizes the PLAN threshold, the retry cap and the learning cadence. Three presets exist: p1 autonomous, p2 assisted, p3 planned-autonomous. It writes `protocol:` to `docs/_focus.md`, and with no argument it only reports.
|
|
5
|
+
Activates: `afm protocol [<name>]`, "what protocol am I using", "switch to assisted", "decide on your own for this delivery", "stop asking me so much".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Protocol (declared autonomy posture)
|
|
9
|
+
|
|
10
|
+
Field and preset definitions are in `afm path core/protocol`.
|
|
11
|
+
|
|
12
|
+
> **A protocol is data, not a new execution path.** It parametrizes operations that already exist. A project
|
|
13
|
+
> with no `protocol:` declared uses the defaults, which reproduce pre-v4 behavior.
|
|
14
|
+
|
|
15
|
+
## When NOT to activate
|
|
16
|
+
|
|
17
|
+
This is a disambiguation for a skill that already activated. Running a delivery is `afm deliver` (it
|
|
18
|
+
**reads** the current protocol, it does not set it). Changing a hard rule is `afm rule`. Adjusting the work
|
|
19
|
+
focus without touching posture is a direct edit to `docs/_focus.md`. A mid-delivery "go ahead" is an
|
|
20
|
+
**ephemeral gate override**, not a protocol change, and it does not activate this skill.
|
|
21
|
+
|
|
22
|
+
## Pre-check
|
|
23
|
+
|
|
24
|
+
1. `afm preflight`. Exit 3 means there is no instance: stop and suggest `afm init` or `afm refactor`.
|
|
25
|
+
2. **`p1` becomes current only through explicit invocation in this session.** Never infer it from natural
|
|
26
|
+
language and never inherit it from `git pull`. Granting the loosest posture is a human act, not a
|
|
27
|
+
repository act: a person runs `afm protocol p1 --i-mean-it`.
|
|
28
|
+
|
|
29
|
+
## Procedure (judgment only)
|
|
30
|
+
|
|
31
|
+
Run `afm protocol` to report, or `afm protocol <p1|p2|p3>` to switch. Then explain the **behavior delta** the
|
|
32
|
+
command printed, because switching protocols without knowing what changes means switching contracts blind.
|
|
33
|
+
Outside the three presets, the file must already exist: never invent one.
|
|
34
|
+
|
|
35
|
+
## Invariant principles
|
|
36
|
+
|
|
37
|
+
Most relevant here: #4 and #5.
|
|
38
|
+
|
|
39
|
+
#4: `[TBD]` beats invention. An instance with no declared posture does not receive an assumed one.
|
|
40
|
+
|
|
41
|
+
#5: Do not invent a preset without a real case.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reconcile
|
|
3
|
+
description: |
|
|
4
|
+
Always-on passive mode. It watches the signals in `interview/triggers.md` and proposes one edit to `docs/` at the end of the turn. It never applies the edit on its own and needs no command. It stays active in any project with `docs/.afm-version`, next to any other skill and to normal code work.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# AFM — Reconcile (passive mode, always-on)
|
|
8
|
+
|
|
9
|
+
The always-on skill. It loads the continuous doctrine and the passive-mode procedure, and it is the only skill that activates by default in any AFM project session. Every other skill needs explicit invocation or specific natural language.
|
|
10
|
+
|
|
11
|
+
## When NOT to activate
|
|
12
|
+
|
|
13
|
+
A project without `docs/.afm-version`: stay silent until bootstrap. Do not interfere with a bootstrap session (`afm init`) or a refactor session (`afm refactor`); they create `.afm-version`, and reconcile starts after that.
|
|
14
|
+
|
|
15
|
+
## Pre-check
|
|
16
|
+
|
|
17
|
+
`afm preflight` exits 0 when the project is bootstrapped: reconcile is active, so load the signal table and the procedure and watch the whole session. Exit 3 means it is not: stay silent and propose nothing.
|
|
18
|
+
|
|
19
|
+
## Doctrine
|
|
20
|
+
|
|
21
|
+
One criterion decides where something belongs (universal principle #1, source in `afm path PRINCIPLES.md`):
|
|
22
|
+
|
|
23
|
+
> *"If another developer, or another agent without my memory, needs to know this to avoid breaking something, it is a doc, not memory."*
|
|
24
|
+
|
|
25
|
+
`docs/` holds rules, decisions, gotchas, architecture, persona, flows and cross-module contracts. The agent's memory holds only the user's style and durable preferences ("small PRs, not big bundles") and personal context (role, years of experience, current focus).
|
|
26
|
+
|
|
27
|
+
`docs/` is a living source, **not a frozen bootstrap artifact**: it evolves through the whole session by passive reconcile. The signal table is `afm path interview/triggers.md`.
|
|
28
|
+
|
|
29
|
+
## Procedure (always-on)
|
|
30
|
+
|
|
31
|
+
In any session of a project with `docs/.afm-version`:
|
|
32
|
+
|
|
33
|
+
1. Load `afm path interview/triggers.md`: the signals, the affected docs and the ready-made phrasing.
|
|
34
|
+
2. Load the op `afm path ops/reconcile.md`: the literal passive-mode procedure.
|
|
35
|
+
3. Monitor the work in progress (code, debugging, refactor, feature, doc edit). When a signal fires (a new structural decision, a runtime surprise twice, a correction with a reusable rule, a new component), **propose an edit** to the right `docs/` file at the end of the turn.
|
|
36
|
+
4. **Never auto-apply** (principle #6: autonomy-first applies inside an invoked op or an approved feature; a passive signal is not approved scope).
|
|
37
|
+
5. When a proposal becomes a concrete action, suggest the matching op: `afm adr`, `afm gotcha`, `afm rule`, `afm promote`, `afm specify`, and more.
|
|
38
|
+
|
|
39
|
+
## Critical anti-patterns
|
|
40
|
+
|
|
41
|
+
Never apply an edit without proposing it first, never save a project rule in memory, never invent a gotcha without a 2x trigger, never promote to the template before the operator confirms, and never interrupt code work with a long proposal: use one short line at the end of the turn. The full list is in the op.
|
|
42
|
+
|
|
43
|
+
## Invariant principles
|
|
44
|
+
|
|
45
|
+
Most relevant here: #1 (the one criterion for memory against doc), #5 (no gotcha or rule without a case) and #6 (reconcile PROPOSES at the end of the turn).
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refactor
|
|
3
|
+
description: |
|
|
4
|
+
Adopts AFM retroactively in a brownfield codebase. The CLI reads the code, the git log and the existing rules and materializes `<consumer>/docs/` with `[TBD]` in the gaps; the skill then asks the gap questions through `afm ask`. New rules are forward-only in `afm.md § 3.1`. It activates ONLY on explicit invocation and never from project state.
|
|
5
|
+
Activates: `afm refactor`, "adopt AFM here", "build the doc retroactively", "infer docs from the code".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Refactor (brownfield retroactive)
|
|
9
|
+
|
|
10
|
+
This skill of `afm` handles **retroactive AFM adoption in a brownfield codebase**. Single responsibility. It
|
|
11
|
+
does not route ops (each op is its own skill).
|
|
12
|
+
|
|
13
|
+
The roadmap is `afm path interview/refactor`. This skill is a router. It **never invents procedure and always
|
|
14
|
+
reads the source first**. The layout of the shipped content is `afm path README`.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## When NOT to activate
|
|
19
|
+
|
|
20
|
+
This is a disambiguation check for a skill already active. It is not an activation trigger.
|
|
21
|
+
|
|
22
|
+
The project already has `docs/.afm-version`: use `afm update` to raise the version, refactor refuses. A
|
|
23
|
+
project with `docs/.template` needs `afm init` (from-template branch).
|
|
24
|
+
|
|
25
|
+
## Pre-check (before any action)
|
|
26
|
+
|
|
27
|
+
1. **`afm preflight`.** Exit 3 means there is no `docs/.afm-version`: continue. Any other exit means the
|
|
28
|
+
project is already bootstrapped: **refactor does not run.** The atomic skills stay available (`afm gotcha`,
|
|
29
|
+
`afm adr`, `afm rule`, `afm promote`, `afm specify`, `afm plan`, `afm tasks`, `afm clarify`, `afm analyze`,
|
|
30
|
+
`afm export-template`), and passive mode (`afm reconcile`) is already always-on. **If the
|
|
31
|
+
goal was to raise the instance to a newer version** (`.afm-version` drift), use `afm update`: refactor
|
|
32
|
+
creates an instance, update updates an existing one.
|
|
33
|
+
2. **Does `docs/.template` exist?** Yes means the project comes from a template, and refactor is not the right
|
|
34
|
+
path. Suggest `afm init` (it detects the marker and branches to the from-template flow).
|
|
35
|
+
3. **Is this real brownfield?** `afm refactor --mechanical --dry-run` checks it and states the reasons: a
|
|
36
|
+
manifest with real dependencies, a populated source root, a git history of more than 20 commits. Any
|
|
37
|
+
false means this is not brownfield: suggest `afm init` (*"This project does not yet seem to have a relevant
|
|
38
|
+
codebase. `afm init` does the greenfield bootstrap. Want to run that?"*).
|
|
39
|
+
4. **Is the shipped content resolved?** `afm preflight` exit 4 means it is not. Report it. Do not guess the
|
|
40
|
+
content and do not fall back silently.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Procedure (brownfield refactor)
|
|
45
|
+
|
|
46
|
+
For brownfield projects without `docs/.afm-version`:
|
|
47
|
+
|
|
48
|
+
1. Read `afm path interview/refactor` end to end.
|
|
49
|
+
2. Ask the closed decisions the mechanical pass needs (`afm ask init`), announce the plan in one line and
|
|
50
|
+
proceed directly: **no gate** (invoking `afm refactor` already approves this, per invariant principle #6).
|
|
51
|
+
3. **Run the 4 parts literally:**
|
|
52
|
+
- **Part A**: `afm refactor --mechanical` runs the autonomous code archaeology (stack scan, folder tree,
|
|
53
|
+
entity scan, CI and hooks scan, hard-rule audit, retroactive ADR candidates) and prints the report. No
|
|
54
|
+
turns with the operator. Read the README and the history yourself for the prose-only facts.
|
|
55
|
+
- **Part B**: the same command materialized the skeleton of `docs/{prd,ach,afm,ust,gotchas}`; fill the
|
|
56
|
+
drafts from the report with `[TBD]` in the gaps and report a summary plus paths. Review happens through
|
|
57
|
+
`git diff`. No review gate applies.
|
|
58
|
+
- **Part C**: run a short interview, one question per turn, closed ones through `afm ask <op>`
|
|
59
|
+
recommendation-first (invariant principle #8). Cover the pain point, the persona and the README summary
|
|
60
|
+
validation, retroactive ADRs (with a load-bearing guardrail, invariant principle #9), confirmed gotchas,
|
|
61
|
+
DoD + pre-push and code-style seeds.
|
|
62
|
+
- **Part D**: write `afm.md § 3.1` with forward-only rules based on the audit. Check `docs/.afm-version` and
|
|
63
|
+
`AGENTS.md`.
|
|
64
|
+
4. Apply the opt-in modules detected in A.1. For each stack, merge `afm path modules/<stack>/ach.patch` and
|
|
65
|
+
`afm path modules/<stack>/rules.patch` into the draft. A `gotchas.seed` becomes a commented block in the
|
|
66
|
+
gotchas doc. Only the entries the operator confirms in C.9.5 become active.
|
|
67
|
+
5. Print a closing summary plus a suggested commit (see the roadmap § Closing).
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Invariant principles
|
|
72
|
+
|
|
73
|
+
For this skill (brownfield), **all** principles apply: the 8 universals
|
|
74
|
+
§1-8 plus the addition §9 (a retroactive ADR is load-bearing-only). #9 separates refactor from init. Init
|
|
75
|
+
forbids retroactive ADRs.
|
|
76
|
+
|
|
77
|
+
## Continuous doctrine
|
|
78
|
+
|
|
79
|
+
Passive mode (`afm reconcile`) is always-on in any AFM project session. This skill covers only the active refactor procedure.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reflect
|
|
3
|
+
description: |
|
|
4
|
+
Finds where the local docs failed AS A HARNESS in the live session and the project's sessions since the last cycle. Examples are an ambiguous rule applied wrong, a doc that misled, and a user correction against the doc. The evidence is the session trajectory, never a static scan. It proposes edits that make the docs more assertive.
|
|
5
|
+
Activates: `afm reflect`, "this rule is ambiguous", "the doc sent me the wrong way", "why do I keep getting this wrong when the doc covers it?".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# AFM — Reflect (behavioral self-reflection on the docs)
|
|
10
|
+
|
|
11
|
+
> **Carve-out (does not overlap existing ops):** `afm reconcile` works **code to docs, and is additive**. It learns a new fact and proposes adding it. `reflect` works **docs to docs, and refines**. An existing doc guided the agent wrong, so `reflect` proposes a clearer version. `afm diagnose` runs a **static** scan. `reflect` uses **behavioral** evidence from the session trajectory. Only the agent sees its own stumble. `afm evolve` is the **orchestrator**. It composes `reflect` and `afm diagnose` into one cycle with a single gate.
|
|
12
|
+
|
|
13
|
+
## When not to activate
|
|
14
|
+
|
|
15
|
+
This is a disambiguation criterion for a skill already active, not an activation criterion. That is why it lives in the body, not in the resident listing.
|
|
16
|
+
|
|
17
|
+
Learning a new fact, gotcha, or decision belongs to passive mode (`afm reconcile`). Route it to `afm gotcha`, `afm rule`, or `afm adr`. A static mechanical scan belongs to `afm diagnose`. Merging N gotchas belongs to `afm generalize`. A failure with an external signal belongs to `afm remediate`. The full cycle belongs to `afm evolve`.
|
|
18
|
+
|
|
19
|
+
## Pre-check
|
|
20
|
+
|
|
21
|
+
1. **Does `<consumer>/docs/.afm-version` exist?** If not, stop. Suggest `afm init` (greenfield) or `afm refactor` (brownfield) first.
|
|
22
|
+
2. **Does `afm preflight` exit 0?** A non-zero exit says why (docs not bootstrapped, content unresolved, pin mismatch). Report it to the user. Do not fall back silently.
|
|
23
|
+
3. **Did the live session or the project's sessions since the last cycle hit a doc-friction event** (or an articulated symptom)? Read the window with `afm sessions --since reflect --json` and `afm sessions signals --since reflect --json`. If the whole window has no signal, report "no doc friction observed" and stop. Reflection without behavioral evidence is forbidden (#5).
|
|
24
|
+
|
|
25
|
+
## Procedure
|
|
26
|
+
|
|
27
|
+
The steps are:
|
|
28
|
+
|
|
29
|
+
**1. Collection.** Build the behavioral signature φ_b = `(symptom-lived, doc-causal-status, mechanism)`. Cite both the doc passage **and** the session event (`session:<id>@<ts>`). Weight: one signal in the live session suffices; a past-session signal needs 2 or more sessions, an explicit correction, or `regressed`, and `regressed` comes first. A repeated prompt is a finding: propose the artifact that stops the retyping.
|
|
30
|
+
|
|
31
|
+
**2. Self-critique.** Consider a rival hypothesis: it was me, not the doc. Apply the guardrail: a violated rule is not a wrong rule. Apply an addressability filter.
|
|
32
|
+
|
|
33
|
+
**3. Proposal.** Refine instructiveness: rewrite the ambiguous part, add an executable trigger, and remove ambiguity. Add suggestions for the human. This step follows the **shared proposal discipline** in `evolve.md` (`afm path ops/evolve.md`) and does not duplicate it.
|
|
34
|
+
|
|
35
|
+
**4. Own gate.** Ask item by item, earned, with `afm ask reflect --scope <item-slug>`. `afm evolve` suppresses this gate.
|
|
36
|
+
|
|
37
|
+
**5. Record.** Write to `docs/evolution/NNN-<date>.md`. Add an `afm promote` suggestion when the finding generalizes. Hand off to passive mode (`afm reconcile`).
|
|
38
|
+
|
|
39
|
+
## Invariant principles
|
|
40
|
+
|
|
41
|
+
Rule #1 applies: refine the doc's instructiveness, not the agent's memory. Rule #5 applies: no lived event, no finding. Rule #6 applies: self-verify, then report. The gate is a load-bearing residue. Bright lines #7 for plugin, deletion, and push apply.
|
|
42
|
+
|
|
43
|
+
Rule #8 applies: a suggestion or question must be earned, recommendation-first. **No new principle here.** `reflect` is a composed materialization. The doctrine lives in the op file.
|