@llman-sdd/core 0.3.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/package.json +2 -1
  2. package/src/archive/freeze.ts +86 -18
  3. package/src/archive/frozenCard.ts +105 -0
  4. package/src/archive/sevenzip.ts +15 -13
  5. package/src/change/closeOutHarness.ts +29 -0
  6. package/src/change/collect.ts +140 -0
  7. package/src/change/frontmatter.ts +48 -6
  8. package/src/change/id.ts +2 -6
  9. package/src/change/lifecycle.ts +285 -86
  10. package/src/change/nextId.ts +63 -2
  11. package/src/change/resolve.ts +2 -2
  12. package/src/change/tasks.ts +59 -0
  13. package/src/config/changeId.ts +14 -12
  14. package/src/config/load.ts +14 -0
  15. package/src/config/schema.ts +4 -41
  16. package/src/config/surface.ts +6 -36
  17. package/src/context/indexStore.ts +7 -3
  18. package/src/context/retrieve.ts +8 -10
  19. package/src/context/tree.ts +28 -24
  20. package/src/git/spawnGit.ts +90 -2
  21. package/src/index.ts +81 -54
  22. package/src/init/defaultConfig.ts +1 -5
  23. package/src/init/init.ts +19 -4
  24. package/src/ports.ts +1 -7
  25. package/src/project/migrateNotes.ts +104 -0
  26. package/src/render/machine.ts +30 -0
  27. package/src/report/collect.ts +11 -127
  28. package/src/report/graph/analysis.ts +152 -0
  29. package/src/report/graph/deps.ts +30 -0
  30. package/src/report/graph/graphData.ts +53 -0
  31. package/src/report/graph/nodes.ts +130 -0
  32. package/src/report/graph/render.ts +83 -0
  33. package/src/report/graph/types.ts +47 -0
  34. package/src/report/graph.ts +9 -381
  35. package/src/report/show.ts +20 -22
  36. package/src/report/specHelpers.ts +45 -22
  37. package/src/report/specs.ts +23 -25
  38. package/src/review/review.ts +45 -30
  39. package/src/spec/authoring.ts +147 -71
  40. package/src/spec/ir.ts +43 -15
  41. package/src/spec/keywords.ts +147 -0
  42. package/src/spec/migrateNative.ts +201 -0
  43. package/src/spec/parser.ts +95 -83
  44. package/src/spec/reqRegistry.ts +31 -15
  45. package/src/templates/embedded.ts +10 -16
  46. package/src/templates/engine.ts +10 -5
  47. package/src/templates/locale.ts +1 -1
  48. package/src/templates/skills.ts +4 -5
  49. package/src/validation/changeCheck.ts +128 -105
  50. package/src/validation/harness.ts +161 -0
  51. package/src/validation/staleness.ts +9 -5
  52. package/src/validation/validate.ts +60 -88
  53. package/templates/en/skills/llman-sdd-apply-cycle.md +20 -28
  54. package/templates/en/skills/llman-sdd-apply.md +58 -76
  55. package/templates/en/skills/llman-sdd-arch-review.md +12 -19
  56. package/templates/en/skills/llman-sdd-archive.md +27 -42
  57. package/templates/en/skills/llman-sdd-continue.md +17 -24
  58. package/templates/en/skills/llman-sdd-draft.md +17 -28
  59. package/templates/en/skills/llman-sdd-explore.md +29 -43
  60. package/templates/en/skills/llman-sdd-ff.md +12 -17
  61. package/templates/en/skills/llman-sdd-graph.md +14 -32
  62. package/templates/en/skills/llman-sdd-propose.md +48 -63
  63. package/templates/en/skills/llman-sdd-quick.md +12 -27
  64. package/templates/en/skills/llman-sdd-research.md +13 -24
  65. package/templates/en/skills/llman-sdd-specs-compact.md +14 -39
  66. package/templates/en/skills/llman-sdd-validate.md +11 -15
  67. package/templates/en/skills/llman-sdd-verify.md +23 -44
  68. package/templates/en/skills/llman-sdd-wayfinder.md +18 -22
  69. package/templates/en/units/skills/cli-footer.md +2 -0
  70. package/templates/en/units/skills/git-native-flow-brief.md +7 -6
  71. package/templates/en/units/skills/git-native-flow.md +21 -11
  72. package/templates/en/units/skills/human-readable-summary.md +2 -3
  73. package/templates/en/units/skills/stage-guard.md +7 -7
  74. package/templates/en/units/skills/structured-protocol.md +5 -8
  75. package/templates/en/units/skills/validation-hints.md +10 -14
  76. package/templates/en/units/spec/feature-contract.md +27 -16
  77. package/templates/en/units/workflow/archive-freeze-guidance.md +6 -3
  78. package/templates/zh-Hans/skills/llman-sdd-apply-cycle.md +23 -31
  79. package/templates/zh-Hans/skills/llman-sdd-apply.md +63 -81
  80. package/templates/zh-Hans/skills/llman-sdd-arch-review.md +21 -28
  81. package/templates/zh-Hans/skills/llman-sdd-archive.md +29 -44
  82. package/templates/zh-Hans/skills/llman-sdd-continue.md +17 -24
  83. package/templates/zh-Hans/skills/llman-sdd-draft.md +18 -29
  84. package/templates/zh-Hans/skills/llman-sdd-explore.md +34 -48
  85. package/templates/zh-Hans/skills/llman-sdd-ff.md +13 -18
  86. package/templates/zh-Hans/skills/llman-sdd-graph.md +16 -34
  87. package/templates/zh-Hans/skills/llman-sdd-propose.md +51 -65
  88. package/templates/zh-Hans/skills/llman-sdd-quick.md +15 -30
  89. package/templates/zh-Hans/skills/llman-sdd-research.md +17 -28
  90. package/templates/zh-Hans/skills/llman-sdd-specs-compact.md +15 -40
  91. package/templates/zh-Hans/skills/llman-sdd-validate.md +11 -15
  92. package/templates/zh-Hans/skills/llman-sdd-verify.md +26 -47
  93. package/templates/zh-Hans/skills/llman-sdd-wayfinder.md +25 -29
  94. package/templates/zh-Hans/units/skills/cli-footer.md +2 -0
  95. package/templates/zh-Hans/units/skills/git-native-flow-brief.md +7 -6
  96. package/templates/zh-Hans/units/skills/git-native-flow.md +22 -12
  97. package/templates/zh-Hans/units/skills/human-readable-summary.md +4 -5
  98. package/templates/zh-Hans/units/skills/stage-guard.md +9 -9
  99. package/templates/zh-Hans/units/skills/structured-protocol.md +5 -8
  100. package/templates/zh-Hans/units/skills/validation-hints.md +10 -14
  101. package/templates/zh-Hans/units/spec/feature-contract.md +25 -16
  102. package/templates/zh-Hans/units/workflow/archive-freeze-guidance.md +6 -2
  103. package/templates/en/skills/llman-sdd-onboard.md +0 -34
  104. package/templates/en/skills/llman-sdd-show.md +0 -24
  105. package/templates/en/units/migrate-prompt.md +0 -28
  106. package/templates/zh-Hans/skills/llman-sdd-onboard.md +0 -34
  107. package/templates/zh-Hans/skills/llman-sdd-show.md +0 -24
  108. package/templates/zh-Hans/units/migrate-prompt.md +0 -28
