@tenkara/afm-linux-arm64 4.0.0-alpha.7 → 4.0.0-alpha.8
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 +2 -2
- package/content/CHANGELOG.md +28 -0
- package/content/PRINCIPLES.md +0 -2
- package/content/README-light.md +0 -2
- package/content/README.md +0 -2
- package/content/core/ach.md +0 -5
- package/content/core/afm.md +23 -5
- package/content/core/prd.md +0 -2
- package/content/core/protocol.md +1 -3
- package/content/hooks/README.md +0 -2
- package/content/interview/bootstrap.md +4 -2
- package/content/interview/promotion.md +0 -2
- package/content/interview/refactor.md +0 -2
- package/content/interview/triggers.md +0 -2
- package/content/modules/vireya-ui/ach.patch.md +1 -1
- package/content/ops/analyze.md +8 -7
- package/content/ops/deliver.md +23 -25
- package/content/ops/diagnose.md +1 -4
- package/content/ops/evolve.md +1 -4
- package/content/ops/export-template.md +1 -1
- package/content/ops/generalize.md +1 -4
- package/content/ops/policy.md +0 -2
- package/content/ops/reflect.md +1 -4
- package/content/ops/remediate.md +1 -4
- package/content/ops/restructure.md +1 -4
- package/content/ops/rule.md +0 -2
- package/content/ops/tasks.md +18 -18
- package/content/ops/update.md +3 -2
- package/content/ops/verify.md +0 -2
- package/content/questions/init.questions.yaml +13 -0
- package/content/rubrics/failure-classification.md +0 -2
- package/content/rubrics/solid-triggers.md +0 -2
- package/content/skills/analyze.md +1 -1
- package/content/skills/deliver.md +2 -2
- package/content/skills/tasks.md +3 -3
- package/content/templates/adr.template.md +1 -1
- package/content/templates/evolution-report.template.md +0 -2
- package/content/templates/feature-plan.template.md +0 -2
- package/content/templates/feature-research.template.md +1 -2
- package/content/templates/feature-spec.template.md +1 -1
- package/content/templates/feature-tasks.induced.template.md +58 -34
- package/content/templates/feature-tasks.template.md +56 -34
- package/content/templates/protocols/p1.md +1 -1
- package/content/templates/protocols/p2.md +1 -1
- package/content/templates/protocols/p3.md +1 -1
- package/package.json +1 -1
- package/plugin/agy/plugin.json +1 -1
- package/plugin/agy/skills/afm-analyze/SKILL.md +1 -1
- package/plugin/agy/skills/afm-deliver/SKILL.md +2 -2
- package/plugin/agy/skills/afm-tasks/SKILL.md +3 -3
- package/plugin/claude-code/.claude-plugin/plugin.json +1 -1
- package/plugin/claude-code/skills/analyze/SKILL.md +1 -1
- package/plugin/claude-code/skills/deliver/SKILL.md +2 -2
- package/plugin/claude-code/skills/tasks/SKILL.md +3 -3
- package/plugin/opencode/afm/index.js +245 -0
- package/plugin/opencode/afm/tui.js +21 -0
- package/plugin/opencode/agents/afm-executor.md +22 -14
- package/plugin/opencode/agents/afm-explorer.md +64 -28
- package/plugin/opencode/agents/afm-reviewer.md +64 -28
- package/plugin/opencode/skills/afm-analyze/SKILL.md +1 -1
- package/plugin/opencode/skills/afm-deliver/SKILL.md +2 -2
- package/plugin/opencode/skills/afm-tasks/SKILL.md +3 -3
- package/plugin/opencode/afm.js +0 -196
package/content/ops/reflect.md
CHANGED
|
@@ -4,11 +4,10 @@ description: Refines a doc that guided the agent wrong, using evidence from the
|
|
|
4
4
|
load: warm
|
|
5
5
|
writes: ["docs/evolution/*.md"]
|
|
6
6
|
composes: []
|
|
7
|
+
ancestors: the *Reflect* operator from Autogenesis (arXiv 2604.15034 — execution traces build causal hypotheses of failure), composed with the *MetaReflect* step of MetaReflection (arXiv 2405.13009 — self-reflection on failure is **episodic memory**).
|
|
7
8
|
---
|
|
8
9
|
# Sub-flow: behavioral self-reflection on the docs (`reflect`)
|
|
9
10
|
|
|
10
|
-
> **In this file:** What reflect is / is not · Pre-check · 1. Behavioral evidence collection · 2. Self-critique: doc-wrong vs agent-non-conforman… · 3. Proposal: make the doc more assertive + s… · 4. Own gate (à-la-carte) — suppressed und… · 5. Record + session closing + handoff · Suppression contract · Anti-patterns
|
|
11
|
-
|
|
12
11
|
|
|
13
12
|
> **Form** — effect: edits + `evolution/<date>-NNN` + `sessions/<...>` + candidates for `guardrails/` · trigger: `afm reflect`, composition, **cadence** · precondition: friction lived in the session · composed by: `evolve` 1.2, `deliver` 4.D · proposes: `afm evolve` (§ 5, à-la-carte only) · **degree of freedom: medium**
|
|
14
13
|
|
|
@@ -18,8 +17,6 @@ Triggers: `afm reflect`. Also natural language about a **doc that guided badly**
|
|
|
18
17
|
>
|
|
19
18
|
> **Mechanism, not conductor.** `reflect` is one of the mechanism skills in the self-evolution cycle. `evolve` is the orchestrator that composes it. `reflect` runs **à-la-carte** (this doc, with its own gate). Or it runs inside the `evolve` cycle, which suppresses the own gate and consolidates results — see `evolve.md § Suppression contract`.
|
|
20
19
|
>
|
|
21
|
-
> **Ancestors:** the *Reflect* operator from Autogenesis (arXiv 2604.15034 — execution traces build causal hypotheses of failure), composed with the *MetaReflect* step of MetaReflection (arXiv 2405.13009 — self-reflection on failure is **episodic memory**).
|
|
22
|
-
>
|
|
23
20
|
> Reflect(session_trace) -> φ_b:
|
|
24
21
|
> 1. scan session_trace for a point where a core doc guided the agent badly
|
|
25
22
|
> 2. φ_b := (symptom-lived, causal-status-of-the-doc, mechanism)
|
package/content/ops/remediate.md
CHANGED
|
@@ -4,11 +4,10 @@ description: Turns a failure that repeats into a durable artifact, recognized by
|
|
|
4
4
|
load: warm
|
|
5
5
|
writes: ["docs/procedures/*.md", "docs/learnings/*.md", "docs/guardrails/*.md"]
|
|
6
6
|
composes: []
|
|
7
|
+
ancestors: "CRITIC (arXiv 2305.11738) — failure recognition is anchored in an **external tool or signal**. Self-critique with no tool degrades (PRINCIPLES #3). This op complements the short in-task loop in `afm.md § 5.1` (ephemeral Reflexion, cap 2). `remediate` is the **long loop**: when a failure crosses the § 5.1 terminal (non-transient) and recurs, it becomes a **durable** remediation."
|
|
7
8
|
---
|
|
8
9
|
# Sub-flow: remediation of a recognized failure (`remediate`) — CRITIC loop
|
|
9
10
|
|
|
10
|
-
> **In this file:** What `remediate` is / is not · Pre-check · Procedure · Composition (suppression contract) · Anti-patterns
|
|
11
|
-
|
|
12
11
|
> **Form** — effect: `guardrails/`, `procedures/`, or `learnings/` · trigger: `afm remediate`, composition · precondition: a failure in the state store that `afm failures promotable` lists · composed by: `evolve` 1.3, `reconcile` · **degree of freedom: medium**
|
|
13
12
|
|
|
14
13
|
Triggers: `afm remediate`.
|
|
@@ -23,8 +22,6 @@ Example phrases:
|
|
|
23
22
|
> **Installing a guardrail uses one procedure.** When the rubric classifies the failure as *mechanizable* and the target is `docs/guardrails/`, follow [`rule.md` § Install the gate](./rule.md) — it covers discovery of the surface the project already runs, the runner built from [`../templates/guardrail-runner.template.md`](../templates/guardrail-runner.template.md), **measuring HEAD before turning the gate on** (a gate that starts red gets turned off the next day), measured cost, doc-runner sync, and recording with `origin: recurring-failure`. This op does not repeat those steps (rule 34): the origin differs, but the install path is the same.
|
|
24
23
|
|
|
25
24
|
> **Target = this project's local docs (`<consumer>/docs/`), never the plugin.** Like every AFM write family, `remediate` writes to `<consumer>/docs/` (guardrails/procedures/learnings) and **proposes** — the human approves (#6). No op writes to the plugin: `afm promote` only records a finding for it.
|
|
26
|
-
>
|
|
27
|
-
> **Ancestor:** CRITIC (arXiv 2305.11738) — failure recognition is anchored in an **external tool or signal**. Self-critique with no tool degrades (PRINCIPLES #3). This op complements the short in-task loop in `afm.md § 5.1` (ephemeral Reflexion, cap 2). `remediate` is the **long loop**: when a failure crosses the § 5.1 terminal (non-transient) and recurs, it becomes a **durable** remediation.
|
|
28
25
|
|
|
29
26
|
---
|
|
30
27
|
|
|
@@ -4,11 +4,10 @@ description: Checks the health of the context architecture and finds what went s
|
|
|
4
4
|
load: warm
|
|
5
5
|
writes: ["docs/evolution/*.md"]
|
|
6
6
|
composes: []
|
|
7
|
+
ancestors: Codified-Context (arXiv 2602.20478).
|
|
7
8
|
---
|
|
8
9
|
# Sub-flow: context architecture health (`restructure`)
|
|
9
10
|
|
|
10
|
-
> **In this file:** What restructure is / is not · Pre-check · 1. Staleness scan · 2. Findability · 3. Partition by temperature · 4. Own gate (a-la-carte) + application — s… · 5. Record + handoff · Suppression contract · Anti-patterns
|
|
11
|
-
|
|
12
11
|
|
|
13
12
|
> **Form** — effect: edits + opt-in ADR · trigger: `afm restructure`, composition · pre-condition: git + `bites`/`last_bite` · composed by: `evolve` 1.3 · **degree of freedom: medium**
|
|
14
13
|
|
|
@@ -18,8 +17,6 @@ Triggers: `afm restructure`, or natural language about **structure/staleness** (
|
|
|
18
17
|
>
|
|
19
18
|
> **Mechanism, not conductor.** `restructure` is the mechanism skill that checks whether the docs are **structured to load efficiently** and **keep pace with the code**. It runs **a-la-carte** (own gate) OR inside the `evolve` cycle (which composes it when `diagnose` flags staleness or a badly partitioned doc — the own gate is then suppressed).
|
|
20
19
|
>
|
|
21
|
-
> **Ancestor:** Codified-Context (arXiv 2602.20478).
|
|
22
|
-
>
|
|
23
20
|
> CodifiedContext(doc, path):
|
|
24
21
|
> 1. Tier(content) := its memory temperature: hot-always (every turn) | per-task | on-demand (deep reference)
|
|
25
22
|
> 2. GitEvidence(claim) := a `git log` comparison that confirms or refutes claim # PRINCIPLES.md #2
|
package/content/ops/rule.md
CHANGED
|
@@ -7,8 +7,6 @@ composes: []
|
|
|
7
7
|
---
|
|
8
8
|
# Sub-flow: new hard rule
|
|
9
9
|
|
|
10
|
-
> **In this file:** Procedure · Install the gate · Inalienable rule · Additional for a refactored project
|
|
11
|
-
|
|
12
10
|
> **Form** — effect: one file under `docs/rules/` plus its index line in `afm.md § 3` (or a principle in `§ 1.3`) · trigger: `afm rule`, composition · precondition: executable 0/1 trigger · composed by: `evolve`, `reflect`, `generalize` · **degree of freedom: low**
|
|
13
11
|
|
|
14
12
|
Triggers: `afm rule`, or natural language ("new hard rule", "this should be a rule").
|
package/content/ops/tasks.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: op
|
|
3
|
-
description: Breaks a plan into tasks in TDD order,
|
|
3
|
+
description: Breaks a plan into the tasks list of tasks.md in TDD order, added with afm task add.
|
|
4
4
|
load: warm
|
|
5
5
|
writes: ["docs/features/*/tasks.md"]
|
|
6
6
|
composes: []
|
|
@@ -31,37 +31,37 @@ Procedure:
|
|
|
31
31
|
|
|
32
32
|
3. **Read `spec.md` and `plan.md`** in full, for the feature.
|
|
33
33
|
|
|
34
|
-
4. **Make the tasks
|
|
35
|
-
- **
|
|
36
|
-
- **
|
|
37
|
-
- **
|
|
38
|
-
- **
|
|
34
|
+
4. **Make the tasks.** Create the file with `afm new feature-tasks --feature NNN-slug --description "..."` (it writes the frontmatter and the template body), then add every task with `afm task add <NNN>`. The tasks live in the frontmatter `tasks:` list, never as a checklist in the body. The CLI assigns the id, validates the item and refuses one that breaks a rule `afm feature lint` grades (exit 1, the findings printed); you fill only the fields. The body is free prose (phases, notes). Build the list in this order:
|
|
35
|
+
- **Setup:** empty files with a signature and the test fixtures: `--kind setup --files <paths> --refs <US/RF> --text "..."`, typically `--parallel`.
|
|
36
|
+
- **Foundation:** for each Gherkin scenario `N` of spec § 3, a red task (`--kind red --scenario N --files <test path>`), then the green task that closes it (`--kind green --closes <the red's id> --files <code path>`). A refactor (`--kind refactor`) follows a green or another refactor, when it adds expected clarity.
|
|
37
|
+
- **Boundary:** each new component of plan § 2 is in the `--files` of one task, with the exact path of the plan cell. For each boundary of plan § 5 (`### Boundary <name>`), a red task and the green task with the Zod validation (rule 16), added with `--validates <name>`: the lint matches the boundary by that field, never by the task text.
|
|
38
|
+
- **Reconciliation (8.5):** one task, `--kind reconcile`, always the last (`afm task add` keeps it last, and reopens it when a task lands after it was done): update `ach.md § 3` if a component is new, add an ADR (`afm adr new <slug>`, see [`adr.md`](adr.md)) if the work materializes an architectural decision, set the US status to `done`, and set the `status:` frontmatter key of `spec.md`, `plan.md` and `tasks.md` to `done` (or `cancelled` for a feature dropped; hard rule 39). No body line carries the status. It is last because those edits change the hashed documents, so the delivery approval (`afm approve --check`) goes stale by design and nothing may run after it. `afm task done` refuses it while another task is open, a green while its red is open, and a refactor while the task before it is open.
|
|
39
39
|
|
|
40
|
-
5. **Mark
|
|
41
|
-
- Fixture tasks, tasks that touch different test files and doc tasks are typically
|
|
42
|
-
- A
|
|
43
|
-
- A
|
|
40
|
+
5. **Mark `--parallel`** where a task has no dependency on the task immediately before it. Heuristic:
|
|
41
|
+
- Fixture tasks, tasks that touch different test files and doc tasks are typically parallel.
|
|
42
|
+
- A green task depends on the red task it closes: never parallel.
|
|
43
|
+
- A refactor depends on its green task: never parallel.
|
|
44
44
|
|
|
45
|
-
6. **Every task references `US-NNN` or `RF-NN
|
|
45
|
+
6. **Every task references `US-NNN` or `RF-NN`** (`--refs`; the CLI refuses a task without one, except the reconcile task). The rule is `core/afm.md` § 2, step 7 COMMIT: a commit references a US or RF. If the feature has no linked US, fail earlier, at the pre-check.
|
|
46
46
|
|
|
47
|
-
7. **Mechanical validation before you report** (auto-correct, do not ask). Run `afm feature lint <NNN>`. It
|
|
47
|
+
7. **Mechanical validation before you report** (auto-correct, do not ask). Run `afm feature lint <NNN>`. It reads the `tasks:` list and checks: each spec scenario has a red task with its number and a later green that closes it, a green closes an earlier red (CRITICAL), a refactor follows a green or a refactor, no green or refactor is parallel, each new plan component is in the `files` of a task, each plan boundary has a task whose `validates` is its name, there is exactly one reconcile task and it is last, every `US-NNN` exists in `ust.md` and every `RF-NN` in `prd.md`, and no checklist line is left in the body. It exits 1 on CRITICAL or HIGH. Fix a finding with `afm task add` (a missing task), `afm task set <NNN> <Txxx> [--kind] [--text] [--files] [--refs] [--scenario] [--closes] [--validates] [--parallel|--no-parallel] [--clear <field>]` (the field the finding names; `--clear scenario|closes|validates|files|refs` clears one), or `afm task remove <NNN> <Txxx>` (a task that should not exist; refused while a green closes it), then re-run until the exit is 0. `afm task set` and `afm task remove` run the same rules as `afm task add` and write only the lines they change; a new `--kind` brings its own needs (a green `--closes`, a red `--scenario`). Step 6 is the declarative rule; this step is the safety net for an attention lapse.
|
|
48
48
|
|
|
49
49
|
8. **Materialize and report** (#6, see [`../PRINCIPLES.md`](../PRINCIPLES.md)): `tasks.md` is written by step 4; print the summary (step 9) with the path. Review happens through `git diff`; no blocking question.
|
|
50
50
|
|
|
51
|
-
**Check the frontmatter the template's `frontmatter_for_output:` names** (hard rule 39): `type: feature-tasks`, `description`, `load: cold`, and `for_paths`/`us`/`rf` carried from `plan.md`, unchanged,
|
|
51
|
+
**Check the frontmatter the template's `frontmatter_for_output:` names** (hard rule 39): `type: feature-tasks`, `description`, `load: cold`, and `for_paths`/`us`/`rf` carried from `plan.md`, unchanged, `status: planned`, and the `tasks:` list. `status` moves to `in_progress` with the first task and to `done` only in the reconcile task (step 4), never earlier.
|
|
52
52
|
|
|
53
53
|
9. **Output to the operator:**
|
|
54
54
|
- The path of `tasks.md`.
|
|
55
|
-
- The summary `N tasks total / M
|
|
55
|
+
- The summary `N tasks total / M parallel / red, green, refactor and reconcile counts`.
|
|
56
56
|
- The `[TBD]` markers still in the plan (a flag, not a block).
|
|
57
|
-
- **Next step:** "Before you start T001, consider `afm analyze` to cross-check coverage between scenarios, tasks and hard rules. It is a read-only report in chat, a safety net and not a gate. After that,
|
|
57
|
+
- **Next step:** "Before you start T001, consider `afm analyze` to cross-check coverage between scenarios, tasks and hard rules. It is a read-only report in chat, a safety net and not a gate. After that, run the tasks in list order: a red task, the green task that closes it, an optional refactor (`core/afm.md` § 2). When a task is done, close it with `afm task done <NNN> <Txxx>`."
|
|
58
58
|
|
|
59
59
|
## Anti-patterns
|
|
60
60
|
|
|
61
|
-
- ❌ Skip
|
|
61
|
+
- ❌ Skip the red task. This violates rule 1 (TDD).
|
|
62
62
|
- ❌ Create a task with no US or RF reference.
|
|
63
63
|
- ❌ Write a subjective task ("clean up code", "improve naming") with no mechanical criterion.
|
|
64
|
-
- ❌ Mark
|
|
64
|
+
- ❌ Mark a green task `--parallel`: it depends on the red task it closes.
|
|
65
65
|
- ❌ Block with a question before writing. Materialize and report; review through `git diff`.
|
|
66
66
|
- ❌ Tolerate an open `[NEEDS CLARIFICATION:]` in the plan. The block is hard: a mechanical refusal, not a question.
|
|
67
|
-
- ❌
|
|
67
|
+
- ❌ Write a task as a checklist line in the body, or edit the `tasks:` list by hand. `afm task add` adds a task, `afm task set` corrects one (its kind included), `afm task remove` drops one and `afm task done` closes it, atomically. When the CLI cannot write an edit it prints `held:` and a `task:` line with its verify; follow that task.
|
package/content/ops/update.md
CHANGED
|
@@ -7,8 +7,6 @@ composes: []
|
|
|
7
7
|
---
|
|
8
8
|
# Sub-flow: sync of the materialized instance with the current plugin version (`update`)
|
|
9
9
|
|
|
10
|
-
> **In this file:** What update is / is not · Procedure · What the codemods can do · Instances older than 4.0 · 1.6 Language migration · Opt-in deltas · Post-conditions · Suppression contract · Anti-patterns
|
|
11
|
-
|
|
12
10
|
> **Form** — effect: deltas in the instance + bump · trigger: `afm update`, composition · precondition: pin ≠ the shipped version · composed by: `evolve` 2.2 · **degree of freedom: low**
|
|
13
11
|
|
|
14
12
|
Triggers: `afm update`, or natural language for **version bump / sync with the plugin**. Examples:
|
|
@@ -161,6 +159,9 @@ noticing during the work, and that is the branch that damages a product.
|
|
|
161
159
|
scope empty, and the rest is unchanged. `afm lang` reports the language each file is written in.
|
|
162
160
|
4. **Ask ONE question about the artifacts: `afm ask update-artifacts`** (questions in
|
|
163
161
|
`content/questions/update-artifacts.questions.yaml`). Ask it once, never per file. `Keep the current language` records the choice, because the next update must not ask again.
|
|
162
|
+
Record the answer with `afm config set language.artifacts <tag>` (for example `pt-BR`). The command
|
|
163
|
+
validates the tag and edits `.afm/config.toml` in place. Never write that key by hand. A language agent task the
|
|
164
|
+
update prints (`artifact-language:*`) names the exact command; run it, then its 0/1 check.
|
|
164
165
|
5. **On migrate, fan out over the artifacts outside the excluded scope**: the local `docs/`, the code
|
|
165
166
|
comments, the test names. Each file gets a rewrite. Then an adversarial check asks what fact, number,
|
|
166
167
|
path, marker or caveat disappeared. The checker reports; it never rewrites.
|
package/content/ops/verify.md
CHANGED
|
@@ -7,8 +7,6 @@ composes: []
|
|
|
7
7
|
---
|
|
8
8
|
# Sub-flow: stamp a human verification (`verify`)
|
|
9
9
|
|
|
10
|
-
> **In this file:** What verify is / is not · Why only a human · Procedure · What it must never do · Invariants
|
|
11
|
-
|
|
12
10
|
> **Form** — effect: adds `verified:` to the frontmatter of one file · trigger: `afm verify <path>` · precondition: `.afm-version` · **degree of freedom: low**
|
|
13
11
|
|
|
14
12
|
Triggers: `afm verify <path>`. Also natural language that states a person checked a document.
|
|
@@ -26,3 +26,16 @@ questions:
|
|
|
26
26
|
description: User-facing strings are in Spanish.
|
|
27
27
|
- label: Decide later
|
|
28
28
|
description: Records [TBD] in the PRD; the language migration stops and asks.
|
|
29
|
+
- id: artifact-language
|
|
30
|
+
prompt: In which language are the artifacts of this project written (docs, code comments, test names)?
|
|
31
|
+
header: Artifacts
|
|
32
|
+
recommended: en
|
|
33
|
+
options:
|
|
34
|
+
- label: en
|
|
35
|
+
description: English, the default. Nothing is recorded.
|
|
36
|
+
- label: pt-BR
|
|
37
|
+
description: Recorded with afm config set language.artifacts pt-BR; the gate skips the English-prose rules.
|
|
38
|
+
- label: es
|
|
39
|
+
description: Recorded with afm config set language.artifacts es; the gate skips the English-prose rules.
|
|
40
|
+
- label: other
|
|
41
|
+
description: Another tag. Init prints the command to run with the tag the owner names.
|
|
@@ -9,8 +9,6 @@ fires_when: 'a failure was recognized by an external signal and needs a destinat
|
|
|
9
9
|
|
|
10
10
|
# Rubric — failure classification (mechanizable → guardrail | mechanical → procedure | conceptual → learning | transient → nothing)
|
|
11
11
|
|
|
12
|
-
> **In this file:** Entry gate (common to all three) · The four destinations · Decision flow · Anti-patterns
|
|
13
|
-
|
|
14
12
|
> The CRITIC loop (`ops/remediate.md`) uses this rubric to remediate a failure recognized and recorded in the state store (`afm failures record`). The discriminator is **executable**. It is not a "feeling". Ancestor: CRITIC (arXiv 2305.11738) — recognize a failure only by external signal. Self-criticism without a tool degrades (PRINCIPLES #3).
|
|
15
13
|
|
|
16
14
|
## Entry gate (common to all three)
|
|
@@ -11,8 +11,6 @@ fires_when: 'a file name collects unrelated responsibilities, or a provider `swi
|
|
|
11
11
|
|
|
12
12
|
# Rubric — SOLID as a concrete trigger (not folklore)
|
|
13
13
|
|
|
14
|
-
> **In this file:** SRP — Single Responsibility · OCP — Open/Closed: extend without modifying · LSP — Liskov Substitution: interchangeable implementations · ISP — Interface Segregation: minimal port · DIP — Dependency Inversion: domain does not know infra · Summary — what to ask when
|
|
15
|
-
|
|
16
14
|
|
|
17
15
|
SOLID is easy to use as an argument and hard to use as a trigger. This rubric converts each principle into a **mechanical trigger** — when to apply it, the anti-pattern, an example.
|
|
18
16
|
|
|
@@ -19,7 +19,7 @@ Run `afm preflight` (exit 3: no `docs/.afm-version`, stop and suggest `afm init`
|
|
|
19
19
|
|
|
20
20
|
## Procedure
|
|
21
21
|
|
|
22
|
-
Start from the mechanical findings: `afm feature lint <NNN> --json` covers the passes A, C, D, E and the structure of `tasks.md`. Add the judgment on top (constitution violations, duplication, the semantic side of inconsistency and ambiguity), build the coverage table, assign severities by the matrix, and report in chat with metrics. Close with the `remediation` question (`afm ask analyze`)
|
|
22
|
+
Start from the mechanical findings: `afm feature lint <NNN> --json` covers the passes A, C, D, E and the structure of `tasks.md`. Add the judgment on top (constitution violations, duplication, the semantic side of inconsistency and ambiguity), build the coverage table, assign severities by the matrix, and report in chat with metrics. Close with the `remediation` question (`afm ask analyze`); a remediation that adds a task runs `afm task add`, never a hand edit of the `tasks:` list, and a task is closed only with `afm task done`. Gating mode sorts findings into buckets instead of reporting.
|
|
23
23
|
|
|
24
24
|
## Invariant principles
|
|
25
25
|
|
|
@@ -24,10 +24,10 @@ The CLI holds the state; the skill keeps only the judgment. Drive the loop with
|
|
|
24
24
|
- **Discovery:** scan scoped to the feature, external unknowns through the nasca research flow (`nasca-research`, or `nasca-campaign` for a deep study; ask the operator if nasca is missing), unknowns sorted into resolved-by-scan, researchable and irreducible. One batched, recommendation-first round, capped by the protocol (`afm protocol`).
|
|
25
25
|
- **Draft:** spec, plan and tasks, verified with `afm feature lint <NNN>` plus the judgment passes of `analyze`.
|
|
26
26
|
- **Gate:** the earned questions plus the `outcome` question (`afm ask deliver`), then `afm approve <NNN>`. An explicit "go" skips the questions, never the record.
|
|
27
|
-
- **Execute:**
|
|
27
|
+
- **Execute:** the tasks of the `tasks:` list run in order (`core/afm.md` § 2: a red task, the green task that closes it, an optional refactor), each checked with `afm gate --staged`, then closed with `afm task done <NNN> <Txxx>`. Tasks are added with `afm task add`, never by hand. Halt on the failure of a task that is not `parallel` after the capped retry.
|
|
28
28
|
- **Reconcile:** § 8.5 plus a passive sweep.
|
|
29
29
|
|
|
30
|
-
If artifacts already exist, resume from the correct phase, including "tasks already exist, run from the first
|
|
30
|
+
If artifacts already exist, resume from the correct phase, including "tasks already exist, run from the first task that is not done".
|
|
31
31
|
|
|
32
32
|
## Invariant principles
|
|
33
33
|
|
package/content/skills/tasks.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tasks
|
|
3
3
|
description: |
|
|
4
|
-
Generates `tasks.md` in TDD order
|
|
4
|
+
Generates the `tasks:` list of `tasks.md` in TDD order with `afm task add`. Every task references a user story or a requirement. It hard-blocks on an open `[NEEDS CLARIFICATION:]` in the plan.
|
|
5
5
|
Activates: `afm tasks [<feature>]`, "generate the tasks", "break the feature into tasks".
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -19,11 +19,11 @@ Run `afm preflight` (exit 3: stop and suggest `afm init` or `afm refactor`). Run
|
|
|
19
19
|
|
|
20
20
|
## Procedure
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
Create the file with the generator (`afm new feature-tasks --feature NNN-slug`), then add every task with `afm task add <NNN> --kind <k> --text <t>`: setup tasks, then for each spec scenario a red task (`--scenario N`) and the green task that closes it (`--closes Txxx`), an optional refactor, the validation task of each plan boundary (`--validates <boundary name>`), and one reconcile task, last. Never write a task by hand: the tasks live in the frontmatter `tasks:` list, and the CLI assigns the id and validates the item. Mark `--parallel` 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` (`--refs`). The CLI refuses an item that breaks a lint rule. Then run `afm feature lint <NNN>` and fix what it reports until it exits 0: a missing task with `afm task add`, a wrong field or kind with `afm task set <NNN> <Txxx> --<field> <value>` (`--clear <field>` clears one), a task that should not exist with `afm task remove <NNN> <Txxx>`. Never edit the YAML by hand. The reconcile task closes the `status:` keys; close each task with `afm task done`. Autonomy-first: write and report.
|
|
23
23
|
|
|
24
24
|
## Invariant principles
|
|
25
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
|
|
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 task without the red task it closes).
|
|
27
27
|
|
|
28
28
|
## Continuous doctrine
|
|
29
29
|
|
|
@@ -10,7 +10,7 @@ frontmatter_for_output: |
|
|
|
10
10
|
status: proposed # proposed | accepted | superseded | deprecated. Set from step 2's
|
|
11
11
|
# `afm ask adr` answer; `afm adr --supersedes` sets superseded.
|
|
12
12
|
date: YYYY-MM-DD # The day the decision was written down.
|
|
13
|
-
decided_by: '<who>' #
|
|
13
|
+
decided_by: '<who>' # `[TBD]` when nobody said.
|
|
14
14
|
supersedes: ADR-NNNN # ONLY when this decision replaces an earlier one. Omit otherwise.
|
|
15
15
|
superseded_by: ADR-NNNN # ONLY when status is superseded by a later decision. Omit otherwise.
|
|
16
16
|
relates_to: [ADR-NNNN] # ONLY when it depends on or refines other ADRs. Omit otherwise.
|
|
@@ -25,8 +25,6 @@ frontmatter_for_output: |
|
|
|
25
25
|
> Without the field the windows collapse into one, and the cheap mechanism starves the expensive
|
|
26
26
|
> one: measured on 2026-08-30, five reports, all five `reflect`, and `evolve` had never run.
|
|
27
27
|
|
|
28
|
-
> **In this file:** Vital signs · Findings (φ signature) · Evolution package · ADRs created in this cycle · Attempt memory (anti-oscillation) · Mechanical post-conditions · Suggested promotion
|
|
29
|
-
|
|
30
28
|
> This is a report of one `afm evolve` cycle (auto-evolution of **this project's local documentation** — the materialized instance of the methodology in `docs/`, never the plugin). It is the **auditable lineage** and the **memory of past attempts** for future cycles. It is not the evolved artifact itself (the edits live in the touched local docs). It is the record of the diagnosis and the gate decisions.
|
|
31
29
|
<!-- /guidance -->
|
|
32
30
|
|
|
@@ -17,8 +17,6 @@ frontmatter_for_output: |
|
|
|
17
17
|
|
|
18
18
|
# Feature {{NNN}} — Plan
|
|
19
19
|
|
|
20
|
-
> **Inferred stack:** {{read from /docs/ach.md § 1, do not reopen the discussion}}
|
|
21
|
-
|
|
22
20
|
## 1. Approach in 3 sentences
|
|
23
21
|
|
|
24
22
|
{{What to build, in which layer, linked to which component-types from `ach.md` § 3.}}
|
|
@@ -9,12 +9,11 @@ frontmatter_for_output: |
|
|
|
9
9
|
load: cold
|
|
10
10
|
status: open # open | closed — `closed` once the findings were applied to spec.md or plan.md
|
|
11
11
|
consumed_by: '<the artifact that cites this research; omit until one does>'
|
|
12
|
+
context: '<the marker from spec.md or plan.md this answers, or "free investigation: <topic>">'
|
|
12
13
|
---
|
|
13
14
|
|
|
14
15
|
# Research — Feature {{NNN}} — {{title}}
|
|
15
16
|
|
|
16
|
-
> **Triggered by:** {{original marker from spec/plan OR "free investigation: <topic>"}}
|
|
17
|
-
|
|
18
17
|
<!-- guidance -->
|
|
19
18
|
{{For each topic investigated, repeat the block below. Put multiple topics in the same file if they went to the subagent in the same round.}}
|
|
20
19
|
<!-- /guidance -->
|
|
@@ -21,7 +21,7 @@ frontmatter_for_output: |
|
|
|
21
21
|
# Feature {{NNN}} — {{objective title}}
|
|
22
22
|
|
|
23
23
|
<!-- guidance -->
|
|
24
|
-
>
|
|
24
|
+
> A spec holds the what and the why. No technology decision.
|
|
25
25
|
> The linked US and the lifecycle `status` live in the frontmatter, never in the body.
|
|
26
26
|
<!-- /guidance -->
|
|
27
27
|
|
|
@@ -3,6 +3,7 @@ type: template
|
|
|
3
3
|
description: 'Template rendered during materialization: Induced tasks — parameterized template.'
|
|
4
4
|
load: cold
|
|
5
5
|
renders_to: 'docs/templates/feature-tasks.induced.md'
|
|
6
|
+
ancestors: 'Agent Workflow Memory (arXiv:2409.07429): induce a reusable workflow from a successful trajectory, and parameterize the concrete values. Voyager (arXiv:2305.16291): composing from the library beats regenerating from scratch.'
|
|
6
7
|
frontmatter_for_output: |
|
|
7
8
|
type: feature-tasks
|
|
8
9
|
description: '<one sentence: what this task list delivers>'
|
|
@@ -12,14 +13,64 @@ frontmatter_for_output: |
|
|
|
12
13
|
- '{{glob}}'
|
|
13
14
|
us: US-{{NNN}} # Omit when no US is linked.
|
|
14
15
|
rf: RF-{{NN}} # Omit when no RF is linked.
|
|
16
|
+
tasks: # replay each item with `afm task add`, the variables filled; never by hand
|
|
17
|
+
- id: T001
|
|
18
|
+
kind: setup
|
|
19
|
+
files: ['{{src-path}}/domain/{domain}.ts']
|
|
20
|
+
refs: ['US-{{NNN}}']
|
|
21
|
+
parallel: true
|
|
22
|
+
text: 'Create the file `{{src-path}}/domain/{domain}.ts` with exported signature `domain_{domain}`.'
|
|
23
|
+
done: false
|
|
24
|
+
- id: T002
|
|
25
|
+
kind: setup
|
|
26
|
+
files: ['{{src-path}}/domain/{domain}.fixtures.ts']
|
|
27
|
+
refs: ['US-{{NNN}}']
|
|
28
|
+
parallel: true
|
|
29
|
+
text: 'Create the test fixture in `{{src-path}}/domain/{domain}.fixtures.ts`.'
|
|
30
|
+
done: false
|
|
31
|
+
- id: T003
|
|
32
|
+
kind: red
|
|
33
|
+
scenario: 1
|
|
34
|
+
files: ['{{src-path}}/domain/{domain}.test.ts']
|
|
35
|
+
refs: ['US-{{NNN}}']
|
|
36
|
+
text: 'Write test `domain_{domain} returns <result> given <input>`.'
|
|
37
|
+
done: false
|
|
38
|
+
- id: T004
|
|
39
|
+
kind: green
|
|
40
|
+
closes: T003
|
|
41
|
+
files: ['{{src-path}}/domain/{domain}.ts']
|
|
42
|
+
refs: ['US-{{NNN}}']
|
|
43
|
+
text: 'Add the minimal implementation of `domain_{domain}`.'
|
|
44
|
+
done: false
|
|
45
|
+
- id: T005
|
|
46
|
+
kind: refactor
|
|
47
|
+
refs: ['US-{{NNN}}']
|
|
48
|
+
text: 'Extract a helper if DRY reaches 3 callers (rule 8).'
|
|
49
|
+
done: false
|
|
50
|
+
- id: T006
|
|
51
|
+
kind: red
|
|
52
|
+
scenario: 2
|
|
53
|
+
refs: ['US-{{NNN}}']
|
|
54
|
+
text: 'Write a test for the error path of an invalid `{entity}` at `{boundary-procedure}`.'
|
|
55
|
+
done: false
|
|
56
|
+
- id: T007
|
|
57
|
+
kind: green
|
|
58
|
+
closes: T006
|
|
59
|
+
validates: '{boundary-procedure}'
|
|
60
|
+
refs: ['US-{{NNN}}']
|
|
61
|
+
text: 'Add the procedure `{boundary-procedure}` with Zod validation at the boundary (rule 16).'
|
|
62
|
+
done: false
|
|
63
|
+
- id: T008
|
|
64
|
+
kind: reconcile
|
|
65
|
+
text: 'Update `ach.md § 3` if a new component (`{domain}`/`{entity}`) was added, add an ADR if an architectural decision was made, set the US status in `ust.md` to `done`, and move the `status` frontmatter key of `spec.md`, `plan.md` and `tasks.md` to `done`.'
|
|
66
|
+
done: false
|
|
15
67
|
---
|
|
16
68
|
|
|
17
69
|
# Induced tasks — parameterized template
|
|
18
70
|
|
|
19
71
|
<!-- guidance -->
|
|
20
|
-
>
|
|
21
|
-
>
|
|
22
|
-
> **Use:** the next consumer of this template starts here (fills in the variables) instead of generating tasks from scratch. It keeps the TDD convention of `feature-tasks.template.md`. Each task is a cycle of `core/afm.md § 2`.
|
|
72
|
+
> Induced by `afm export-template` from a feature that is **delivered and 100% green** (every task of its `tasks:` list `done: true` — gate `L_eval=1` of AWM). The concrete values of the original feature are parameterized as `{variables}`.
|
|
73
|
+
> The next consumer of this template starts here instead of generating tasks from scratch: fill in the variables and replay each item of the `tasks:` list above with `afm task add`, then close each one with `afm task done`. It keeps the TDD convention of `feature-tasks.template.md`: a red task, the green task that closes it, an optional refactor (`core/afm.md § 2`), and one reconcile task, last.
|
|
23
74
|
<!-- /guidance -->
|
|
24
75
|
|
|
25
76
|
## Variables
|
|
@@ -29,39 +80,12 @@ frontmatter_for_output: |
|
|
|
29
80
|
| `{product-name}` | product/project name | — |
|
|
30
81
|
| `{domain}` | module/domain of the feature | `billing`, `auth` |
|
|
31
82
|
| `{entity}` | central entity touched | `Subscription`, `Session` |
|
|
32
|
-
| `{boundary-procedure}` | boundary procedure/handler | `subscriptionCreate` |
|
|
33
|
-
|
|
34
|
-
## Phase 1 — Setup
|
|
35
|
-
|
|
36
|
-
- [ ] T001 [P] Create the file `{{src-path}}/domain/{domain}.ts` with exported signature `domain_{domain}`.
|
|
37
|
-
- [ ] T002 [P] Create the test fixture in `{{src-path}}/domain/{domain}.fixtures.ts`.
|
|
38
|
-
|
|
39
|
-
## Phase 2 — Foundation (write failing tests first)
|
|
40
|
-
|
|
41
|
-
- [ ] T003 — RED: write test `domain_{domain} returns <result> given <input>` in `{{src-path}}/domain/{domain}.test.ts` (US-NNN scenario 1).
|
|
42
|
-
- [ ] T004 — GREEN: add the minimal implementation of `domain_{domain}` that passes T003.
|
|
43
|
-
- [ ] T005 — REFACTOR: extract a helper if DRY reaches 3 callers (rule 8).
|
|
44
|
-
|
|
45
|
-
## Phase 3 — Boundary
|
|
46
|
-
|
|
47
|
-
- [ ] T006 — RED: write a test for procedure `{boundary-procedure}` that calls `domain_{domain}` (US-NNN scenario 1).
|
|
48
|
-
- [ ] T007 — GREEN: add the minimal procedure.
|
|
49
|
-
- [ ] T008 [P] — RED: write a test for the error path of an invalid `{entity}` (US-NNN scenario 2).
|
|
50
|
-
- [ ] T009 — GREEN: add Zod validation at the boundary (rule 16).
|
|
51
|
-
|
|
52
|
-
## Phase 4 — Reconciliation (8.5)
|
|
53
|
-
|
|
54
|
-
<!-- guidance -->
|
|
55
|
-
> **Version bump.** In a delivery of more than one commit, the version bump is a **precondition of every commit that touches the installable surface**. It is not a task of this phase: a final-phase bump leaves the earlier commits failing the gate.
|
|
56
|
-
<!-- /guidance -->
|
|
57
|
-
|
|
58
|
-
- [ ] T010 — Update `ach.md § 3` if a new component (`{domain}`/`{entity}`) was added.
|
|
59
|
-
- [ ] T011 — Add an ADR if an architectural decision was made (see `ops/adr.md`).
|
|
60
|
-
- [ ] T012 — Update the US status in `ust.md` to `done`.
|
|
61
|
-
- [ ] T013 — Move the spec status to `done` (the `status` frontmatter key of `spec.md`, `plan.md` and `tasks.md`).
|
|
83
|
+
| `{boundary-procedure}` | boundary procedure/handler, named as its `### Boundary` of plan § 5 | `subscriptionCreate` |
|
|
62
84
|
|
|
63
85
|
---
|
|
64
86
|
|
|
65
87
|
<!-- guidance -->
|
|
66
|
-
*Fill in the variables for this feature. The rest of the TDD structure came from a validated delivery. Every task must reference US-NNN/RF-NN in its commit
|
|
88
|
+
*Fill in the variables for this feature. The rest of the TDD structure came from a validated delivery. Every task must reference US-NNN/RF-NN in its commit. Do not skip the red task (rule 1).*
|
|
89
|
+
|
|
90
|
+
> **Version bump.** In a delivery of more than one commit, the version bump is a **precondition of every commit that touches the installable surface**. It is not a task: a bump in the reconcile task leaves the earlier commits failing the gate.
|
|
67
91
|
<!-- /guidance -->
|
|
@@ -9,52 +9,74 @@ frontmatter_for_output: |
|
|
|
9
9
|
load: cold
|
|
10
10
|
status: planned # draft | clarified | planned | in_progress | done | cancelled — the folder's
|
|
11
11
|
# ONE lifecycle value: `in_progress` with the first task, `done` in the
|
|
12
|
-
#
|
|
12
|
+
# reconcile task that moves spec.md and plan.md
|
|
13
13
|
for_paths: # carried from plan.md § 2, unchanged
|
|
14
14
|
- '{{glob}}'
|
|
15
15
|
us: US-{{NNN}} # carried from spec.md. Omit when spec.md omits it.
|
|
16
16
|
rf: RF-{{NN}} # carried from spec.md. Omit when spec.md omits it.
|
|
17
|
+
tasks: # written by `afm task add`, corrected by `afm task set`, closed by `afm task done`; never by hand
|
|
18
|
+
- id: T001
|
|
19
|
+
kind: setup
|
|
20
|
+
files: ['{{src-path}}/domain/x.ts']
|
|
21
|
+
refs: ['US-{{NNN}}']
|
|
22
|
+
parallel: true
|
|
23
|
+
text: '{{ex: create the empty file with an exported signature}}'
|
|
24
|
+
done: false
|
|
25
|
+
- id: T002
|
|
26
|
+
kind: red
|
|
27
|
+
scenario: 1
|
|
28
|
+
files: ['{{src-path}}/domain/x.test.ts']
|
|
29
|
+
refs: ['US-{{NNN}}']
|
|
30
|
+
text: '{{ex: test domain_x returns Y given Z}}'
|
|
31
|
+
done: false
|
|
32
|
+
- id: T003
|
|
33
|
+
kind: green
|
|
34
|
+
closes: T002
|
|
35
|
+
files: ['{{src-path}}/domain/x.ts']
|
|
36
|
+
refs: ['US-{{NNN}}']
|
|
37
|
+
text: '{{ex: minimal implementation of domain_x}}'
|
|
38
|
+
done: false
|
|
39
|
+
- id: T004
|
|
40
|
+
kind: refactor
|
|
41
|
+
refs: ['US-{{NNN}}']
|
|
42
|
+
text: '{{ex: extract parseInput if DRY has 3+ callers (rule 8)}}'
|
|
43
|
+
done: false
|
|
44
|
+
- id: T005
|
|
45
|
+
kind: red
|
|
46
|
+
scenario: 2
|
|
47
|
+
files: ['{{src-path}}/procedures/x-create.test.ts']
|
|
48
|
+
refs: ['US-{{NNN}}']
|
|
49
|
+
text: '{{ex: test the INVALID_INPUT error path of the xCreate boundary}}'
|
|
50
|
+
done: false
|
|
51
|
+
- id: T006
|
|
52
|
+
kind: green
|
|
53
|
+
closes: T005
|
|
54
|
+
validates: '{{boundary name of plan § 5, ex: xCreate}}'
|
|
55
|
+
files: ['{{src-path}}/procedures/x-create.ts']
|
|
56
|
+
refs: ['US-{{NNN}}']
|
|
57
|
+
text: '{{ex: Zod validation at the boundary (rule 16)}}'
|
|
58
|
+
done: false
|
|
59
|
+
- id: T007
|
|
60
|
+
kind: reconcile
|
|
61
|
+
text: 'ach.md § 3 if a new component landed, an ADR if a decision materialized, the US status in ust.md, and the status key of spec.md, plan.md and tasks.md set to done'
|
|
62
|
+
done: false
|
|
17
63
|
---
|
|
18
64
|
|
|
19
65
|
# Feature {{NNN}} — Tasks
|
|
20
66
|
|
|
21
67
|
<!-- guidance -->
|
|
22
|
-
>
|
|
23
|
-
>
|
|
68
|
+
> The tasks live in the frontmatter `tasks:` list, never as a checklist in this body. Add each one with `afm task add {{NNN}} --kind <setup|red|green|refactor|reconcile> --text "..." [--scenario N] [--closes Txxx] [--validates <boundary>] [--files a,b] [--refs US-NNN,RF-NN] [--parallel]`: the CLI assigns the id, refuses an item that breaks a rule `afm feature lint` grades, and keeps the reconcile task last (reopening it when it was done). Correct a field with `afm task set {{NNN}} Txxx --<field> <value>`. Close each one with `afm task done {{NNN}} Txxx`: a green waits for its red, a refactor for the task before it. Never edit the list by hand.
|
|
69
|
+
> A TDD cycle of `core/afm.md` § 2 is a red task (`scenario: N` of spec § 3), then a green task that closes it (`closes:` the red), then an optional refactor. `parallel: true` marks a task with no dependency on the task right before it; a green or a refactor never is.
|
|
70
|
+
> Each new component of plan § 2 is in the `files:` of one task, with the exact path of the plan cell. Each boundary of plan § 5 needs a task whose `validates:` is its name (`### Boundary <name>`): the task that validates its input (rule 16).
|
|
71
|
+
> One reconcile task, the last: `afm task done` refuses it while another task is open. Run `afm feature lint {{NNN}}` until it exits 0.
|
|
72
|
+
> Before you start, `plan.md` has no open `[NEEDS CLARIFICATION:]` marker.
|
|
24
73
|
<!-- /guidance -->
|
|
25
74
|
|
|
26
|
-
##
|
|
75
|
+
## Notes
|
|
27
76
|
|
|
28
|
-
|
|
29
|
-
- [ ] T002 [P] {{ex: create test fixture in `{{src-path}}/domain/x.fixtures.ts`}}
|
|
30
|
-
|
|
31
|
-
## Phase 2 — Foundation (failing tests first)
|
|
32
|
-
|
|
33
|
-
- [ ] T003 — RED: test `domain_x returns Y given Z` in `{{src-path}}/domain/x.test.ts` (US-NNN scenario 1)
|
|
34
|
-
- [ ] T004 — GREEN: minimal implementation of `domain_x` that passes T003
|
|
35
|
-
- [ ] T005 — REFACTOR: extract `parseInput` if DRY has 3+ callers (rule 8)
|
|
36
|
-
|
|
37
|
-
## Phase 3 — Boundary
|
|
38
|
-
|
|
39
|
-
- [ ] T006 — RED: test the `xCreate` procedure that calls `domain_x` (US-NNN scenario 1)
|
|
40
|
-
- [ ] T007 — GREEN: minimal procedure
|
|
41
|
-
- [ ] T008 [P] — RED: test the `INVALID_INPUT` error path (US-NNN scenario 2)
|
|
42
|
-
- [ ] T009 — GREEN: Zod validation at the boundary (rule 16)
|
|
43
|
-
|
|
44
|
-
## Phase 4 — Reconciliation (8.5)
|
|
45
|
-
|
|
46
|
-
<!-- guidance -->
|
|
47
|
-
> **Version bump.** In a delivery of more than one commit, the version bump is a **precondition of every commit that touches the installable surface**. It is not a task of this phase: a final-phase bump leaves the earlier commits failing the gate.
|
|
48
|
-
<!-- /guidance -->
|
|
49
|
-
|
|
50
|
-
- [ ] T010 — Update `ach.md` § 3 if a new component landed
|
|
51
|
-
- [ ] T011 — Add an ADR if an architectural decision materialized (see `ops/adr.md`)
|
|
52
|
-
- [ ] T012 — Update the US status in `ust.md` to `done`
|
|
53
|
-
- [ ] T013 — Move the spec status to `done` (the `status` frontmatter key of `spec.md`, `plan.md` and `tasks.md`)
|
|
54
|
-
|
|
55
|
-
---
|
|
77
|
+
{{ex: what the list does not say: the order of the phases, a dependency between tasks, a risk}}
|
|
56
78
|
|
|
57
79
|
<!-- guidance -->
|
|
58
|
-
|
|
59
|
-
|
|
80
|
+
> **Version bump.** In a delivery of more than one commit, the version bump is a **precondition of every commit that touches the installable surface**. It is not a task: a bump in the reconcile task leaves the earlier commits failing the gate.
|
|
81
|
+
> Every task references US-NNN or RF-NN in the commit (rule in `core/afm.md` § 2, step 7 COMMIT). Never skip the red task (rule 1 — TDD).
|
|
60
82
|
<!-- /guidance -->
|
|
@@ -6,7 +6,7 @@ load: cold
|
|
|
6
6
|
|
|
7
7
|
# P1 — Autonomous Delivery
|
|
8
8
|
|
|
9
|
-
>
|
|
9
|
+
> POC and MVP work. Speed and no interaction matter more than depth.
|
|
10
10
|
> **Granted per session, never by the repo** (`core/protocol.md` § 6).
|
|
11
11
|
|
|
12
12
|
| Field | Value |
|
|
@@ -6,7 +6,7 @@ load: cold
|
|
|
6
6
|
|
|
7
7
|
# P2 — Assisted Delivery
|
|
8
8
|
|
|
9
|
-
>
|
|
9
|
+
> pair programming. The human is the senior dev. The agent escalates early instead of continuing on a wrong path.
|
|
10
10
|
|
|
11
11
|
| Field | Value |
|
|
12
12
|
| --- | --- |
|
|
@@ -6,7 +6,7 @@ load: cold
|
|
|
6
6
|
|
|
7
7
|
# P3 — Planned Autonomous Delivery
|
|
8
8
|
|
|
9
|
-
>
|
|
9
|
+
> the middle ground — P2 quality with P1 interaction. You plan together. The agent executes alone.
|
|
10
10
|
|
|
11
11
|
| Field | Phase 1 (planning) | Phase 2 (execution) |
|
|
12
12
|
| --- | --- | --- |
|
package/package.json
CHANGED
package/plugin/agy/plugin.json
CHANGED