@tenkara/afm-linux-arm64 0.0.0-stage → 4.0.0-alpha.6
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 +4256 -0
- package/content/PRINCIPLES.md +121 -0
- package/content/README-light.md +160 -0
- package/content/README.md +152 -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 +265 -0
- package/content/core/afm.md +496 -0
- package/content/core/gotchas.md +18 -0
- package/content/core/prd.md +143 -0
- package/content/core/protocol.md +160 -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 +72 -0
- package/content/interview/bootstrap.md +415 -0
- package/content/interview/promotion.md +117 -0
- package/content/interview/refactor.md +381 -0
- package/content/interview/triggers.md +109 -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 +129 -0
- package/content/ops/clarify.md +86 -0
- package/content/ops/deliver.md +211 -0
- package/content/ops/diagnose.md +146 -0
- package/content/ops/evolve.md +317 -0
- package/content/ops/export-template.md +97 -0
- package/content/ops/generalize.md +120 -0
- package/content/ops/gotcha.md +46 -0
- package/content/ops/plan.md +61 -0
- package/content/ops/policy.md +63 -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 +180 -0
- package/content/ops/remediate.md +146 -0
- package/content/ops/restructure.md +145 -0
- package/content/ops/rule.md +165 -0
- package/content/ops/specify.md +62 -0
- package/content/ops/tasks.md +67 -0
- package/content/ops/update.md +223 -0
- package/content/ops/verify.md +69 -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 +28 -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 +113 -0
- package/content/rubrics/negative-filters.md +38 -0
- package/content/rubrics/solid-triggers.md +121 -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 +34 -0
- package/content/skills/clarify.md +34 -0
- package/content/skills/deliver.md +42 -0
- package/content/skills/diagnose.md +50 -0
- package/content/skills/evolve.md +67 -0
- package/content/skills/export-template.md +40 -0
- package/content/skills/generalize.md +47 -0
- package/content/skills/gotcha.md +40 -0
- package/content/skills/init.md +82 -0
- package/content/skills/plan.md +34 -0
- package/content/skills/policy.md +31 -0
- package/content/skills/promote.md +41 -0
- package/content/skills/protocol.md +42 -0
- package/content/skills/reconcile.md +49 -0
- package/content/skills/refactor.md +84 -0
- package/content/skills/reflect.md +53 -0
- package/content/skills/remediate.md +39 -0
- package/content/skills/restructure.md +52 -0
- package/content/skills/rule.md +44 -0
- package/content/skills/specify.md +34 -0
- package/content/skills/tasks.md +34 -0
- package/content/skills/update.md +56 -0
- package/content/skills/verify.md +31 -0
- package/content/templates/adr.template.md +51 -0
- package/content/templates/evolution-report.template.md +129 -0
- package/content/templates/feature-plan.template.md +86 -0
- package/content/templates/feature-research.template.md +57 -0
- package/content/templates/feature-spec.template.md +86 -0
- package/content/templates/feature-tasks.induced.template.md +67 -0
- package/content/templates/feature-tasks.template.md +60 -0
- package/content/templates/focus.template.md +30 -0
- package/content/templates/gotcha.template.md +31 -0
- package/content/templates/guardrail-runner.template.md +81 -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 +44 -0
- package/plugin/agy/skills/afm-analyze/SKILL.md +36 -0
- package/plugin/agy/skills/afm-clarify/SKILL.md +36 -0
- package/plugin/agy/skills/afm-deliver/SKILL.md +44 -0
- package/plugin/agy/skills/afm-diagnose/SKILL.md +50 -0
- package/plugin/agy/skills/afm-evolve/SKILL.md +69 -0
- package/plugin/agy/skills/afm-export-template/SKILL.md +42 -0
- package/plugin/agy/skills/afm-generalize/SKILL.md +49 -0
- package/plugin/agy/skills/afm-gotcha/SKILL.md +42 -0
- package/plugin/agy/skills/afm-init/SKILL.md +84 -0
- package/plugin/agy/skills/afm-plan/SKILL.md +36 -0
- package/plugin/agy/skills/afm-policy/SKILL.md +31 -0
- package/plugin/agy/skills/afm-promote/SKILL.md +41 -0
- package/plugin/agy/skills/afm-protocol/SKILL.md +42 -0
- package/plugin/agy/skills/afm-reconcile/SKILL.md +49 -0
- package/plugin/agy/skills/afm-refactor/SKILL.md +86 -0
- package/plugin/agy/skills/afm-reflect/SKILL.md +55 -0
- package/plugin/agy/skills/afm-remediate/SKILL.md +41 -0
- package/plugin/agy/skills/afm-restructure/SKILL.md +54 -0
- package/plugin/agy/skills/afm-rule/SKILL.md +46 -0
- package/plugin/agy/skills/afm-specify/SKILL.md +36 -0
- package/plugin/agy/skills/afm-tasks/SKILL.md +34 -0
- package/plugin/agy/skills/afm-update/SKILL.md +58 -0
- package/plugin/agy/skills/afm-verify/SKILL.md +33 -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 +44 -0
- package/plugin/claude-code/skills/analyze/SKILL.md +36 -0
- package/plugin/claude-code/skills/clarify/SKILL.md +36 -0
- package/plugin/claude-code/skills/deliver/SKILL.md +44 -0
- package/plugin/claude-code/skills/diagnose/SKILL.md +50 -0
- package/plugin/claude-code/skills/evolve/SKILL.md +69 -0
- package/plugin/claude-code/skills/export-template/SKILL.md +42 -0
- package/plugin/claude-code/skills/generalize/SKILL.md +49 -0
- package/plugin/claude-code/skills/gotcha/SKILL.md +42 -0
- package/plugin/claude-code/skills/init/SKILL.md +84 -0
- package/plugin/claude-code/skills/plan/SKILL.md +36 -0
- package/plugin/claude-code/skills/policy/SKILL.md +31 -0
- package/plugin/claude-code/skills/promote/SKILL.md +41 -0
- package/plugin/claude-code/skills/protocol/SKILL.md +42 -0
- package/plugin/claude-code/skills/reconcile/SKILL.md +49 -0
- package/plugin/claude-code/skills/refactor/SKILL.md +86 -0
- package/plugin/claude-code/skills/reflect/SKILL.md +55 -0
- package/plugin/claude-code/skills/remediate/SKILL.md +41 -0
- package/plugin/claude-code/skills/restructure/SKILL.md +54 -0
- package/plugin/claude-code/skills/rule/SKILL.md +46 -0
- package/plugin/claude-code/skills/specify/SKILL.md +36 -0
- package/plugin/claude-code/skills/tasks/SKILL.md +34 -0
- package/plugin/claude-code/skills/update/SKILL.md +58 -0
- package/plugin/claude-code/skills/verify/SKILL.md +33 -0
- package/plugin/opencode/afm.js +173 -0
- package/plugin/opencode/agents/afm-executor.md +31 -0
- package/plugin/opencode/agents/afm-explorer.md +47 -0
- package/plugin/opencode/agents/afm-reviewer.md +48 -0
- package/plugin/opencode/skills/afm-adr/SKILL.md +44 -0
- package/plugin/opencode/skills/afm-analyze/SKILL.md +36 -0
- package/plugin/opencode/skills/afm-clarify/SKILL.md +36 -0
- package/plugin/opencode/skills/afm-deliver/SKILL.md +44 -0
- package/plugin/opencode/skills/afm-diagnose/SKILL.md +50 -0
- package/plugin/opencode/skills/afm-evolve/SKILL.md +69 -0
- package/plugin/opencode/skills/afm-export-template/SKILL.md +42 -0
- package/plugin/opencode/skills/afm-generalize/SKILL.md +49 -0
- package/plugin/opencode/skills/afm-gotcha/SKILL.md +42 -0
- package/plugin/opencode/skills/afm-init/SKILL.md +84 -0
- package/plugin/opencode/skills/afm-plan/SKILL.md +36 -0
- package/plugin/opencode/skills/afm-policy/SKILL.md +31 -0
- package/plugin/opencode/skills/afm-promote/SKILL.md +41 -0
- package/plugin/opencode/skills/afm-protocol/SKILL.md +42 -0
- package/plugin/opencode/skills/afm-reconcile/SKILL.md +49 -0
- package/plugin/opencode/skills/afm-refactor/SKILL.md +86 -0
- package/plugin/opencode/skills/afm-reflect/SKILL.md +55 -0
- package/plugin/opencode/skills/afm-remediate/SKILL.md +41 -0
- package/plugin/opencode/skills/afm-restructure/SKILL.md +54 -0
- package/plugin/opencode/skills/afm-rule/SKILL.md +46 -0
- package/plugin/opencode/skills/afm-specify/SKILL.md +36 -0
- package/plugin/opencode/skills/afm-tasks/SKILL.md +34 -0
- package/plugin/opencode/skills/afm-update/SKILL.md +58 -0
- package/plugin/opencode/skills/afm-verify/SKILL.md +33 -0
- package/README.md +0 -3
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-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
|
+
Atomic skill of `afm`. The canonical procedure is the op `afm path ops/promote`.
|
|
11
|
+
|
|
12
|
+
## When NOT to activate
|
|
13
|
+
|
|
14
|
+
This disambiguation applies once this skill has already activated. Project-specific learning stays in
|
|
15
|
+
`<consumer>/docs/`. Use `afm-generalize` to consolidate gotchas INSIDE the instance. Use `afm-update` to
|
|
16
|
+
bring the plugin INTO the instance (the opposite direction).
|
|
17
|
+
|
|
18
|
+
## Pre-check
|
|
19
|
+
|
|
20
|
+
`afm preflight`. Exit 3 means there is no instance: stop and suggest `afm-init` or `afm-refactor` first.
|
|
21
|
+
|
|
22
|
+
## Procedure (judgment only)
|
|
23
|
+
|
|
24
|
+
1. Read `afm path interview/promotion` and apply the gate for reproducible mechanical evidence: the command
|
|
25
|
+
that proves the defect or the learning, with its output before and expected after. No command means an
|
|
26
|
+
observation in the report, not a finding.
|
|
27
|
+
2. Walk the classification (project entity, one stack, a convention, a pattern, or universal) to set the
|
|
28
|
+
`target`. A learning that names a project entity stays in `docs/`.
|
|
29
|
+
3. Record it: `afm findings record --target <target> --title "<title>" --evidence "<command> → <output>"
|
|
30
|
+
--note "<why it applies to any instance>"`. Report and stop.
|
|
31
|
+
|
|
32
|
+
## Invariant principles
|
|
33
|
+
|
|
34
|
+
Single canonical source: `afm path PRINCIPLES`. Universals §1-8 apply. That includes #5: never record a
|
|
35
|
+
project-specific learning, and never one without a real case; the list grows on demand.
|
|
36
|
+
|
|
37
|
+
It also includes #6/#7: the plugin boundary is **absolute**. This op records a finding and never applies a
|
|
38
|
+
change.
|
|
39
|
+
|
|
40
|
+
Passive mode (`afm-reconcile`) is always on and can propose `afm-promote` when it detects a signal that a
|
|
41
|
+
learning generalizes to any project.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-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
|
+
Skill of `afm`. The canonical procedure is the op `afm path ops/protocol`. Field and preset definitions are
|
|
11
|
+
in `afm path core/protocol`.
|
|
12
|
+
|
|
13
|
+
> **A protocol is data, not a new execution path.** It parametrizes operations that already exist. A project
|
|
14
|
+
> with no `protocol:` declared uses the defaults, which reproduce pre-v4 behavior.
|
|
15
|
+
|
|
16
|
+
## When NOT to activate
|
|
17
|
+
|
|
18
|
+
This is a disambiguation for a skill that already activated. Running a delivery is `afm-deliver` (it
|
|
19
|
+
**reads** the current protocol, it does not set it). Changing a hard rule is `afm-rule`. Adjusting the work
|
|
20
|
+
focus without touching posture is a direct edit to `docs/_focus.md`. A mid-delivery "go ahead" is an
|
|
21
|
+
**ephemeral gate override**, not a protocol change, and it does not activate this skill.
|
|
22
|
+
|
|
23
|
+
## Pre-check
|
|
24
|
+
|
|
25
|
+
1. `afm preflight`. Exit 3 means there is no instance: stop and suggest `afm-init` or `afm-refactor`.
|
|
26
|
+
2. **`p1` becomes current only through explicit invocation in this session.** Never infer it from natural
|
|
27
|
+
language and never inherit it from `git pull`. Granting the loosest posture is a human act, not a
|
|
28
|
+
repository act: a person runs `afm protocol p1 --i-mean-it`.
|
|
29
|
+
|
|
30
|
+
## Procedure (judgment only)
|
|
31
|
+
|
|
32
|
+
Run `afm protocol` to report, or `afm protocol <p1|p2|p3>` to switch. Then explain the **behavior delta** the
|
|
33
|
+
command printed, because switching protocols without knowing what changes means switching contracts blind.
|
|
34
|
+
Outside the three presets, the file must already exist: never invent one.
|
|
35
|
+
|
|
36
|
+
## Invariant principles
|
|
37
|
+
|
|
38
|
+
Single canonical source: `afm path PRINCIPLES`. See especially #4 and #5.
|
|
39
|
+
|
|
40
|
+
#4: `[TBD]` beats invention. An instance with no declared posture does not receive an assumed one.
|
|
41
|
+
|
|
42
|
+
#5: Do not invent a preset without a real case.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-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`. The procedure is the op: read it with `afm path ops/reconcile.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
|
+
Single canonical source: `afm path PRINCIPLES.md`. Universals §1-8 apply, in particular #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).
|
|
46
|
+
|
|
47
|
+
## Version
|
|
48
|
+
|
|
49
|
+
`afm version`. History: `afm path CHANGELOG.md`.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-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
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
This skill of `afm` handles **retroactive AFM adoption in a brownfield codebase**. Single responsibility. It
|
|
13
|
+
does not route ops (each op is its own skill).
|
|
14
|
+
|
|
15
|
+
The roadmap is `afm path interview/refactor`. This skill is a router. It **never invents procedure and always
|
|
16
|
+
reads the source first**. The layout of the shipped content is `afm path README`.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## When NOT to activate
|
|
21
|
+
|
|
22
|
+
This is a disambiguation check for a skill already active. It is not an activation trigger.
|
|
23
|
+
|
|
24
|
+
The project already has `docs/.afm-version`: use `afm-update` to raise the version, refactor refuses. A
|
|
25
|
+
project with `docs/.template` needs `afm-init` (from-template branch).
|
|
26
|
+
|
|
27
|
+
## Pre-check (before any action)
|
|
28
|
+
|
|
29
|
+
1. **`afm preflight`.** Exit 3 means there is no `docs/.afm-version`: continue. Any other exit means the
|
|
30
|
+
project is already bootstrapped: **refactor does not run.** The atomic skills stay available (`afm-gotcha`,
|
|
31
|
+
`afm-adr`, `afm-rule`, `afm-promote`, `afm-specify`, `afm-plan`, `afm-tasks`, `afm-clarify`, `afm-analyze`,
|
|
32
|
+
`afm-export-template`), and passive mode (`afm-reconcile`) is already always-on. **If the
|
|
33
|
+
goal was to raise the instance to a newer version** (`.afm-version` drift), use `afm-update`: refactor
|
|
34
|
+
creates an instance, update updates an existing one.
|
|
35
|
+
2. **Does `docs/.template` exist?** Yes means the project comes from a template, and refactor is not the right
|
|
36
|
+
path. Suggest `afm-init` (it detects the marker and branches to the from-template flow).
|
|
37
|
+
3. **Is this real brownfield?** `afm refactor --mechanical --dry-run` checks it and states the reasons: a
|
|
38
|
+
manifest with real dependencies, a populated source root, a git history of more than 20 commits. Any
|
|
39
|
+
false means this is not brownfield: suggest `afm-init` (*"This project does not yet seem to have a relevant
|
|
40
|
+
codebase. `afm-init` does the greenfield bootstrap. Want to run that?"*).
|
|
41
|
+
4. **Is the shipped content resolved?** `afm preflight` exit 4 means it is not. Report it. Do not guess the
|
|
42
|
+
content and do not fall back silently.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Procedure (brownfield refactor)
|
|
47
|
+
|
|
48
|
+
For brownfield projects without `docs/.afm-version`:
|
|
49
|
+
|
|
50
|
+
1. Read `afm path interview/refactor` end to end.
|
|
51
|
+
2. Ask the closed decisions the mechanical pass needs (`afm ask init`), announce the plan in one line and
|
|
52
|
+
proceed directly: **no gate** (invoking `afm-refactor` already approves this, per invariant principle #6).
|
|
53
|
+
3. **Run the 4 parts literally:**
|
|
54
|
+
- **Part A**: `afm refactor --mechanical` runs the autonomous code archaeology (stack scan, folder tree,
|
|
55
|
+
entity scan, CI and hooks scan, hard-rule audit, retroactive ADR candidates) and prints the report. No
|
|
56
|
+
turns with the operator. Read the README and the history yourself for the prose-only facts.
|
|
57
|
+
- **Part B**: the same command materialized the skeleton of `docs/{prd,ach,afm,ust,gotchas}`; fill the
|
|
58
|
+
drafts from the report with `[TBD]` in the gaps and report a summary plus paths. Review happens through
|
|
59
|
+
`git diff`. No review gate applies.
|
|
60
|
+
- **Part C**: run a short interview, one question per turn, closed ones through `afm ask <op>`
|
|
61
|
+
recommendation-first (invariant principle #8). Cover the pain point, the persona and the README summary
|
|
62
|
+
validation, retroactive ADRs (with a load-bearing guardrail, invariant principle #9), confirmed gotchas,
|
|
63
|
+
DoD + pre-push and code-style seeds.
|
|
64
|
+
- **Part D**: write `afm.md § 3.1` with forward-only rules based on the audit. Check `docs/.afm-version` and
|
|
65
|
+
`AGENTS.md`.
|
|
66
|
+
4. Apply the opt-in modules detected in A.1. For each stack, merge `afm path modules/<stack>/ach.patch` and
|
|
67
|
+
`afm path modules/<stack>/rules.patch` into the draft. A `gotchas.seed` becomes a commented block in the
|
|
68
|
+
gotchas doc. Only the entries the operator confirms in C.9.5 become active.
|
|
69
|
+
5. Print a closing summary plus a suggested commit (see the roadmap § Closing).
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Invariant principles
|
|
74
|
+
|
|
75
|
+
Single canonical source: `afm path PRINCIPLES`. For this skill (brownfield), **all** apply: the 8 universals
|
|
76
|
+
§1-8 plus the addition §9 (a retroactive ADR is load-bearing-only). #9 separates refactor from init. Init
|
|
77
|
+
forbids retroactive ADRs.
|
|
78
|
+
|
|
79
|
+
## Continuous doctrine
|
|
80
|
+
|
|
81
|
+
Passive mode (`afm-reconcile`) is the responsibility of the `reconcile` skill. It is always-on in any AFM
|
|
82
|
+
project session. This skill covers only the active refactor procedure.
|
|
83
|
+
|
|
84
|
+
## Version
|
|
85
|
+
|
|
86
|
+
`afm version` prints the version in use. History: `afm path CHANGELOG`.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-reflect
|
|
3
|
+
description: |
|
|
4
|
+
Finds where the local docs failed AS A HARNESS in this session. 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
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
12
|
+
|
|
13
|
+
Mechanism skill of AFM. The canonical procedure is the op file that `afm path ops/reflect.md` prints.
|
|
14
|
+
|
|
15
|
+
> **Carve-out (does not overlap existing ops):** `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. `diagnose` runs a **static** scan. `reflect` uses **behavioral** evidence from the session trajectory. Only the agent sees its own stumble. `evolve` is the **orchestrator**. It composes `reflect` and `diagnose` into one cycle with a single gate.
|
|
16
|
+
|
|
17
|
+
## When not to activate
|
|
18
|
+
|
|
19
|
+
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.
|
|
20
|
+
|
|
21
|
+
Learning a new fact, gotcha, or decision belongs to `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`.
|
|
22
|
+
|
|
23
|
+
## Pre-check
|
|
24
|
+
|
|
25
|
+
1. **Does `<consumer>/docs/.afm-version` exist?** If not, stop. Suggest `afm-init` (greenfield) or `afm-refactor` (brownfield) first.
|
|
26
|
+
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.
|
|
27
|
+
3. **Did the session hit a doc-friction event** (or an articulated symptom)? If not, report "no doc friction observed" and stop. Reflection without behavioral evidence is forbidden (#5).
|
|
28
|
+
|
|
29
|
+
## Procedure
|
|
30
|
+
|
|
31
|
+
Read the op (`afm path ops/reflect.md`) end to end. Follow it literally.
|
|
32
|
+
|
|
33
|
+
The steps are:
|
|
34
|
+
|
|
35
|
+
**1. Collection.** Build the behavioral signature φ_b = `(symptom-lived, doc-causal-status, mechanism)`. Cite both the doc passage **and** the session event.
|
|
36
|
+
|
|
37
|
+
**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.
|
|
38
|
+
|
|
39
|
+
**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.
|
|
40
|
+
|
|
41
|
+
**4. Own gate.** Ask item by item, earned, with `afm ask reflect --scope <item-slug>`. `evolve` suppresses this gate.
|
|
42
|
+
|
|
43
|
+
**5. Record.** Write to `docs/evolution/NNN-<date>.md`. Add a `promote` suggestion when the finding generalizes. Hand off to `reconcile`.
|
|
44
|
+
|
|
45
|
+
## Invariant principles
|
|
46
|
+
|
|
47
|
+
The single canonical source is `PRINCIPLES.md` (`afm path PRINCIPLES.md`). Universals §1-8 apply.
|
|
48
|
+
|
|
49
|
+
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.
|
|
50
|
+
|
|
51
|
+
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.
|
|
52
|
+
|
|
53
|
+
## Version
|
|
54
|
+
|
|
55
|
+
Content version: `afm version` prints it.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-remediate
|
|
3
|
+
description: |
|
|
4
|
+
Reads the open failures of the state store (`afm failures promotable`) and proposes the durable artifact: a procedure when the fix is mechanical, a learning when it is conceptual. A failure enters by external signal, never by self-judgment.
|
|
5
|
+
Activates: `afm-remediate`, "this failed again, fix it for real", "create a runbook for this", "record this lesson for the next agent sessions".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# AFM — Remediate (CRITIC loop)
|
|
10
|
+
|
|
11
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
12
|
+
|
|
13
|
+
Atomic skill of AFM. The canonical procedure is the op file that `afm path ops/remediate.md` prints.
|
|
14
|
+
|
|
15
|
+
## When NOT to activate
|
|
16
|
+
|
|
17
|
+
This is a disambiguation for a skill that already activated. It is not an activation trigger. That is why it lives in the body and not in the resident listing.
|
|
18
|
+
|
|
19
|
+
Use `afm.md § 5.1` for an in-task retry at the moment of the error. Use `afm-gotcha` for an SDK surprise with no failure of its own. Do not invent a failure. Only act on a recorded failure that `afm failures promotable` lists, or on an explicit user correction.
|
|
20
|
+
|
|
21
|
+
## Pre-check
|
|
22
|
+
|
|
23
|
+
1. **Does `<consumer>/docs/.afm-version` exist?** If not, stop. Suggest `afm-init` for a greenfield project or `afm-refactor` for a brownfield project.
|
|
24
|
+
2. **Is there an open failure?** Run `afm failures promotable`. With `no failure is promotable` and no explicit user correction, report "nothing to remediate" and stop. An empty diagnosis is a valid result.
|
|
25
|
+
3. **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.
|
|
26
|
+
|
|
27
|
+
## Procedure
|
|
28
|
+
|
|
29
|
+
Read the op (`afm path ops/remediate.md`) end to end and follow it literally. It includes the promotion gate (#5): 1 user correction OR at least 2 mechanical occurrences promote a failure. A transient failure does not promote. It also includes classification through the rubric `rubrics/failure-classification.md` (`afm path rubrics/failure-classification.md`). For each delta, propose the artifact (procedure or learning) and cite the source `sig=` (hard rule 19). Ask the artifact question with `afm ask remediate --scope <sig>`, materialize the result, close the signature with `afm failures close --sig <sig> --as remediated`, and report it (#6).
|
|
30
|
+
|
|
31
|
+
## Invariant principles
|
|
32
|
+
|
|
33
|
+
The single canonical source is `PRINCIPLES.md` (`afm path PRINCIPLES.md`). See in particular #3 (CRITIC corollary — recognition by tool, not self-judgment). See also #5 (do not promote a failure without recurrence or an oracle) and #6 (propose only, the human approves).
|
|
34
|
+
|
|
35
|
+
## Continuous doctrine
|
|
36
|
+
|
|
37
|
+
The `reconcile` skill owns passive mode, and it is always on. It reads `afm failures promotable` at the end of the turn and can propose remediation with no explicit command. The `evolve` cycle uses the failure events as evidence for `reflect`, toward a final remediation. This skill is the active record of the loop.
|
|
38
|
+
|
|
39
|
+
## Version
|
|
40
|
+
|
|
41
|
+
Content version: `afm version` prints it.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-restructure
|
|
3
|
+
description: |
|
|
4
|
+
Checks the context architecture of the local docs. It looks at staleness against the code, findability across layers, and the hot versus on-demand partition. It relocates content that already exists and writes no new content.
|
|
5
|
+
Activates: `afm-restructure`, "the doc is stale versus the code", "this should load only on demand", "the guidance exists but I cannot find it in the doc".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# AFM — Restructure (context architecture health)
|
|
10
|
+
|
|
11
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
12
|
+
|
|
13
|
+
This is a mechanism skill of AFM. The canonical procedure is the op file that `afm path ops/restructure.md` prints.
|
|
14
|
+
|
|
15
|
+
> **Carve-out (does not overlap existing ops):** `diagnose` A1 finds a **dead reference** (the path does not exist). `restructure` staleness finds a path that **exists but changed** while the doc did not. `reconcile` adds **missing** information. `restructure` relocates information that **exists but sits in the wrong place**. `reflect` targets **clarity**. `restructure` targets **location and freshness**. `evolve` is the **orchestrator** that composes this skill when `diagnose` flags staleness or bloat.
|
|
16
|
+
>
|
|
17
|
+
> **Maturity (honest YAGNI):** the actionable core today is **staleness** (from git) plus **findability**. **Temperature tiering** (always-hot vs on-demand) is an **opt-in** ADR proposal, only for a doc that has actually outgrown its size. Small docs do not need it.
|
|
18
|
+
|
|
19
|
+
## When NOT to activate
|
|
20
|
+
|
|
21
|
+
This is a disambiguation guide for a skill that has already activated. It does not gate activation, so it stays in the body, not in the resident listing.
|
|
22
|
+
|
|
23
|
+
A path that does not exist belongs to `afm-diagnose` (A1). Staleness means the path exists but changed. Information never documented belongs to `reconcile` → `afm-gotcha` or `afm-rule`. An ambiguous doc belongs to `afm-reflect`. Merging gotchas belongs to `afm-generalize`. The full cycle belongs to `afm-evolve`.
|
|
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. **Is git available?** The staleness scan needs the git history. Without git, `afm doctor` marks this axis "not covered: no git". Never omit it.
|
|
30
|
+
|
|
31
|
+
## Procedure
|
|
32
|
+
|
|
33
|
+
Read the op (`afm path ops/restructure.md`) end to end. Follow it literally. Use these five steps.
|
|
34
|
+
|
|
35
|
+
1. **Staleness scan.** `afm doctor --json` runs it (findings with axis `staleness` and `dead-gotcha`); read them. The git trigger fires in two cases. First case: a path cited in the doc has a later last commit than the doc. Second case: the doc has been stale for more than N commits. A hit is a candidate, not a verdict. The scan never rewrites the doc on its own.
|
|
36
|
+
2. **Findability.** Relocate or cross-reference information that exists but sits buried or in the wrong doc. Cite both locations. Route information that is genuinely missing to `reconcile`.
|
|
37
|
+
3. **Temperature partition.** Propose a hot/on-demand loading strategy as an opt-in ADR. Do this only when a doc has outgrown its size. Preserve 100% of the content.
|
|
38
|
+
4. **Its own gate.** This gate is load-bearing and earned, one `afm ask restructure --scope <item-slug>` per finding. It follows the **shared-proposal discipline** in `evolve.md` (`afm path ops/evolve.md`), instead of a duplicate copy of that discipline. `evolve` suppresses this gate when it runs.
|
|
39
|
+
5. **Record.** Write the result to `docs/evolution/NNN-<date>.md`. Suggest `promote` if the finding generalizes.
|
|
40
|
+
|
|
41
|
+
## Invariant principles
|
|
42
|
+
|
|
43
|
+
The single canonical source is `PRINCIPLES.md` (`afm path PRINCIPLES.md`). Universal principles §1-8 apply here. Four principles matter most for this skill.
|
|
44
|
+
|
|
45
|
+
- #2: get git evidence before you propose a change.
|
|
46
|
+
- #3: staleness needs an executable git trigger.
|
|
47
|
+
- #4/#5: missing product content becomes `[TBD]` or goes to `reconcile`. Never invent it.
|
|
48
|
+
- #6/#8: self-check the work, then pass an earned gate.
|
|
49
|
+
|
|
50
|
+
**No new principle here.** `restructure` is a composed materialization. The doctrine lives in the op file.
|
|
51
|
+
|
|
52
|
+
## Version
|
|
53
|
+
|
|
54
|
+
Content version: `afm version` prints it.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-rule
|
|
3
|
+
description: |
|
|
4
|
+
Adds a hard rule to `<consumer>/docs/afm.md § 3`. A mechanical trigger is mandatory and must return 0 or 1, such as `grep`, `wc -l`, `git diff` or `tsc`. A code review or a PR template is not a trigger. Without a trigger the entry becomes a principle in § 1.3.
|
|
5
|
+
Activates: `afm-rule`, "new hard rule", "this should be a rule".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Rule
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
Atomic skill of `afm`. The canonical procedure is the op `afm path ops/rule`. The CLI owns the number, the
|
|
13
|
+
rule file, the index line and the runner skeleton, and refuses a rule with no honest trigger form. This
|
|
14
|
+
skill keeps only the judgment.
|
|
15
|
+
|
|
16
|
+
## When NOT to activate
|
|
17
|
+
|
|
18
|
+
This is a disambiguation for a skill that already activated. Use `afm-adr` for a one-off architectural
|
|
19
|
+
decision. Use `afm-gotcha` for a counterintuitive surprise. Use `afm-generalize` to merge rules or gotchas
|
|
20
|
+
that already exist.
|
|
21
|
+
|
|
22
|
+
## Pre-check
|
|
23
|
+
|
|
24
|
+
`afm preflight`. Exit 3 means there is no instance: stop and suggest `afm-init` or `afm-refactor` first.
|
|
25
|
+
|
|
26
|
+
## Procedure (judgment only)
|
|
27
|
+
|
|
28
|
+
1. Confirm the mechanical trigger as free text, and push back hard: no trigger means a principle in § 1.3.
|
|
29
|
+
Run the anti-Goodhart test: can a diff pass the trigger while it breaks the rule's intent? If yes, rewrite
|
|
30
|
+
or downgrade it.
|
|
31
|
+
2. Measure the repo for any constant and propose the value with the measurement. An unanswered constant is
|
|
32
|
+
`[TBD]`. Check for an existing versioned script and cite it.
|
|
33
|
+
3. Choose the surface: `afm ask rule`. Run `afm rule new <slug> --trigger '<command>' --surface <surface>` and
|
|
34
|
+
report the paths (#6). For `pre-commit` or `ci`, follow "Install the gate" in the op: `afm gate --baseline`
|
|
35
|
+
before the gate goes on.
|
|
36
|
+
4. In a refactored project only, ask where the rule enters: `afm ask rule-scope` (universal § 3 or
|
|
37
|
+
forward-only § 3.1). The scope decision reflects intent, so it stays fixed once made.
|
|
38
|
+
|
|
39
|
+
## Invariant principles
|
|
40
|
+
|
|
41
|
+
Single canonical source: `afm path PRINCIPLES`. Universals §1-8 apply. Note especially #3 (a hard rule needs
|
|
42
|
+
a mechanical trigger, or it is a principle instead) and #6 (autonomy-first: materialize the change and
|
|
43
|
+
report it).
|
|
44
|
+
|
|
45
|
+
Passive mode (`afm-reconcile`) is always on and can propose `afm-rule` when it detects the signal "the user
|
|
46
|
+
corrected an approach with a reusable rule".
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-specify
|
|
3
|
+
description: |
|
|
4
|
+
Opens a feature folder at `docs/features/NNN-slug/spec.md`, linked to a user story. A mechanical heuristic decides first, because a feature folder for a trivial change is overhead.
|
|
5
|
+
Activates: `afm-specify <slug>`, "open a feature", "start a new feature", "create a feature folder".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Specify
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
An atomic skill. The procedure lives in the op: read it with `afm path ops/specify.md`, end to end, and follow it literally.
|
|
13
|
+
|
|
14
|
+
## When NOT to activate
|
|
15
|
+
|
|
16
|
+
A trivial change (no feature folder needed) goes straight to the `afm.md § 2` loop. A full end-to-end delivery is `deliver`, which composes this op.
|
|
17
|
+
|
|
18
|
+
## Pre-check
|
|
19
|
+
|
|
20
|
+
Run `afm preflight`. Exit 3 means no `docs/.afm-version`: stop and suggest `afm-init` or `afm-refactor`. Exit 4 or 5: report the line it printed.
|
|
21
|
+
|
|
22
|
+
## Procedure
|
|
23
|
+
|
|
24
|
+
The number comes from `afm next-id feature`, never by hand. What is left to you is judgment: compute the trigger heuristic from the scan (ask the `heuristic` question only when borderline), find the linked US in `docs/ust.md` before asking (`afm ask specify`), create the spec with `afm new feature-spec <slug>` (the generator writes the frontmatter the template names) and fill its body, update the `Spec:` line of the US, and report the open `[NEEDS CLARIFICATION:]` items. Autonomy-first: write and report, review through `git diff`.
|
|
25
|
+
|
|
26
|
+
## Invariant principles
|
|
27
|
+
|
|
28
|
+
Single canonical source: `afm path PRINCIPLES.md`. Universals §1-8 apply. In particular #2 (discover-first: compute the heuristic and the US from the scan), #5 (never invent a success criterion) and #6 (autonomy-first).
|
|
29
|
+
|
|
30
|
+
## Continuous doctrine
|
|
31
|
+
|
|
32
|
+
Passive mode is the always-on `reconcile` skill. This skill covers only the opening of the feature.
|
|
33
|
+
|
|
34
|
+
## Version
|
|
35
|
+
|
|
36
|
+
`afm version`. History: `afm path CHANGELOG.md`.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-tasks
|
|
3
|
+
description: |
|
|
4
|
+
Generates `tasks.md` in TDD order, and marks the parallel tasks with `[P]`. Every task references a user story or a requirement. It hard-blocks on an open `[NEEDS CLARIFICATION:]` in the plan.
|
|
5
|
+
Activates: `afm-tasks [<feature>]`, "generate the tasks", "break the feature into tasks".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Tasks
|
|
9
|
+
|
|
10
|
+
An atomic skill. The procedure lives in the op: read it with `afm path ops/tasks.md`, end to end, and follow it literally.
|
|
11
|
+
|
|
12
|
+
## When NOT to activate
|
|
13
|
+
|
|
14
|
+
There is no `plan.md` yet: run `afm-plan` first. An end-to-end delivery is `deliver`, which composes this op.
|
|
15
|
+
|
|
16
|
+
## Pre-check
|
|
17
|
+
|
|
18
|
+
Run `afm preflight` (exit 3: stop and suggest `afm-init` or `afm-refactor`). Run `afm feature status <NNN> --json`: a non-empty `blockers` is an open `[NEEDS CLARIFICATION:]` in the plan. That is a hard refusal with no override, not a question.
|
|
19
|
+
|
|
20
|
+
## Procedure
|
|
21
|
+
|
|
22
|
+
Break the plan into four phases (Setup, Foundation RED/GREEN, Boundary, Reconciliation) from the generator (`afm new feature-tasks --feature NNN-slug`). Mark `[P]` only where a task does not depend on the one before it; a GREEN never is. Give every task a `US-NNN` or `RF-NN`. Then run `afm feature lint <NNN>` and fix what it reports until it exits 0. The last task closes the `status:` keys. Autonomy-first: write and report.
|
|
23
|
+
|
|
24
|
+
## Invariant principles
|
|
25
|
+
|
|
26
|
+
Single canonical source: `afm path PRINCIPLES.md`. Universals §1-8 apply. In particular #5 (every task traces to a US or RF) and rule 1 (TDD: no GREEN without the RED before it).
|
|
27
|
+
|
|
28
|
+
## Continuous doctrine
|
|
29
|
+
|
|
30
|
+
Passive mode is the always-on `reconcile` skill. This skill covers only the task list.
|
|
31
|
+
|
|
32
|
+
## Version
|
|
33
|
+
|
|
34
|
+
`afm version`. History: `afm path CHANGELOG.md`.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-update
|
|
3
|
+
description: |
|
|
4
|
+
Syncs `<consumer>/docs/` with the current plugin version. It materializes the consumer-facing deltas between the pinned version and the shipped version, then moves the pin. It reads the plugin and never edits it.
|
|
5
|
+
Activates: `afm-update`, "bump the methodology version", "sync docs with the new plugin", "my `.afm-version` is behind".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Update (sync instance-plugin)
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
This is the sync skill of `afm`. The canonical procedure is the op `afm path ops/update`. The CLI runs the
|
|
13
|
+
codemod registry, proves each op and moves the pin. This skill keeps the judgment.
|
|
14
|
+
|
|
15
|
+
> **Carve-out (does not overlap existing ops):** `afm-init` and `afm-refactor` **create** the instance
|
|
16
|
+
> (bootstrap). `update` brings an **existing** instance forward, the path that `afm-refactor` refuses.
|
|
17
|
+
> `afm-diagnose` only **detects** drift on axis A3 (read-only). `update` **resolves** it. `afm-promote`
|
|
18
|
+
> **records** a finding meant for the plugin. `update` reads the plugin and materializes it into the
|
|
19
|
+
> instance, and neither touches the shipped content: an absolute boundary (#7). `afm-evolve` is the
|
|
20
|
+
> **cycle** that composes `update` on axis A3.
|
|
21
|
+
|
|
22
|
+
## When NOT to activate
|
|
23
|
+
|
|
24
|
+
This is a disambiguation for a skill that already activated. Use `afm-init` or `afm-refactor` if no instance
|
|
25
|
+
is bootstrapped yet. Skip `update` if the pinned version already equals the shipped version (no drift). Use
|
|
26
|
+
`afm-promote` to carry a learning from the instance TO the plugin (the opposite direction). Use
|
|
27
|
+
`afm-diagnose` to only CHECK for drift. Use `afm-evolve` for the full cycle.
|
|
28
|
+
|
|
29
|
+
## Pre-check
|
|
30
|
+
|
|
31
|
+
`afm update --dry-run` does it: exit 3 means no instance (suggest `afm-init` or `afm-refactor`), exit 4 means
|
|
32
|
+
the shipped content does not resolve (report it, do not fall back silently), and "already up to date" ends
|
|
33
|
+
the run. A pin **ahead** of the binary is an anomaly: report it, never roll it back.
|
|
34
|
+
|
|
35
|
+
## Procedure (judgment only)
|
|
36
|
+
|
|
37
|
+
1. Read the dry run as one package and show it as evidence. Ask `afm ask update`. Under `afm-evolve` this gate
|
|
38
|
+
is suppressed.
|
|
39
|
+
2. Run `afm update`. It moves the pin only at the end, and keeps it where it was when a codemod fails.
|
|
40
|
+
3. Exit 6 means agent tasks are pending: do each one inside its scope (`afm lint --fix <path>` fixes the
|
|
41
|
+
frontmatter findings), then run `afm-update` again. `afm update --accept <path>` closes a sync on a file
|
|
42
|
+
you merged by hand. An opt-in delta is reported and never applied. Exit 5 (a major crossing) is
|
|
43
|
+
`afm migrate`.
|
|
44
|
+
4. **Language migration** (when the instance is not English): read `prd.md` § 11.1 FIRST and derive the
|
|
45
|
+
excluded scope from it, and only then read a file. `[TBD]` there stops the step and asks
|
|
46
|
+
`afm ask update-strings`. It never picks a language. The artifacts question is
|
|
47
|
+
`afm ask update-artifacts`.
|
|
48
|
+
5. Post-conditions: `afm index --check` returns 0 and the plugin boundary stays clean. Report in chat what
|
|
49
|
+
migrated and what stayed pending. Under `afm-evolve`, feed it to `docs/evolution/`.
|
|
50
|
+
|
|
51
|
+
## Invariant principles
|
|
52
|
+
|
|
53
|
+
Single canonical source: `afm path PRINCIPLES`. Universals §1-8 apply. Follow #2 (discover-first): the proof of
|
|
54
|
+
need is the grep that shows what is missing. Follow #4/#5: materialize only what the plugin already provides
|
|
55
|
+
ready-made, and never invent missing product content. Follow #6 (autonomy-first with a gate). Bright line
|
|
56
|
+
#7 applies: only **read** the plugin, and write only to the instance.
|
|
57
|
+
|
|
58
|
+
**No new principle here.** `update` is composed materialization. The doctrine lives in the op file.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: afm-verify
|
|
3
|
+
description: |
|
|
4
|
+
Stamps a human verification on one doc under `docs/`. It writes the OKF `verified` field and is the only writer of that field. Use it when a person states they reviewed a document.
|
|
5
|
+
Activates: `afm-verify <path>`, "I reviewed this rule", "mark this gotcha as verified", "sign off on this ADR".
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# AFM — Verify (stamp a human review)
|
|
9
|
+
|
|
10
|
+
> **Questions in this host.** `afm ask <op>` prompts only in a terminal, and your shell tool has none: it exits 2. Run `afm ask <op> --json` instead and put each pending question to the operator with the host's question tool when it has one, and otherwise in chat as a numbered list: the `prompt`, then the `options` with their descriptions, the recommended one first and marked. Wait for the answer. Then record each choice with `afm answer <op> <id> <label>` (one label per selected option). Run `afm ask <op>` again: `all questions answered` means the op may go on.
|
|
11
|
+
|
|
12
|
+
Atomic skill of `afm`. The canonical procedure is the op `afm path ops/verify`.
|
|
13
|
+
|
|
14
|
+
## When not to activate
|
|
15
|
+
|
|
16
|
+
Never on ordinary work, and never on your own output. This skill records that a PERSON read a document. An
|
|
17
|
+
agent stamping its own writing produces a lie the trust tier cannot detect.
|
|
18
|
+
|
|
19
|
+
## Pre-check
|
|
20
|
+
|
|
21
|
+
1. `afm preflight`. Exit 3 means there is no instance: stop.
|
|
22
|
+
2. **Did a person state they reviewed the file?** If not, stop and ask: `afm ask verify`. Inference is not
|
|
23
|
+
review.
|
|
24
|
+
3. The file must carry a frontmatter block, or there is no contract to stamp.
|
|
25
|
+
|
|
26
|
+
## Procedure (judgment only)
|
|
27
|
+
|
|
28
|
+
Run `afm verify <path under docs/>` (add `--as <id>` when no git user name is set). The command refuses an
|
|
29
|
+
agent actor. Report the tier that resulted and what it means.
|
|
30
|
+
|
|
31
|
+
## Invariant principles
|
|
32
|
+
|
|
33
|
+
Single canonical source: `afm path PRINCIPLES`. Universals §1-8 apply. #5 is load-bearing here.
|
package/README.md
DELETED