@@ -1,65 +1,40 @@
1
1
  ---
2
2
  name: "llman-sdd-specs-compact"
3
- description: "Human-triggered maintenance tool. Compacts and deduplicates llman SDD specs after many archived changes — merges redundant requirements and scenarios while preserving all normative behavior. NOT part of the regular pipeline: only run when the user explicitly asks to compact specs."
3
+ description: "Compact and dedupe specs: merge redundant requirements/scenarios without changing normative behavior. Manual run only, when the user explicitly asks."
4
4
  metadata:
5
5
  version: "{{ llman_version }}"
6
6
  ---
7
7
 
8
8
  # LLMAN SDD Specs Compact
9
9
 
10
- Use this skill to compact specs without changing normative behavior.
11
-
12
- ## Pipeline Position
13
-
14
- ```mermaid
15
- flowchart LR
16
- archive["llman-sdd-archive<br/>After archiving"] --> compact
17
- compact["📎 llman-sdd-specs-compact<br/>Compact specs (maintenance)"]
18
-
19
- style compact fill:#e8f4e8,stroke:#28a745,stroke-width:2px
20
- ```
21
-
22
- > 📎 Maintenance tool, typically run after accumulating many archives. For daily development → `llman-sdd-propose` (Branch binding + Specs landing) / `llman-sdd-apply` (requires `readyToImplement`).
10
+ Compact specs without changing normative behavior. Maintenance tool, not part of the daily pipeline; typically run after many archived changes.
23
11
 
24
12
  ## Context
25
- - Specs grow bloated with duplicate requirements/scenarios as changes accumulate.
26
- - Compaction must remain verifiable and regressible.
27
- - When archive history is too large, it interferes with compaction review and navigation.
13
+ - Specs bloat with duplicate requirements/scenarios as changes accumulate; compaction must stay verifiable and regressible.
14
+ - An oversized archive history interferes with compaction review and navigation.
28
15
 
29
16
  ## Goal
30
- - Identify and merge redundant requirements/scenarios.
31
- - Form a more compact and maintainable spec structure.
17
+ - Merge redundant requirements/scenarios into a more compact, maintainable spec structure.
32
18
 
33
19
  ## Constraints
34
- - Don't delete normative behavior without explicit replacement.
35
- - Try to keep requirement titles stable.
36
- - Each retained requirement must have at least one valid scenario.
37
- - **Editing live `llmanspec/specs/**` requires a change**: Branch binding first (`change start` / `attach`), then commit on the bound branch (Specs landing style); **never** compact-rewrite live specs on the default branch.
20
+ - Don't delete normative behavior without explicit replacement; keep requirement titles stable where possible; every retained requirement keeps at least one valid scenario.
21
+ - **Editing `llmanspec/specs/**` requires a change**: bind the branch first (`change start` / `attach`), then edit and commit on the bound branch; **never** compact-rewrite specs on the default branch.
38
22
 
39
23
  ## Workflow
40
- 1. Inventory current specs (`llman-sdd list --specs`).
41
- 2. If archived history is large, run archive freeze first:
42
- - Preview: `llman-sdd archive freeze --dry-run`
43
- - Execute: `llman-sdd archive freeze --before <YYYY-MM-DD> --keep-recent <N>`
44
- 3. Identify overlapping items across capabilities.
24
+ 1. Inventory specs (`llman-sdd list --specs`).
25
+ 2. If archived history is large, freeze first: preview `llman-sdd archive freeze --dry-run`; execute `llman-sdd archive freeze --before <YYYY-MM-DD> --keep-recent <N>`.
26
+ 3. Identify cross-capability overlap (duplicate req ids across specs: `llman-sdd project dedupe-req-ids --dry-run` reports the remap plan).
45
27
  4. Produce a compaction plan (canonical requirements + keep/merge/remove decisions + migration notes).
46
- 5. Execute and validate (`llman-sdd validate --specs --strict --no-interactive`).
28
+ 5. Execute and validate (`llman-sdd validate --specs --strict`).
47
29
 
48
30
  ## Decision Policy
49
- - Prefer merging when two requirements are semantically equivalent.
50
- - Only extract shared spec text when reference relationships are clear.
51
- - When archive directory is noisy, suggest freezing first before compacting.
31
+ - Prefer merging semantically equivalent requirements; extract shared text only when references are clear; freeze first when the archive is noisy.
52
32
  - If compaction would change external behavior, pause and ask the user first.
53
33
 
54
34
  ## Output Contract
55
- - Output compaction plan grouped by capability.
56
- - Include: keep/merge/remove decisions with rationale.
57
- - Include validation commands and expected results.
58
-
59
- > 💡 After maintenance, new work goes through the normal pipeline: `llman-sdd-propose` (Branch binding + Specs landing) → `llman-sdd-apply` (requires `readyToImplement`) → `llman-sdd-verify` → `llman-sdd-archive`.
35
+ - Compaction plan grouped by capability: keep/merge/remove decisions with rationale + validation commands and expected results.
60
36
 
61
- > For command details run `llman-sdd <cmd> --help`; the CLI is the command reference — skills embed no command tables.
62
- > "Spec" here = a `.feature` file under this project's `llmanspec/specs/`; run `llman-sdd list --specs` or `llman-sdd show <capability>`.
37
+ {{ unit("skills/cli-footer") }}
63
38
 
64
39
  {{ unit("skills/validation-hints") }}
65
40
 
@@ -1,31 +1,27 @@
1
1
  ---
2
2
  name: "llman-sdd-validate"
3
- description: "Validate llmanspec changes and specs with actionable fixes."
3
+ description: "Validate changes and specs; suggest actionable fixes."
4
4
  metadata:
5
5
  version: "{{ llman_version }}"
6
6
  ---
7
7
 
8
8
  # LLMAN SDD Validate
9
9
 
10
- Use this skill to validate change/spec format and staleness.
10
+ Validate change/spec format and staleness.
11
11
 
12
12
  ## Steps
13
- 1. Validate one item: `llman-sdd validate <id>`.
14
- 2. Validate all: `llman-sdd validate --all` (or `--changes` / `--specs`).
15
- 3. Use `--strict` and `--no-interactive` for CI-like checks.
16
- 4. If validation fails, summarize the errors and propose minimal, concrete fixes.
13
+ 1. Single item: `llman-sdd validate <id>`; batch: `llman-sdd validate --all` (or `--changes` / `--specs`); use `--strict` in CI/automation.
14
+ 2. On failure, summarize the errors and propose minimal, concrete fixes.
17
15
  {% if bdd_enabled %}
18
- 5. **BDD checks (Git-native Partitioned SSOT)**:
19
- - Validate live `.feature` Gherkin and `@req` / dual-write gates on the **bound branch** (Branch binding required).
20
- - `.feature` is the harness authority — executable GWT lives only in live `.feature` (no solidify; no `feature_delta` / `change delta`).
21
- - Change lifecycle gates: `change start` / `attach` (Branch binding), `finalize` (close-out; auto commit `archive(sdd): <id>`, `--no-commit` to skip) / `diff` (read-only). `change checkpoint` is removed (no mid-flight archive point; `change finalize` does not require a clean tree).
22
- - `llman-sdd validate --specs` runs `bdd.run_command` by default.
23
- - Use `list --specs --json` for `morphology` (includes `dualWriteCount`).
24
- - Change JSON status fields: `stage` (draft/designed/planned/full) / `specsLanded` / `needsSpecsChange` / `readyToImplement` (`show --json`).
16
+ 3. **BDD checks**:
17
+ - Validate `.feature` Gherkin and `@req` / dual-write gates on the **bound branch**; `.feature` is the harness authority — executable GWT lives only there.
18
+ - Lifecycle gates: `change start` / `attach` (bind branch), `finalize` (close-out; auto commit `archive(sdd): <id>`, `--no-commit` to skip) / `diff` (read-only).
19
+ - `llman-sdd validate --specs` enforces structural and contract gates; when `bdd.run_command` is configured it also executes that harness by default (`--no-check` skips it, `--check` is a compat alias); a placeholder-free command runs at most once per invocation.
20
+ - `list --specs --json` shows `morphology` (ruleCount / ruleEnforcedCount / rulePendingCount / acceptanceCount / featureScenarioCount).
21
+ - Change JSON status fields: `stage` (draft/designed/planned/full) / `specsLanded` / `needsSpecsChange` / `readyToImplement` (`show --output json`).
25
22
  {% endif %}
26
23
 
27
- > For command details run `llman-sdd <cmd> --help`; the CLI is the command reference — skills embed no command tables.
28
- > "Spec" here = a `.feature` file under this project's `llmanspec/specs/`; run `llman-sdd list --specs` or `llman-sdd show <capability>`.
24
+ {{ unit("skills/cli-footer") }}
29
25
 
30
26
  {{ unit("skills/validation-hints") }}
31
27
 
@@ -1,56 +1,44 @@
1
1
  ---
2
2
  name: "llman-sdd-verify"
3
- description: "Verify that an implemented llman SDD change matches its specs, design, and tasks. Produces a report (CRITICAL / WARNING / SUGGESTION) comparing code to artifacts. Run after apply completes. If clean, the change is ready to archive."
3
+ description: "Verify an implemented change against its specs/design/tasks; report CRITICAL/WARNING/SUGGESTION. Run after apply; if clean, ready to archive."
4
4
  metadata:
5
5
  version: "{{ llman_version }}"
6
6
  ---
7
7
 
8
8
  # LLMAN SDD Verify
9
9
 
10
- Use this skill to verify that the implementation matches the change's artifacts.
10
+ Verify that the implementation matches the change's artifacts.
11
11
 
12
12
  ## Pipeline Position
13
13
 
14
- ### Skill navigation (not the lifecycle; shows current skill only)
15
-
16
14
  ```mermaid
17
15
  flowchart LR
18
- apply["llman-sdd-apply<br/>Implement"] --> verify
19
- verify["★ llman-sdd-verify ★<br/>Verify (you are here)"]
20
- verify --> archive["llman-sdd-archive<br/>Archive"]
16
+ apply["llman-sdd-apply"] --> verify["★ llman-sdd-verify"]
17
+ verify --> archive["llman-sdd-archive"]
21
18
 
22
19
  style verify fill:#fff3cd,stroke:#ffc107,stroke-width:3px
23
20
  ```
24
21
 
25
- > 📍 You are in the verify phase → if pass: next `llman-sdd-archive` (archive); if fail: go back to `llman-sdd-apply` (fix). This is Git-native **I (verify)**; the change should already be Specs-landed (`readyToImplement=true`).
26
- > 🗺️ Skill navigation ≠ Git-native lifecycle; see brief lifecycle unit at the bottom.
22
+ > 📍 You are in verify → pass leads to `llman-sdd-archive`, failure goes back to `llman-sdd-apply`. The change should already have landed specs with `readyToImplement=true` (all gates green — the completion signal).
27
23
 
28
24
  ## Hard Constraints
29
25
 
30
- - **Must pass apply phase all-green first**: don't skip to verify on changes that haven't been implemented.
31
- - **CRITICAL issues must be fixed**: CRITICAL problems must be resolved before archive.
32
- - **Don't ask "should I continue?"**: run the full verification flow, output a complete report.
26
+ - **Apply must be all-green first**: don't verify unimplemented changes.
27
+ - **CRITICAL must be fixed**: zero CRITICAL before archive.
28
+ - **Rerun the gates yourself**: MUST rerun `llman-sdd validate <id> --strict` (real harness) and the project gates; MUST NOT trust gate verdicts in the implementer's report — a mismatch is CRITICAL.
29
+ - **`--no-check` is not evidence**: gate evidence obtained with `--no-check` → CRITICAL. Close-out runs the configured `bdd.run_command`, so do not run that command again just before close-out; the skip line printed by `--no-check` is not a pass.
30
+ - **Don't ask "should I continue?"**: run the full verification flow and output a complete report.
33
31
 
34
32
  {{ unit("skills/stage-guard") }}
35
33
 
36
34
  ## Steps
37
35
  1. Select the change id (or ask the user to pick from `llman-sdd list --json`).
38
- 2. Run a fast validation gate:
39
- - `llman-sdd validate <id> --strict --no-interactive`
40
- - **When diagnosing structural issues (Gherkin parse / `@req` linkage / dual-write / global req_id uniqueness), prefer adding `--no-check`** (skips the potentially slow `bdd.run_command` under BDD-on); run the full `--check` (full mode) only after structural gates are green. Each `FAIL <item_type>/<id>` line lists a failing item (above the Totals line).
41
- 3. Read:
42
- - Live specs on the feature branch: `llmanspec/specs/**` (`<capability>.feature`) — SSOT
43
- - `proposal.md` and `design.md` if present
44
- - `tasks.md` to understand what was implemented
45
- - `llmanspec/changes/<id>/specs/` only if residual old docs exist — ignore; SSOT is live specs
46
- 4. **Dual-axis review (Standards + Spec, kept separate so neither masks the other)** — diff against `git diff <merge-base>...HEAD` (merge-base is COMPUTED via `git merge-base <local-default> HEAD`; the stored base_sha is audit-only and MUST NOT feed range math) on two axes:
47
- - **Spec axis**: does the implementation satisfy the `@human` rule MUST/SHALL and the `@executable` GWT?
48
- - Missing/partial behaviors, wrong implementations, and scope creep in the diff not asked for by the spec.
49
- - Suggest minimal fixes or artifact updates.
50
- - **Standards axis**: does the code follow `AGENTS.md` coding style + the Fowler smell baseline?
51
- - **Authority priority**: `AGENTS.md` documented standard > smell baseline (repo overrides); skip anything tooling already enforces.
52
- - Smells are **judgement heuristics** ("possible Feature Envy"), not hard violations.
53
- - Smell baseline (each "what → fix"):
36
+ 2. Fast validation gate: `llman-sdd validate <id> --strict`.
37
+ - When diagnosing structural issues (Gherkin parse / `@req` linkage / dual-write / req_id uniqueness), run the structural validation first (when `bdd.run_command` is configured, validate executes that harness by default — `--no-check` skips it; a harness failure lands as an ERROR on its spec item). Failing items are listed one by one in the default TOON output's `items[].issues[]` (`--output human` prints `FAIL <item_type>/<id>` lines above the `Totals` line).
38
+ 3. Read: `llmanspec/specs/**` (`<capability>.feature`, the single source of truth) on the branch, `proposal.md` and `design.md` (if present), `tasks.md`; ignore residual old docs under `changes/<id>/specs/`.
39
+ 4. **Dual-axis review (kept separate so neither masks the other)** — diff against `git diff <merge-base>...HEAD` (merge-base is COMPUTED via `git merge-base <local-default> HEAD`; the stored base_sha is audit-only and MUST NOT feed range math):
40
+ - **Spec axis**: does the implementation satisfy the `规则:` block requirement statement (free-text description, judged by its semantics) and the nested `场景:` GWT steps? Missing/partial behaviors, wrong implementations, and scope creep not asked for by the spec → suggest minimal fixes or artifact updates. Check where before/after evidence (counts, baselines) was taken: it MUST be measured on the change branch (against the freshly computed merge-base); a value measured on the default branch is usually trivially the baseline and proves nothing.
41
+ - **Standards axis**: does the code follow `AGENTS.md` + the smell baseline? Authority priority: `AGENTS.md` > smell baseline; skip anything tooling already enforces. Smells are **judgement heuristics** ("possible Feature Envy"), not hard violations:
54
42
 
55
43
  | Smell | Fix |
56
44
  |-------|-----|
@@ -67,29 +55,20 @@ flowchart LR
67
55
  | Middle Man (just delegates) | cut it, call direct |
68
56
  | Refused Bequest (subclass rejects most inheritance) | use composition |
69
57
  - The two axes may be reviewed in parallel (sub-agents); the report MUST present them separately, MUST NOT merge or cross-rerank (one axis passing must not mask the other failing).
70
- 5. **BDD-on verification (Git-native Partitioned SSOT)** — only when `config.yaml` has a `bdd:` block:
71
- - Confirm the change is attached and you are on that feature branch.
72
- - `llman-sdd validate --specs`: Gherkin + `@req`/dual-write gates; runs `bdd.run_command` by default (`--no-check` to skip).
73
- - Optional read-only review: `llman-sdd change diff <id>` (or `--export-patch <path>`). Diff is review/export only — never treat it as an apply step.
74
- - Check: legacy `spec.toon` / `*.feature.delta.toon` absent; if present, run toon2features first (do not invent a solidify / repair hunt).
58
+ 5. **BDD verification** — only when `config.yaml` has a `bdd:` block:
59
+ - Confirm the change is branch-bound and you are on that branch.
60
+ - `llman-sdd validate --specs`: Gherkin + `@req`/dual-write gates; when `bdd.run_command` is configured the harness runs by default (`--no-check` skips it) and a failure maps to an ERROR on the matching spec item.
61
+ - Optional read-only review: `llman-sdd change diff <id>` (or `--export-patch <path>`) — review/export only, never an apply step.
75
62
  - Next step after verify passes: `llman-sdd-archive` (not inline finalize here).
76
63
  {% if bdd_verify_prompt %}
77
64
  - Extra requirement: {{ bdd_verify_prompt }}
78
65
  {% endif %}
79
- 6. Produce a short report:
80
- - **CRITICAL** (must fix before archive)
81
- - **WARNING** (should fix)
82
- - **SUGGESTION** (nice to have)
83
- 7. **Human review checkpoint**: once the report has no CRITICAL findings and before suggesting archive, run `llman-sdd review`:
84
- - Exit code zero → suggest `llman-sdd-archive` for finalize/archive.
85
- - Non-zero exit = CRITICAL findings: fix via `llman-sdd-apply`, then re-run review; MUST NOT enter finalize/archive with CRITICAL findings open.
86
-
87
- > 💡 Verify pass → next: `llman-sdd-archive` (archive); CRITICAL issues → go back to `llman-sdd-apply` (fix)
66
+ 6. Produce a short report: **CRITICAL** (must fix before archive) / **WARNING** (should fix) / **SUGGESTION** (nice to have).
67
+ 7. **Human review gate**: once the report has no CRITICAL findings and before suggesting archive, run `llman-sdd review`: exit code zero → suggest `llman-sdd-archive`; non-zero = CRITICAL → fix via `llman-sdd-apply`, then re-run review; MUST NOT enter finalize/archive with CRITICAL findings open.
88
68
 
89
69
  {{ unit("skills/git-native-flow-brief") }}
90
70
  {{ unit("skills/human-readable-summary") }}
91
- > For command details run `llman-sdd <cmd> --help`; the CLI is the command reference — skills embed no command tables.
92
- > "Spec" here = a `.feature` file under this project's `llmanspec/specs/`; run `llman-sdd list --specs` or `llman-sdd show <capability>`.
71
+ {{ unit("skills/cli-footer") }}
93
72
 
94
73
  {{ unit("skills/validation-hints") }}
95
74
 
@@ -1,27 +1,24 @@
1
1
  ---
2
2
  name: "llman-sdd-wayfinder"
3
- description: "Plan a huge, foggy chunk of work (more than one agent session can hold) as a shared map of decision tickets, resolving them one at a time until the way is clear. Manual trigger only; the agent must not auto-invoke."
3
+ description: "Break huge, foggy work (beyond one agent session) into a decision map, resolving decisions one at a time. Manual trigger only."
4
4
  metadata:
5
5
  version: "{{ llman_version }}"
6
+ disable-model-invocation: true
6
7
  ---
7
8
 
8
9
  # LLMAN SDD Wayfinder
9
10
 
10
- A loose, large idea has arrived — too big for a single agent session, wrapped in fog: the way from here to the **destination** isn't visible yet. This skill finds that way rather than charging at the destination.
11
-
12
- It charts the path as an llman SDD **change dependency graph** (`llman-sdd graph`): each sub-work (ticket) resolves a **decision** rather than delivering a slice, worked one at a time until the way is clear.
11
+ A loose, large idea has arrived — too big for a single agent session, and the way from here to the **destination** isn't visible yet. This skill finds that way rather than charging ahead: it charts the path as a change dependency graph (`llman-sdd graph`), where each sub-work item (ticket) resolves a **decision** rather than delivering code, worked one at a time until the way is clear.
13
12
 
14
13
  ## Pipeline position
15
14
 
16
- Auxiliary tool, for **pre-planning large work** before the main pipeline. When the map clears, merge onto the main flow at `llman-sdd-propose`.
17
-
18
- > 📍 Standalone optional skill; when the map clears → `llman-sdd-propose` (collapse decisions into a buildable plan).
15
+ Auxiliary tool for **pre-planning large work** before the main pipeline. When the map clears → `llman-sdd-propose` to collapse decisions into an implementable plan.
19
16
 
20
17
  ## Core principles
21
18
 
22
19
  - **Plan, don't do**: each ticket resolves a decision; the map is done when "the way is clear, no decisions left". The urge to just do the work is usually the signal you've reached the map's edge and should hand off.
23
- - **Refer by name**: in all human-readable narration, refer to a ticket by its title; MUST NOT use bare ids/numbers.
24
- - **One session, one ticket**: each session resolves only one ticket (research tickets excepted).
20
+ - **Refer by name**: in human-readable narration, refer to a ticket by its title; MUST NOT use bare ids/numbers.
21
+ - **One session, one ticket** (research tickets excepted).
25
22
 
26
23
  ## Map structure
27
24
 
@@ -34,7 +31,7 @@ The map's `proposal.md` structure:
34
31
  <what reaching the end looks like — spec/decision/change. One or two lines.>
35
32
 
36
33
  ## Notes
37
- <domain; skills each session should consult; standing preferences for this effort>
34
+ <domain; skills each session should consult; standing preferences>
38
35
 
39
36
  ## Decisions so far
40
37
  <!-- index: one line per closed ticket, gist + link -->
@@ -52,36 +49,35 @@ Each ticket is a child change carrying a `wayfinder:<type>` tag (in the proposal
52
49
 
53
50
  - **Research (agent-driven)**: read docs/APIs/local resources to surface a fact a decision waits on. Delegate to `llman-sdd-research` in the background.
54
51
  - **Prototype (human-in-the-loop)**: raise fidelity with a cheap, rough runnable (throwaway terminal app or UI variant).
55
- - **Grilling (human-in-the-loop)**: via `llman-sdd-explore`'s grilling branch, one question at a time. **Default type**.
52
+ - **Deep-dive Q&A (human-in-the-loop)**: via `llman-sdd-explore`'s deep-dive branch, one question at a time. **Default type**.
56
53
  - **Task (human or agent)**: manual work that must happen before a decision can be made (sign up for a service, move data so its shape is visible).
57
54
 
58
55
  ## Fog of war
59
56
 
60
57
  The map is **deliberately** incomplete. The test for ticket-vs-fog: **can you state the question precisely now** (not whether you can answer it).
61
58
  - Can state precisely → ticket (even if blocked).
62
- - Cannot yet state precisely → **Not yet specified** (coarser than a ticket; one fog patch may graduate into several tickets or none).
59
+ - Cannot yet → **Not yet specified** (coarser than a ticket; one fog patch may graduate into several tickets or none).
63
60
 
64
61
  ## Steps
65
62
 
66
63
  ### Chart the map
67
- 1. **Name the destination**: use `llman-sdd-explore`'s grilling branch to pin down what this map is finding its way to.
68
- 2. **Breadth-first scan**: grill again, fanning out rather than deep-diving, surfacing open decisions and the first takeable steps. If **no fog surfaces** — the way is already clear, the whole effort fits one session — you don't need a map; stop and ask the user how to proceed.
64
+ 1. **Name the destination**: use the deep-dive Q&A branch to pin down what this map is finding its way to.
65
+ 2. **Breadth-first scan**: deep-dive again, fanning out rather than drilling one thread, surfacing open decisions and the first takeable steps. If **no fog surfaces** — the way is already clear, the whole effort fits one session — you don't need a map; stop and ask the user how to proceed.
69
66
  3. **Create the map** (overview change): `llman-sdd change new <map-id>`, fill Destination/Notes, leave Decisions-so-far empty, write fog into Not yet specified.
70
- 4. **Create the tickets you can specify now** as child changes, then wire blocking edges with `llman-sdd graph` (second pass: ids needed before cross-referencing).
67
+ 4. **Create the tickets you can specify now** as child changes, then wire blocking edges with `llman-sdd graph` (ids needed before cross-referencing).
71
68
  5. Spin up `llman-sdd-research` background subagents for each research ticket.
72
69
  6. Stop — charting is one session's work; resolve nothing by hand.
73
70
 
74
71
  ### Work through the map
75
- 1. Load the map (low-resolution view).
76
- 2. Pick a ticket (user-named or first frontier item); claim it with Branch binding (`change start`, or `change attach` if the branch already exists). The map/ticket **planning shell** may briefly live on the default branch; if the ticket must edit live specs, do Specs landing on the bound branch.
77
- 3. Resolve it — zoom as needed (read related ticket bodies, invoke skills the Notes block names). In doubt, use `llman-sdd-explore`'s grilling. **Do not** edit `llmanspec/specs/**` before Branch binding.
72
+ 1. Load the map (low-resolution view; don't read every ticket in full).
73
+ 2. Pick a ticket (user-named or first frontier item); claim it by binding the branch (`change start`, or `change attach` if the branch exists). Planning docs may briefly live on the default branch; if the ticket must edit specs, land them on the bound branch.
74
+ 3. Resolve it — zoom as needed (read related ticket bodies, invoke the skills the Notes block names). In doubt, use the deep-dive Q&A. **Do not** edit `llmanspec/specs/**` before binding.
78
75
  4. Record the resolution: write the answer into the ticket's proposal, close it, append a one-line gist + pointer to the map's Decisions-so-far.
79
- 5. Add newly-surfaced tickets (create-then-wire); graduate fog that the answer has made specifiable, clearing it from Not yet specified. If the answer reveals a ticket sits beyond the destination, rule it out of scope rather than resolving it on the route.
76
+ 5. Add newly-surfaced tickets (create-then-wire); graduate fog the answer made specifiable out of Not yet specified; if the answer reveals a ticket sits beyond the destination, rule it out of scope rather than resolving it on the route.
80
77
 
81
78
  ## Output
82
- Map change + child decision changes' dependency graph (`llman-sdd graph`). When the way is clear, proceed to `llman-sdd-propose` (Branch binding → Specs landing through `readyToImplement=true`) to collapse decisions into an implementable plan.
79
+ Map change + child decision changes' dependency graph (`llman-sdd graph`). When the way is clear, proceed to `llman-sdd-propose` to collapse decisions into an implementable plan.
83
80
 
84
- > For command details run `llman-sdd <cmd> --help`; the CLI is the command reference — skills embed no command tables.
85
- > "Spec" here = a `.feature` file under this project's `llmanspec/specs/`; run `llman-sdd list --specs` or `llman-sdd show <capability>`.
81
+ {{ unit("skills/cli-footer") }}
86
82
 
87
83
  {{ unit("skills/structured-protocol") }}
@@ -0,0 +1,2 @@
1
+ > For command details run `llman-sdd <cmd> --help`; the CLI is the command reference — skills embed no command tables.
2
+ > "Spec" here = a `.feature` file under this project's `llmanspec/specs/`; run `llman-sdd list --specs` or `llman-sdd show <capability>`.
@@ -1,9 +1,10 @@
1
- ## Git-native lifecycle (brief)
1
+ ## Branch lifecycle (brief)
2
2
 
3
- Do not conflate **skill navigation** with the **Git-native lifecycle**. Full diagram: root `AGENTS.md` or the diagram inside `llman-sdd-propose`.
3
+ **Skill navigation** ≠ **branch lifecycle**. Full diagram: root `AGENTS.md` or the one inside `llman-sdd-propose`.
4
4
 
5
5
  Hard rules:
6
- 1. **First** Branch binding (`change start` / `attach`) → Full; **then** Specs landing (edit and commit `llmanspec/specs/**` on the bound branch).
7
- 2. No live contract edits → `needs_specs_change: false`. Apply requires `readyToImplement=true`.
8
- 3. Close-out: `change finalize` (auto commit `archive(sdd): <id>`; `--no-commit` to skip). `change checkpoint` is removed (calling it exits non-zero and points to finalize).
9
- 4. **Do not** commit live specs on the default branch; if already attached, do not re-run `start`.
6
+ 1. **First** bind the branch (`change start` / `attach`) → full; **then** land specs (edit and commit `llmanspec/specs/**` on the bound branch).
7
+ 2. No contract edits → `needs_specs_change: false`. Enter apply when `stage=full` and the specs-landed gate passes; `readyToImplement=true` (all gates green) is the completion signal gating verify/finalize.
8
+ 3. Close-out: `change finalize` (auto commit `archive(sdd): <id>`; `--no-commit` to skip).
9
+ 4. **Do not** commit specs on the default branch; if already attached, do not re-run `start`.
10
+ 5. Worktree (optional): `change start --worktree` creates the branch in a dedicated worktree without hijacking the current checkout (`--base <branch>` records a non-default fork source); finalize runs in place when the target is held by another worktree (location annotated in output).
@@ -1,6 +1,6 @@
1
- ## Git-native lifecycle (full diagram)
1
+ ## Branch lifecycle (full diagram)
2
2
 
3
- Do not conflate two layers: the **Git-native lifecycle** (Branch binding → Specs landing → `readyToImplement`) vs **skill navigation** (explore→propose→apply→verify→archive). Specs landing is **not** a separate skill.
3
+ Two layers, don't conflate them: the **branch lifecycle** (bind branch → land specs → `readyToImplement`) vs **skill navigation** (explore→propose→apply→verify→archive). Landing specs is **not** a separate skill.
4
4
 
5
5
  ```mermaid
6
6
  flowchart TB
@@ -10,21 +10,21 @@ flowchart TB
10
10
  B2["add tasks.md → planned"]
11
11
  end
12
12
 
13
- subgraph gate_start["Branch binding"]
13
+ subgraph bind["Bind branch"]
14
14
  C{"Clean tree<br/>and on default branch?"}
15
15
  D["change start<br/>create sdd/&lt;id&gt; + write branch/base_branch/base_sha"]
16
16
  E["or manual checkout -b<br/>then change attach"]
17
17
  end
18
18
 
19
19
  subgraph specs_only["Only on this change branch"]
20
- F["Edit live llmanspec/specs/** (.feature)"]
21
- G["commit → Specs landing<br/>live merge-base...HEAD includes specs paths"]
20
+ F["Edit llmanspec/specs/** (.feature)"]
21
+ G["commit → land specs<br/>live merge-base...HEAD includes specs paths"]
22
22
  end
23
23
 
24
- subgraph implement["Implement"]
24
+ subgraph implement["Implement & close"]
25
25
  H["apply: code per tasks<br/>may keep editing specs"]
26
26
  I["verify"]
27
- J["finalize<br/>merge (squash default) → rename → auto commit archive(sdd): &lt;id&gt;<br/>specs first hit default branch"]
27
+ J["finalize: merge (squash default) → rename → auto commit archive(sdd): &lt;id&gt;<br/>specs first hit the target branch"]
28
28
  end
29
29
 
30
30
  A --> B1 --> B2 --> C
@@ -34,7 +34,17 @@ flowchart TB
34
34
  ```
35
35
 
36
36
  Hard rules:
37
- 1. **First** `change start` / `attach` (Branch binding) to enter Full; **then** edit `llmanspec/specs/**` on the bound non-default branch and commit (Specs landing).
38
- 2. For changes with no live contract edits, set frontmatter `needs_specs_change: false`. Enter apply only when `llman-sdd show <id> --json` has `readyToImplement=true` — `Full ∧` every `gateChecks` item passes (specs-landed = `specsLanded ∨ needs_specs_change=false`; ranges are live merge-bases, stored `base_sha` is audit-only).
39
- 3. `change checkpoint` is removed (no mid-flight archive point; `change finalize` does not require a clean tree). Close-out is `llman-sdd change finalize <id>`: it auto-commits `archive(sdd): <id>` (impl diff + rename in one commit); `--no-commit` skips the auto commit for manual/CI histories. Commits on the change branch are free (segmented or finalize single-shot).
40
- 4. **Do not** commit live specs to the default branch just to satisfy the clean-tree gate; if already attached, do not re-run `start`.
37
+ 1. **First** `change start` / `attach` to bind the branch (enter full); **then** edit `llmanspec/specs/**` on the bound non-default branch and commit (land specs).
38
+ 2. No contract edits → set frontmatter `needs_specs_change: false`. Enter apply when `stage=full` and the specs-landed gate passes (specsLanded ∨ needs_specs_change=false); `readyToImplement=true` (every gateChecks item green, incl. tasks-done) is the completion signal gating verify/finalize. Diff ranges are always live merge-bases; the stored `base_sha` is audit-only.
39
+ 3. Close-out is `llman-sdd change finalize <id>`: it auto-commits `archive(sdd): <id>` (impl diff + rename in one commit); `--no-commit` skips the auto commit. Commits on the change branch are free (segmented or finalize single-shot).
40
+ 4. **Do not** commit specs to the default branch just to satisfy the clean-tree gate; if already attached, do not re-run `start`.
41
+
42
+ Worktree decision table:
43
+
44
+ | Working style | Command | Criteria |
45
+ |---|---|---|
46
+ | Single checkout | `llman-sdd change start <id>` | On the default branch with a clean tree; switches this checkout to the new branch |
47
+ | Keep current checkout / parallel changes | `llman-sdd change start <id> --worktree` | Branch lives in a dedicated worktree (`sdd.worktree_root` / `sdd.worktree_naming` config; default sibling of the repo root), current checkout untouched, output includes the worktree path; pair with `--base <branch>` for a non-default fork source |
48
+ | Already on a feature branch (incl. manual wt/git-worktree) | `llman-sdd change attach <id>` | Branch already exists; `--base <branch>` records the fork source explicitly |
49
+
50
+ finalize target location: when the target branch is held by another worktree, `llman-sdd change finalize <id>` / `llman-sdd change archive <id>` run the merge, rename and commit inside that worktree (output includes `executed in target worktree <path>`); a dirty holding worktree aborts with disposal options and zero writes.
@@ -1,10 +1,9 @@
1
1
  # Human-Readable Summary (mandatory)
2
2
 
3
- Every report, handoff, or gate output you produce in this workflow MUST open
4
- with a short human-readable summary block before any machine detail:
3
+ Every report, handoff, or gate output MUST open with a short human-readable summary before any machine detail:
5
4
 
6
5
  - **Verdict** — one line (e.g. "all gates green" / "2 CRITICAL found").
7
6
  - **Risks** — up to three bullets, highest impact first.
8
7
  - **Decisions needed** — explicit asks, or "none".
9
8
 
10
- Keep it under ten lines; details belong below the fold.
9
+ Under ten lines; details below the fold.
@@ -1,17 +1,17 @@
1
1
  ## Stage guard (`stage` / `readyToImplement`)
2
2
 
3
- Decide from authoritative JSON (never from vague "complete artifacts" wording):
3
+ Decide from authoritative JSON (never from "artifacts look complete"):
4
4
 
5
5
  ```bash
6
- llman-sdd show <id> --json --type change
6
+ llman-sdd show <id> --output json --type change
7
7
  ```
8
8
 
9
9
  Read: `stage`, `specsLanded`, `needsSpecsChange`, `readyToImplement`, `gateChecks` (per-item `pass` + one-line `hint` when failing).
10
10
 
11
11
  | Condition | Action |
12
12
  |-----------|--------|
13
- | `stage=draft` (proposal.md only) | STOP. Grow to Designed (add design.md) → Planned (add tasks.md) → Branch binding → Specs landing. Draft cannot apply/verify. If proposal+design+tasks exist but stage is still `draft`: tasks-without-design — add design.md first. **Do not** create `changes/<id>/specs/`; **do not** edit live specs on the default branch first. |
14
- | `stage=designed` (proposal + design) | Next: add tasks.md → `planned`. Run `change start` / `attach` (Branch binding) only after planning artifacts are complete. |
15
- | `stage=planned` (proposal + design + tasks) | STOP until binding: run `change start` / `attach` (Branch binding) → `full`. |
16
- | `stage=full` and `readyToImplement=false` | STOP. Finish Specs landing on the **bound branch** (edit `llmanspec/specs/**` and commit), or set `needs_specs_change: false`. **Do not** re-run `change start`. If specs on the bound branch were lost → checkout/recreate + `attach --force` if needed. |
17
- | `readyToImplement=true` | Pass apply/verify prerequisites. `changes/<id>/specs/` is expected to be **absent** — do not treat as missing. |
13
+ | `stage=draft` (proposal.md only) | STOP. Grow: add design.md → designed, add tasks.md → planned, then bind the branch and land specs. Draft cannot apply/verify. If proposal+tasks exist but stage is still `draft` (tasks-without-design — design.md gates the stage): add design.md first. **Do not** create `changes/<id>/specs/`; **do not** edit specs on the default branch first. |
14
+ | `stage=designed` (proposal + design) | Next: add tasks.md → `planned`. Bind (`change start` / `attach`) only after planning docs are complete. |
15
+ | `stage=planned` (proposal + design + tasks) | STOP until bound: `change start` / `attach` → `full`. |
16
+ | `stage=full` and `readyToImplement=false` | Read the failing `gateChecks` items. specs-landed gate failing → land specs on the **bound branch** (edit `llmanspec/specs/**` and commit), or set `needs_specs_change: false`; **do not** re-run `change start` (lost bound-branch specs → checkout/recreate + `attach --force` if needed). specs-landed gate green but tasks-done/validate/clean-tree failing → normal mid-implementation state: proceed with apply (check off tasks); do not treat it as a landing failure. |
17
+ | `readyToImplement=true` | Completion signal: every gateChecks item green (tasks done + validate passed) — verify/finalize prerequisites met. `changes/<id>/specs/` is expected to be **absent** — do not treat as missing. |
@@ -1,23 +1,20 @@
1
1
  ## Context
2
- - Check state before acting: change/spec status comes from `llman-sdd show/list/validate` output.
3
- - Locate relevant specs with `llman-sdd context --task --paths` before reading spec files.
2
+ - Check state before acting: change/spec status comes from `llman-sdd show/list/validate`; locate relevant specs with `llman-sdd context --task --paths` before reading spec files.
4
3
 
5
4
  ## Goal
6
- - Reach one verifiable outcome for this command; report result paths and validation state.
5
+ - Reach one verifiable outcome; report result paths and validation state.
7
6
 
8
7
  ## Constraints
9
- - Follow the hard rules in the skill body (not repeated here). Triage first: behavior-contract changes take the full SDD path, implementation-only changes take quick; when unsure choose full SDD.
10
- - Keep changes minimal; never force past a known validation failure.
8
+ - Follow the skill body's hard rules (not repeated here). Classify first: behavior-contract changes take the full SDD path, implementation-only changes take quick; when unsure choose full SDD. Keep changes minimal; never force past a known validation failure.
11
9
 
12
10
  ## Workflow
13
- - Treat `llman-sdd` command output as the source of truth at every step; run `llman-sdd validate` after touching artifacts.
14
- - Command details: the generated command reference below, or `llman-sdd <cmd> --help`.
11
+ - Treat `llman-sdd` command output as the source of truth at every step; run `llman-sdd validate` after touching artifacts. Command details: `llman-sdd <cmd> --help`.
15
12
 
16
13
  ## Decision Policy
17
14
  - Clarify high-impact ambiguity before proceeding; verify facts yourself, ask the user only for decisions.
18
15
 
19
16
  ## Output Contract
20
- - Human-readable summary first (conclusion / risks / decisions needed), machine detail after.
17
+ - Human-readable summary first (verdict / risks / decisions needed), machine detail after.
21
18
 
22
19
  ## Ethics Governance
23
20
  - `ethics.risk_level`: low — reads/writes this repo and `llmanspec/` only, no outward-facing actions; a skill body may override.
@@ -1,7 +1,6 @@
1
1
  Validation fixes (single-track feature-as-spec):
2
2
 
3
- 1) Missing header comments (`missing `# capability:`` header comment`):
4
- Every capability `.feature` (`llmanspec/specs/<capability>.feature` or `llmanspec/specs/<capability>/<capability>.feature`) MUST start with:
3
+ 1) Missing header comments (`missing # capability: header comment`): every capability `.feature` (`llmanspec/specs/<capability>.feature` or the same-named main file in a directory) MUST start with:
5
4
  ```
6
5
  # language: zh-CN
7
6
  # capability: <capability>
@@ -9,16 +8,13 @@ Every capability `.feature` (`llmanspec/specs/<capability>.feature` or `llmanspe
9
8
  # scope: src/
10
9
  ```
11
10
 
12
- 2) Tag grammar (`@human constraint scenario must carry an @req:<req_id> tag` / `orphan acceptance scenario`):
13
- - Rules: `@req:<id> @human` — statement in the scenario description (MUST/SHALL required).
14
- - Acceptance: `@executable` + at least one `@req:<id>` linking a rule.
15
- Never combine `@human` with `@executable`. (`@manual` was removed in 0.3.0 — drop it; `@human` already carries the human-judgement semantics.)
11
+ 2) Native layout (`rule must carry an @req:<req_id> tag on the rule header`):
12
+ - One canonical style: `@req:<id>` on the `规则:` block header, nested `场景:` (Given/When/Then) as executable examples — the default preferred shape.
13
+ - Only keep a `规则:` block with no nested scenario (bare rule) for requirements that cannot be expressed programmatically or are not yet converted: free-text description, no MUST/SHALL enforcement; validate reports an aggregate count, the review `pending` signal measures it, specs-compact keeps reducing it.
14
+ - Legacy tags `@executable`/`@rule`/`@human`/`@manual` are gone and parse inert; when old files hit structural problems run `llman-sdd spec migrate-native`.
15
+ - Top-level `场景:` outside any `规则:` are plain feature-level examples: no rule handle, no warning, not part of rule accounting (native Gherkin).
16
16
 
17
- 3) Legacy `spec.toon` present (`legacy spec.toon found ... run ... toon2features`):
18
- Run `llman-sdd project migrate --kind toon2features --yes`, review the diff, commit.
19
-
20
- Git-native guardrail:
21
- - **Branch binding** → **Specs landing**: first `change start` / `attach`, then edit live `.feature` files on the bound non-default branch and commit.
22
- - Locked rules (report-only): editing/removing an existing `@human` scenario yields a WARNING and never blocks validate / change finalize / change diff; the report names the edited rule by `@req:<id>`. Control points: git branch diff plus `llman-sdd review` / `change diff` output. Legacy lock-ack metadata (frontmatter `rules_touched` / `agent_acked`, the `@agent` tag, the `--yes` ack semantics) is fully removed — no aliases, no compat layer (locked rules are report-only: a warning, never a block).
23
- - Apply requires `readyToImplement=true` (or `needs_specs_change: false`). Close-out prefers `change finalize`.
24
- - Do not use `change delta` / solidify / `*.feature.delta.toon`.
17
+ Branch guardrail:
18
+ - First `change start` / `attach` to bind the branch, then edit `.feature` on the bound non-default branch and commit (land specs).
19
+ - Locked rules (report-only): editing/removing an existing `规则:` block yields a WARNING and never blocks validate / finalize / `change diff`; the report names the rule by `@req:<id>`. Control points: git branch diff plus `llman-sdd review` / `change diff`. Legacy lock-ack metadata (frontmatter `rules_touched` / `agent_acked`, the `@agent` tag, the `--yes` ack semantics) is fully removed — no aliases, no compat layer.
20
+ - Enter apply when `stage=full` and the specs-landed gate passes (specsLanded ∨ `needs_specs_change: false`); verify/finalize require `readyToImplement=true` (completion signal). Close-out prefers `change finalize`.
@@ -1,7 +1,8 @@
1
- ## Canonical Single-Track Feature Contract
1
+ ## Canonical Single-Track Feature Contract (native Gherkin layout)
2
2
 
3
- Each capability is ONE Gherkin file: flat `llmanspec/specs/<capability>.feature` (default) or directory `llmanspec/specs/<capability>/` with a same-named main file — pick one layout, both at once is a conflict.
4
- It is the only spec artifact — there is no `spec.toon`.
3
+ Each capability is ONE Gherkin file: flat `llmanspec/specs/<capability>.feature` (default) or directory `llmanspec/specs/<capability>/` with a same-named main file — pick one layout; both at once is a conflict. It is the only spec artifact (there is no `spec.toon`).
4
+
5
+ The format is the **native Gherkin hierarchy**: `功能:` → `规则:` (the requirement: title + free-form description + `@req:<id>` handle) → nested `场景:` (executable GWT examples). This is the only canonical style; legacy tags (`@executable`/`@rule`/`@human`/`@manual`) are gone — migrate old files with `spec migrate-native`.
5
6
 
6
7
  ```gherkin
7
8
  # language: zh-CN
@@ -11,19 +12,29 @@ It is the only spec artifact — there is no `spec.toon`.
11
12
 
12
13
  功能: sample
13
14
 
14
- @req:r1 @human
15
- 场景: Rule title
16
- System MUST do something.
15
+ @req:r1
16
+ 规则: A requirement point
17
+ Free-text requirement (no MUST/SHALL enforcement); wrap long text across
18
+ lines for human/agent readability. A description line must not begin with
19
+ a step keyword (would be parsed as a step).
20
+
21
+ 场景: An executable example
22
+ 假如 a precondition
23
+ 当 a trigger happens
24
+ 那么 the outcome is observed
17
25
 
18
- @req:r1 @executable
19
- 场景: happy
20
- 假如 a precondition
21
- 当 a trigger happens
22
- 那么 the outcome is observed
26
+ @req:r2
27
+ 规则: Not-yet-converted requirement (bare rule — counted by the aggregate nudges)
28
+ This description is the only carrier of the requirement today. Rules with
29
+ no nested scenario are counted as bare; specs-compact keeps driving them
30
+ down or converting them.
23
31
  ```
24
32
 
25
- - Header comments (`# capability:` / `# purpose:` / `# scope:`) are REQUIRED; `scope` drives staleness.
26
- - `@human` scenarios are human-owned constraints; their description carries the normative statement verbatim. Editing/removing them yields a WARNING only (report-only, never blocks a gate) — compare via git branch diff; the legacy lock-ack metadata `rules_touched` / `agent_acked` / `@agent` is removed with no aliases and no compat layer (locked rules are report-only: a warning, never a block).
27
- - `@executable` scenarios are runner-bound acceptance; they link rules via `@req:<req_id>`.
28
- - Coverage tiers: enforced (has acceptance) / pending. `list --specs` reports both.
29
- - Scenarios MUST stay top-level: `Rule:` blocks are rejected (the runner skips them silently).
33
+ - Header comments (`# capability:` / `# purpose:` / `# scope:`) are REQUIRED; `scope` drives staleness checks.
34
+ - **Executable scenarios preferred**: express behavior as nested `场景:` (`Given/When/Then`) bound to BDD step code and executed by the runner — the default. Only use a `规则:` block without executable scenarios for requirements that cannot be expressed programmatically (abstract goals, architecture decisions, governance/human judgment) or are not yet converted; record the rationale in proposal/design.
35
+ - `@req:<id>` lives on the `规则:` block header: the global unique requirement handle (shared by resolve-req/next-req-id/citation). Missing or duplicate ids are validate ERRORs.
36
+ - Rule description is free text: no MUST/SHALL enforcement; wrap long text across lines for reviewability, with no `- ` list marker (it would enter the description verbatim).
37
+ - Top-level `场景:` outside any `规则:` are plain feature-level examples (native Gherkin allows them; no rule handle, no warning, not part of rule accounting); rules with no nested scenario are bare rules (aggregate INFO via `--include-info`; the review `pending` signal measures them).
38
+ - Editing/removing an existing `规则:` block yields a WARNING only (report-only, never blocks a gate) — compare via git branch diff; the legacy lock-ack metadata `rules_touched` / `agent_acked` / `@agent` is removed with no aliases and no compat layer.
39
+ - Coverage tiers: enforced (has nested scenarios) / pending (bare) — `list --specs` reports both.
40
+ - `规则:` blocks are containers: nested `场景:` are executed by the runner; two-space indent tiers (`规则:` 2, nested `场景:` 4, steps 6).