devflow-kit 3.7.0 → 3.9.0
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/CHANGELOG.md +479 -1
- package/README.md +15 -15
- package/dist/agents/code.md +6 -8
- package/dist/agents/design.md +1 -1
- package/dist/agents/fix.md +7 -8
- package/dist/agents/git.md +3 -3
- package/dist/agents/harden.md +1 -1
- package/dist/agents/refactor.md +2 -4
- package/dist/agents/review.md +4 -4
- package/dist/agents/skim.md +2 -2
- package/dist/agents/triage.md +9 -2
- package/dist/cli/commands/capture.js +1 -1
- package/dist/cli/commands/curation-move-io.js +102 -0
- package/dist/cli/commands/curation-move-step.js +374 -0
- package/dist/cli/commands/curation.js +808 -0
- package/dist/cli/commands/gate-level-prompts.js +428 -0
- package/dist/cli/commands/gates.js +35 -11
- package/dist/cli/commands/init-seed.js +11 -8
- package/dist/cli/commands/init.js +244 -57
- package/dist/cli/commands/memory.js +60 -13
- package/dist/cli/commands/prompt-io.js +37 -0
- package/dist/cli/commands/uninstall.js +157 -17
- package/dist/cli.js +2 -2
- package/dist/commands/bug-analysis.md +25 -36
- package/dist/commands/code-review.md +40 -44
- package/dist/commands/debug.md +5 -5
- package/dist/commands/dynamic-build.md +26 -25
- package/dist/commands/dynamic-plan.md +5 -5
- package/dist/commands/dynamic-profile.md +5 -5
- package/dist/commands/dynamic-tickets.md +5 -5
- package/dist/commands/explore.md +6 -6
- package/dist/commands/implement.md +53 -82
- package/dist/commands/plan.md +6 -6
- package/dist/commands/release.md +5 -5
- package/dist/commands/research.md +6 -6
- package/dist/commands/resolve.md +39 -41
- package/dist/commands/self-review.md +5 -13
- package/dist/core/area-pause-notice.js +44 -0
- package/dist/core/assets.js +20 -20
- package/dist/core/curate-tuning-config.js +5 -6
- package/dist/core/curation-move-notice.js +84 -0
- package/dist/core/curation-move-skip.js +35 -0
- package/dist/core/curation-move.js +35 -0
- package/dist/core/curation-queue-cleanup.js +135 -0
- package/dist/core/curation-store.js +99 -0
- package/dist/core/{learning-variants.js → curation-variants.js} +65 -41
- package/dist/core/echo-value.js +11 -5
- package/dist/core/evidence-policy.js +11 -9
- package/dist/core/feature-switch.js +95 -19
- package/dist/core/fs-atomic.js +1 -1
- package/dist/core/gate-level.js +10 -2
- package/dist/core/git.js +16 -14
- package/dist/core/ledger-root.js +82 -22
- package/dist/core/linked-path.js +4 -4
- package/dist/core/manifest-lock.js +238 -0
- package/dist/core/manifest.js +58 -14
- package/dist/core/migrations.js +1 -13
- package/dist/core/observations.js +2 -2
- package/dist/core/plugins.js +19 -19
- package/dist/core/pool.js +26 -0
- package/dist/core/project-paths.js +103 -34
- package/dist/core/queue-drain.js +2 -2
- package/dist/core/tracked-areas.js +159 -0
- package/dist/core/tracker.js +1 -1
- package/dist/{learning-off → curation-off}/agents/code.md +6 -8
- package/dist/{learning-off → curation-off}/agents/fix.md +7 -8
- package/dist/{learning-off → curation-off}/agents/refactor.md +2 -4
- package/dist/{learning-off → curation-off}/agents/review.md +3 -3
- package/dist/{learning-off → curation-off}/agents/triage.md +8 -1
- package/dist/{learning-off → curation-off}/commands/bug-analysis.md +20 -31
- package/dist/{learning-off → curation-off}/commands/code-review.md +37 -41
- package/dist/{learning-off → curation-off}/commands/debug.md +2 -2
- package/dist/{learning-off → curation-off}/commands/dynamic-build.md +23 -22
- package/dist/{learning-off → curation-off}/commands/explore.md +2 -2
- package/dist/{learning-off → curation-off}/commands/implement.md +50 -79
- package/dist/{learning-off → curation-off}/commands/plan.md +2 -2
- package/dist/{learning-off → curation-off}/commands/resolve.md +36 -38
- package/dist/{learning-off → curation-off}/commands/self-review.md +2 -10
- package/dist/hud/components/{learning-counts.js → curation-counts.js} +63 -17
- package/dist/hud/config.js +1 -1
- package/dist/hud/index.js +6 -6
- package/dist/hud/render.js +3 -3
- package/dist/skills/git/references/pr/post-resolution-summary.md +12 -11
- package/dist/skills/git/references/pr/post-review-summary.md +12 -11
- package/dist/skills/git/references/pr/update-pr-evidence.md +2 -2
- package/dist/skills/git/references/pr/validate-branch.md +8 -5
- package/dist/skills/git/references/publication-gate.md +6 -7
- package/dist/skills/git/references/tracker/github/ensure-pr-ready.md +13 -5
- package/dist/skills/git/references/tracker/github/manage-debt.md +6 -2
- package/dist/skills/git/references/tracker/jira/ensure-pr-ready.md +13 -5
- package/dist/skills/git/references/tracker/jira/manage-debt.md +6 -2
- package/dist/skills/git/references/tracker/linear/ensure-pr-ready.md +13 -5
- package/dist/skills/git/references/tracker/linear/manage-debt.md +6 -2
- package/dist/targets/claude-code/{learning-install.js → curation-install.js} +85 -65
- package/dist/targets/claude-code/installer.js +15 -15
- package/dist/targets/claude-code/language-stamp.js +5 -5
- package/dist/targets/claude-code/post-install.js +2 -2
- package/dist/targets/claude-code/tracker-servers.js +1 -1
- package/package.json +3 -2
- package/src/assets/agents/_partials/_code.mds +11 -11
- package/src/assets/agents/code.mds +6 -6
- package/src/assets/agents/curate.md +8 -8
- package/src/assets/agents/debug.mds +6 -6
- package/src/assets/agents/design.mds +18 -18
- package/src/assets/agents/evaluate.md +6 -12
- package/src/assets/agents/fix.mds +7 -6
- package/src/assets/agents/git.mds +3 -3
- package/src/assets/agents/harden.mds +7 -7
- package/src/assets/agents/knowledge.mds +23 -23
- package/src/assets/agents/refactor.mds +2 -2
- package/src/assets/agents/research.mds +15 -15
- package/src/assets/agents/review.mds +43 -43
- package/src/assets/agents/skim.mds +11 -11
- package/src/assets/agents/triage.mds +29 -22
- package/src/assets/agents/validate.md +30 -50
- package/src/assets/commands/_partials/_decisions.mds +22 -20
- package/src/assets/commands/_partials/_engine.mds +8 -8
- package/src/assets/commands/_partials/_knowledge.mds +29 -15
- package/src/assets/commands/_partials/_preamble.mds +4 -4
- package/src/assets/commands/_partials/_settings.mds +3 -3
- package/src/assets/commands/_partials/_wave.mds +7 -7
- package/src/assets/commands/bug-analysis.mds +37 -48
- package/src/assets/commands/code-review.mds +53 -57
- package/src/assets/commands/debug.mds +14 -14
- package/src/assets/commands/dynamic-build.mds +38 -37
- package/src/assets/commands/dynamic-plan.mds +22 -22
- package/src/assets/commands/dynamic-profile.mds +2 -2
- package/src/assets/commands/dynamic-tickets.mds +8 -8
- package/src/assets/commands/explore.mds +20 -20
- package/src/assets/commands/implement.mds +77 -98
- package/src/assets/commands/plan.mds +27 -27
- package/src/assets/commands/release.mds +12 -12
- package/src/assets/commands/research.mds +19 -19
- package/src/assets/commands/resolve.mds +66 -60
- package/src/assets/commands/self-review.mds +20 -20
- package/src/assets/mds/git/_ops.mds +9 -2
- package/src/assets/mds/git/_ops_pr.mds +21 -11
- package/src/assets/mds/git/_ops_steps.mds +20 -4
- package/src/assets/mds/git/_pr.mds +21 -18
- package/src/assets/mds/git/_references.mds +6 -7
- package/src/assets/mds/tracker/_github.mds +1 -4
- package/src/assets/mds/tracker/_jira.mds +1 -4
- package/src/assets/mds/tracker/_linear.mds +1 -4
- package/src/assets/rules/quality.md +1 -0
- package/src/assets/scripts/ci-wait.cjs +389 -92
- package/src/assets/scripts/hooks/background-memory-update +81 -3
- package/src/assets/scripts/hooks/capture-prompt +12 -12
- package/src/assets/scripts/hooks/capture-question +11 -11
- package/src/assets/scripts/hooks/capture-turn +12 -12
- package/src/assets/scripts/hooks/{learning-lock → curation-lock} +2 -2
- package/src/assets/scripts/hooks/curation-move +293 -0
- package/src/assets/scripts/hooks/ensure-devflow-init +45 -13
- package/src/assets/scripts/hooks/ensure-proxy +4 -4
- package/src/assets/scripts/hooks/ensure-root-gitignore +4 -4
- package/src/assets/scripts/hooks/git-marker +81 -0
- package/src/assets/scripts/hooks/json-helper.cjs +176 -51
- package/src/assets/scripts/hooks/json-parse +1 -1
- package/src/assets/scripts/hooks/lib/curation-move.cjs +1582 -0
- package/src/assets/scripts/hooks/lib/{learning-store.cjs → curation-store.cjs} +308 -122
- package/src/assets/scripts/hooks/lib/decisions-format.cjs +3 -3
- package/src/assets/scripts/hooks/lib/mkdir-lock.cjs +24 -7
- package/src/assets/scripts/hooks/lib/project-paths.cjs +132 -39
- package/src/assets/scripts/hooks/lib/render-decisions.cjs +42 -22
- package/src/assets/scripts/hooks/lib/tracked-areas.cjs +452 -0
- package/src/assets/scripts/hooks/memory-permission +10 -2
- package/src/assets/scripts/hooks/memory-worker +12 -1
- package/src/assets/scripts/hooks/pre-compact-memory +17 -16
- package/src/assets/scripts/hooks/queue-append +444 -102
- package/src/assets/scripts/hooks/resolve-project-root +2 -2
- package/src/assets/scripts/hooks/session-start-context +198 -72
- package/src/assets/scripts/hooks/session-start-memory +42 -43
- package/src/assets/scripts/lib/project-config.cjs +12 -5
- package/src/assets/scripts/pr-evidence.cjs +5 -2
- package/src/assets/scripts/resolve-base.cjs +1043 -0
- package/src/assets/scripts/resolve-settings.cjs +283 -45
- package/src/assets/scripts/verify-evidence.cjs +307 -75
- package/src/assets/skills/agent-references/SKILL.md +11 -2
- package/src/assets/skills/agent-references/references/commands/implement-levels.md +29 -0
- package/src/assets/skills/agent-references/references/commands/implement-revalidate.md +6 -4
- package/src/assets/skills/agent-references/references/commands/resolve-levels.md +25 -0
- package/src/assets/skills/agent-references/references/synthesize/review.md +4 -4
- package/src/assets/skills/agent-references/references/triage/severity-tiers.md +43 -0
- package/src/assets/skills/agent-references/references/validate/passed-alone.md +14 -0
- package/src/assets/skills/apply-decisions/SKILL.md +1 -1
- package/src/assets/skills/docs-framework/SKILL.md +7 -7
- package/src/assets/skills/docs-framework/references/patterns.md +3 -4
- package/src/assets/skills/quality-gates/SKILL.md +1 -1
- package/src/assets/skills/worktree-support/references/roots.md +2 -2
- package/templates/lint-pack/.lint-pack.conf +86 -0
- package/templates/lint-pack/README.md +190 -0
- package/templates/lint-pack/lint-pack.sh +905 -0
- package/dist/cli/commands/learning.js +0 -554
- package/dist/core/learning-queue-cleanup.js +0 -27
- package/dist/core/learning-store.js +0 -61
- /package/dist/{learning-off → curation-off}/agents/debug.md +0 -0
- /package/dist/{learning-off → curation-off}/agents/design.md +0 -0
- /package/dist/{learning-off → curation-off}/agents/harden.md +0 -0
- /package/dist/{learning-off → curation-off}/agents/knowledge.md +0 -0
- /package/dist/{learning-off → curation-off}/agents/research.md +0 -0
- /package/dist/{learning-off → curation-off}/agents/skim.md +0 -0
- /package/dist/{learning-off → curation-off}/commands/dynamic-plan.md +0 -0
- /package/dist/{learning-off → curation-off}/commands/dynamic-profile.md +0 -0
- /package/dist/{learning-off → curation-off}/commands/dynamic-tickets.md +0 -0
- /package/dist/{learning-off → curation-off}/commands/release.md +0 -0
- /package/dist/{learning-off → curation-off}/commands/research.md +0 -0
|
@@ -3,7 +3,7 @@ description: Execute a single task through implementation, quality gates, and PR
|
|
|
3
3
|
---
|
|
4
4
|
# Implement Command
|
|
5
5
|
|
|
6
|
-
Orchestrate a single task through implementation by spawning specialized agents.
|
|
6
|
+
Orchestrate a single task through implementation by spawning specialized agents.
|
|
7
7
|
|
|
8
8
|
## Usage
|
|
9
9
|
|
|
@@ -34,8 +34,6 @@ $ARGUMENTS
|
|
|
34
34
|
|
|
35
35
|
Note: a bare digit run is a reference **only** under `github`, and that adjudication belongs to the Git agent, never to this command — the command layer holds no provider knowledge, so deciding it here would be a guess dressed as a rule.
|
|
36
36
|
|
|
37
|
-
> **Tip**: For best results, run `/plan` first to produce a design artifact, then pass it to `/implement`.
|
|
38
|
-
|
|
39
37
|
## Phases
|
|
40
38
|
|
|
41
39
|
### Re-validation Continuation Path
|
|
@@ -44,9 +42,9 @@ When the user explicitly asks to re-validate, re-check, or re-run quality gates
|
|
|
44
42
|
|
|
45
43
|
### Phase 1: Setup
|
|
46
44
|
|
|
47
|
-
**Produces:** TASK_ID, BASE_BRANCH, EXECUTION_PLAN, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, PR_DESCRIPTION_GUIDANCE, ISSUE_NUMBER, ISSUE_PR_LINK, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL, PR_EXCEPTIONS, TEST_PLAN, EVIDENCE_FILE, PR_TEST_PLAN_BLOCK, REVIEW_PUBLICATION
|
|
45
|
+
**Produces:** TASK_ID, BASE_BRANCH, BASE_REF, EXECUTION_PLAN, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, PR_DESCRIPTION_GUIDANCE, ISSUE_NUMBER, ISSUE_PR_LINK, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL, PR_EXCEPTIONS, TEST_PLAN, EVIDENCE_FILE, PR_TEST_PLAN_BLOCK, REVIEW_PUBLICATION, GATE_LEVEL
|
|
48
46
|
|
|
49
|
-
Record the current branch name as `BASE_BRANCH`. Stop the run unless it matches `^[A-Za-z0-9._
|
|
47
|
+
Record the current branch name as `BASE_BRANCH`. Stop the run unless it matches `^(?![-#]|origin\/|(?:@|(?:FETCH_|ORIG_|MERGE_)?HEAD)$)(?!.*\.\.)[A-Za-z0-9._\/+@,#-]{1,200}$` (judge the match by reading; never pass the value to a command), telling the user it allows only ASCII letters, digits and `._/+@,#-`, at most 200; no leading `-` or `#`, no `origin/` prefix, no `..`, not `@` or a HEAD name.
|
|
50
48
|
|
|
51
49
|
**Docs root (D-DOCS-ROOT).** Every `.devflow/docs/` path this command reads or writes lives at the checkout's toplevel, never under the directory the session started in. Resolve `{worktree}` from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`) — by running
|
|
52
50
|
|
|
@@ -79,7 +77,7 @@ If `PR_DESCRIPTION_GUIDANCE` was not set above (non-plan paths: issue input or t
|
|
|
79
77
|
|
|
80
78
|
**Empty input.** When `COMMAND_INPUT` is empty — a plan handoff arrives this way, with the plan already in the conversation — there is no argument to name the branch from, and the Git agent sees none of this conversation. Write the description yourself: one line, taken from the plan's title or, with no plan, from the conversation. Send it as the setup-task `TASK_DESCRIPTION` below.
|
|
81
79
|
|
|
82
|
-
Spawn Git agent to set up
|
|
80
|
+
Spawn Git agent to set up the task:
|
|
83
81
|
|
|
84
82
|
```
|
|
85
83
|
Agent(subagent_type="Git"):
|
|
@@ -94,33 +92,14 @@ Derive branch name from issue or description, create feature branch, and fetch i
|
|
|
94
92
|
Return the branch setup summary."
|
|
95
93
|
```
|
|
96
94
|
|
|
97
|
-
The issue token is forwarded **unclassified
|
|
98
|
-
SHAPE alone — how many tokens `COMMAND_INPUT` has, and whether it ends in `.md`.
|
|
99
|
-
|
|
100
|
-
`setup-task` is the one step that has resolved a provider, and therefore the only
|
|
101
|
-
one that knows what an issue reference looks like on this machine: `#123`,
|
|
102
|
-
`PROJ-12` and `ENG-12` are three providers' spellings of the same thing. A
|
|
103
|
-
`starts with #` test here would be a github test wearing a neutral name — it
|
|
104
|
-
reclassifies every other provider's reference as a task description, so the
|
|
105
|
-
branch is derived from prose and no issue is ever fetched, with nothing reporting
|
|
106
|
-
a problem. Token COUNT is the gate that stays provider-neutral: every one of
|
|
107
|
-
those spellings is a single token, and no free-text task description is.
|
|
95
|
+
The issue token is forwarded **unclassified**; routing is by SHAPE alone (the token count of `COMMAND_INPUT` and a `.md` ending). Only `setup-task` has resolved a provider, so a `starts with #` test would be a github test that reclassifies `PROJ-12` and `ENG-12` as task descriptions: the branch comes from prose, no issue is fetched and nothing reports it. Token COUNT is provider-neutral: every issue spelling is one token and no free-text description is.
|
|
108
96
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
- **Extension.** A path ending in `.md` is a plan document, never an issue
|
|
112
|
-
reference — it goes to `PLAN_ARTIFACT_PATH` and neither of the other two keys.
|
|
113
|
-
`ISSUE_INPUT` then carries the plan's frontmatter `issue` instead, never the
|
|
114
|
-
path (Plan Document Handling step 4).
|
|
115
|
-
- **Token count.** A single token is an issue reference. Two or more is prose:
|
|
116
|
-
forwarding only its FIRST token would send `/implement fix the login bug` to
|
|
117
|
-
the Git agent as `ISSUE_INPUT: fix` with no description at all, and
|
|
118
|
-
`setup-task` fetches whatever it is handed — so the command would derive a
|
|
119
|
-
branch from a failed lookup and drop the request on the floor.
|
|
97
|
+
- **Extension.** A path ending in `.md` is a plan document, never an issue reference: it goes to `PLAN_ARTIFACT_PATH` only, and `ISSUE_INPUT` carries the plan's frontmatter `issue`, never the path (Plan Document Handling step 4).
|
|
98
|
+
- **Token count.** One token is an issue reference; two or more is prose. Forwarding the FIRST token alone would send `/implement fix the login bug` as `ISSUE_INPUT: fix` with no description, so the request is dropped.
|
|
120
99
|
|
|
121
100
|
**Capture from Git agent output** (used throughout flow):
|
|
122
101
|
- `TASK_ID`: The branch name created by Git agent (use as TASK_ID for rest of flow)
|
|
123
|
-
- `BASE_BRANCH`: Branch this feature was created from (for PR target)
|
|
102
|
+
- `BASE_BRANCH`: Branch this feature was created from (for PR target); stop unless it passes the setup check
|
|
124
103
|
- `ISSUE_NUMBER`: the provider-canonical issue identifier for this task — the same value the Git agent emits as `ISSUE_ID` (if provided, or created by the Git agent's issue-first step in setup-task)
|
|
125
104
|
- `branch_slug`: `TASK_ID` with every `/` replaced by `-`. It names `handoff-{branch_slug}.md` and `evidence-{branch_slug}.md` only when it matches `^[A-Za-z0-9._-]{1,200}$`; any other branch name stops the run here, telling the user it cannot name those files.
|
|
126
105
|
|
|
@@ -165,13 +144,13 @@ node "$HOME/.devflow/scripts/verify-evidence.cjs" render --plan "{worktree}/.dev
|
|
|
165
144
|
|
|
166
145
|
- `EVIDENCE_FILE` — `{worktree}/.devflow/docs/evidence-{branch_slug}.md`, its `## Evidence Exceptions` section now a byte copy of `PR_EXCEPTIONS` (absent when that is `(none)`).
|
|
167
146
|
|
|
168
|
-
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root
|
|
147
|
+
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root in a one-worktree run:
|
|
169
148
|
|
|
170
149
|
```bash
|
|
171
150
|
node "$HOME/.devflow/scripts/resolve-settings.cjs" "{root}" 2>/dev/null; echo "exit=$?"
|
|
172
151
|
```
|
|
173
152
|
|
|
174
|
-
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off>
|
|
153
|
+
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off> CURATION=<on|off> KNOWLEDGE=<on|off> GATE_LEVEL=<full|standard|lean>` — these fields, in this order, nothing else, where `<host>` is a lowercase dotted host name alone, `<key>` is 2–10 of `A-Z`, `0-9` and `_` starting with a letter, and each `<id>` is one of `gdpr`, `hipaa`, `pci-dss`, `soc2`, `iso-27001`, `sox`. **Anything else** (a non-zero exit, no line, extra text, or a missing, reordered or unlisted field or value) ⇒ use `TRACKER=github TRACKER_SOURCE=default TRACKER_WARN=invalid SITE=none KEY=none REVIEW_PUBLICATION=off COMPLIANCE=generic MEMORY=off CURATION=off KNOWLEDGE=off GATE_LEVEL=full` instead.
|
|
175
154
|
|
|
176
155
|
The accepted line is the only source of these values.
|
|
177
156
|
|
|
@@ -243,12 +222,14 @@ A KB with no Rules section labels its entries `Rules ({section name}):` and give
|
|
|
243
222
|
|
|
244
223
|
**One git call, then direct reads — no `.cjs` script.**
|
|
245
224
|
|
|
225
|
+
**Fresh base.** Before Phase 2, write `BASE_BRANCH` with the Write tool to the file that `F="$(mktemp)" && echo "F=$F"` prints, after one Read of it. If the Write tool fails, treat the value as missing; never write it with a shell command. Then run `F="{name file}"; trap 'rm -- "$F"' EXIT; cd "{worktree}" && node "$HOME/.devflow/scripts/resolve-base.cjs" local --name-stdin < "$F"; echo "exit=$?"`. Output other than one `BASE_REF=` line (40 or 64 hex, or `none`) with `exit=0` counts as `NOTE=stop`, `REASON=resolver-unavailable`. Record `BASE_REF`. By `NOTE`: `none` continues; `info` prints one plain line; `degraded` records `TRACEABILITY: DEGRADED (base {REASON}; fix: {fix})`; `stop` (`BASE_REF=none`) stops the run, naming REASON and its fix. Fix by REASON: no-merge-base `git fetch --unshallow`; no-ref or timeout `git fetch origin <base>` (`<base>` stays as written); resolver-unavailable `re-run; if it repeats, run devflow init`; invalid-name the allowed set, never the name; any other REASON none, and `; fix: {fix}` is left out.
|
|
226
|
+
|
|
246
227
|
### Phase 2: Implement
|
|
247
228
|
|
|
248
229
|
**Produces:** CODE_AGENT_OUTPUT, FILES_CHANGED
|
|
249
230
|
**Requires:** TASK_ID, BASE_BRANCH, EXECUTION_PLAN
|
|
250
231
|
|
|
251
|
-
|
|
232
|
+
Setup context is the plan document, issue body or conversation.
|
|
252
233
|
|
|
253
234
|
**Strategy Selection**:
|
|
254
235
|
- If plan document provided: use `execution-strategy` from frontmatter (if absent, use the table below)
|
|
@@ -262,7 +243,7 @@ Based on Setup context (plan document, issue body, or conversation context), use
|
|
|
262
243
|
|
|
263
244
|
---
|
|
264
245
|
|
|
265
|
-
**SINGLE_CODE_AGENT
|
|
246
|
+
**SINGLE_CODE_AGENT**:
|
|
266
247
|
|
|
267
248
|
```
|
|
268
249
|
Agent(subagent_type="Code"):
|
|
@@ -278,7 +259,7 @@ FEATURE_KNOWLEDGE: {feature_knowledge}
|
|
|
278
259
|
|
|
279
260
|
---
|
|
280
261
|
|
|
281
|
-
**SEQUENTIAL_CODE_AGENTS
|
|
262
|
+
**SEQUENTIAL_CODE_AGENTS**:
|
|
282
263
|
|
|
283
264
|
Spawn Code agents one at a time. Each appends its own phase section to the handoff file, and the next reads only the section before it:
|
|
284
265
|
|
|
@@ -314,11 +295,11 @@ HANDOFF_REQUIRED: {true if not last phase}
|
|
|
314
295
|
HANDOFF_FILE: {worktree}/.devflow/docs/handoff-{branch_slug}.md"
|
|
315
296
|
```
|
|
316
297
|
|
|
317
|
-
**Handoff Protocol**: Each
|
|
298
|
+
**Handoff Protocol**: Each Code agent with HANDOFF_REQUIRED=true appends its own `## Phase {N} Implementation Summary` section, at most 8,192 bytes, to `{worktree}/.devflow/docs/handoff-{branch_slug}.md`, never rewriting an earlier section and keeping any `## Evidence Exceptions` section byte-identical; the next Code agent reads only the section of the phase immediately before its own through HANDOFF_FILE. The orchestrator writes no phase section. Delete `{worktree}/.devflow/docs/handoff-{branch_slug}.md` once the PR exists — after Phase 9 (cleanup).
|
|
318
299
|
|
|
319
300
|
---
|
|
320
301
|
|
|
321
|
-
**PARALLEL_CODE_AGENTS
|
|
302
|
+
**PARALLEL_CODE_AGENTS**:
|
|
322
303
|
|
|
323
304
|
Spawn multiple Code agents **in a single message**, each with independent subtask:
|
|
324
305
|
|
|
@@ -344,18 +325,20 @@ FEATURE_KNOWLEDGE: {feature_knowledge}
|
|
|
344
325
|
{COMPLIANCE_DIRECTIVE}"
|
|
345
326
|
```
|
|
346
327
|
|
|
347
|
-
**Independence criteria** (all must be true for PARALLEL_CODE_AGENTS):
|
|
348
|
-
- No shared contracts or interfaces
|
|
349
|
-
- No integration points between subtasks
|
|
350
|
-
- Different files/modules with no imports between them
|
|
351
|
-
- Each subtask is self-contained
|
|
328
|
+
**Independence criteria** (all must be true for PARALLEL_CODE_AGENTS): no shared contracts, interfaces or integration points between subtasks; different files/modules with no imports between them.
|
|
352
329
|
|
|
353
330
|
### Phase 3: Polish
|
|
354
331
|
|
|
355
332
|
**Produces:** POLISH_OUTPUT
|
|
356
|
-
**Requires:**
|
|
333
|
+
**Requires:** BASE_REF, GATE_LEVEL
|
|
357
334
|
|
|
358
|
-
|
|
335
|
+
**Gate level.** At `standard` or `lean`, once per run, run `d="${CLAUDE_CONFIG_DIR:-}"; case "$d" in /*) ;; *) d="$HOME/.claude" ;; esac; printf '%s\n' "$d"` in Bash and Read `<that directory>/skills/devflow:agent-references/references/commands/implement-levels.md` with the Read tool, and apply each row to the phase it names.
|
|
336
|
+
|
|
337
|
+
- No row or rule overrides the next two lines.
|
|
338
|
+
- If the Read fails, or the file has no `## Phases` heading with the `| Phase | standard | lean |` header, or a row breaks its grammar, apply no row, keep `GATE_LEVEL` and say `level reference unreadable: no level rows applied`.
|
|
339
|
+
- Validate, the CI gate, the evidence claims and the compliance directive run at every level. An enabled compliance lens keeps Harden.
|
|
340
|
+
|
|
341
|
+
After the Code agent completes, spawn Polish agent to polish the code. The Phase 6 Validate covers its commits. `{branch_diff}` is the output of `git diff --name-only --diff-filter=d {BASE_REF}...HEAD`, run again at each spawn; a non-zero exit stops, and an empty list counts only on exit 0.
|
|
359
342
|
|
|
360
343
|
```
|
|
361
344
|
Agent(subagent_type="Polish"):
|
|
@@ -369,9 +352,9 @@ Commit any improvements with a conventional-commit message."
|
|
|
369
352
|
### Phase 4: Self-Review
|
|
370
353
|
|
|
371
354
|
**Produces:** HARDEN_OUTPUT
|
|
372
|
-
**Requires:**
|
|
355
|
+
**Requires:** BASE_REF
|
|
373
356
|
|
|
374
|
-
After
|
|
357
|
+
After Phase 3, spawn Harden agent as the quality gate:
|
|
375
358
|
|
|
376
359
|
```
|
|
377
360
|
Agent(subagent_type="Harden"):
|
|
@@ -386,7 +369,7 @@ Harden agent reports `### Status: PASS | FIXED | BLOCKED`. **If BLOCKED:** repor
|
|
|
386
369
|
### Phase 5: Alignment Check
|
|
387
370
|
|
|
388
371
|
**Produces:** ALIGNMENT_RESULT
|
|
389
|
-
**Requires:**
|
|
372
|
+
**Requires:** BASE_REF, EXECUTION_PLAN
|
|
390
373
|
|
|
391
374
|
After Harden agent passes, spawn Evaluate agent to validate alignment. Evaluate agent receives `FEATURE_KNOWLEDGE_RULES` as acceptance context only; pattern and anti-pattern judgments belong to Harden agent:
|
|
392
375
|
|
|
@@ -422,13 +405,15 @@ Validate alignment with request and plan. Report ALIGNED or MISALIGNED with deta
|
|
|
422
405
|
### Phase 6: Validate
|
|
423
406
|
|
|
424
407
|
**Produces:** VALIDATION_RESULT, VALIDATED_HEAD
|
|
425
|
-
**Requires:**
|
|
408
|
+
**Requires:** BASE_REF, GATE_LEVEL
|
|
426
409
|
|
|
427
410
|
Validate takes the one full-suite slot, after every commit it must cover: Code, Polish, Harden and the alignment fixes. After Evaluate agent passes, spawn Validate agent. `FILES_CHANGED` is the branch diff:
|
|
428
411
|
|
|
429
412
|
```
|
|
430
413
|
Agent(subagent_type="Validate"):
|
|
431
|
-
"
|
|
414
|
+
"GATE_LEVEL: {GATE_LEVEL}
|
|
415
|
+
BASE_SHA: {BASE_REF}
|
|
416
|
+
FILES_CHANGED: {branch_diff}
|
|
432
417
|
VALIDATION_SCOPE: full
|
|
433
418
|
Run build, typecheck, lint, test. Report pass/fail with failure details."
|
|
434
419
|
```
|
|
@@ -466,7 +451,7 @@ Run build, typecheck, lint, test. Report pass/fail with failure details."
|
|
|
466
451
|
### Phase 7: QA Testing
|
|
467
452
|
|
|
468
453
|
**Produces:** QA_RESULT
|
|
469
|
-
**Requires:**
|
|
454
|
+
**Requires:** BASE_REF, EXECUTION_PLAN, TEST_PLAN, VALIDATED_HEAD
|
|
470
455
|
|
|
471
456
|
After Phase 6 passes, spawn Test agent for scenario-based acceptance testing:
|
|
472
457
|
|
|
@@ -522,21 +507,22 @@ Verify the qa-fix commits did not break anything."
|
|
|
522
507
|
### Phase 9: Open PR
|
|
523
508
|
|
|
524
509
|
**Produces:** PR_NUMBER
|
|
525
|
-
**Requires:** BASE_BRANCH, TASK_ID, ISSUE_NUMBER, ISSUE_PR_LINK, PR_EXCEPTIONS, PR_TEST_PLAN_BLOCK, PR_DESCRIPTION_GUIDANCE, APPLY_CONVENTIONS, CODE_AGENT_OUTPUT
|
|
510
|
+
**Requires:** BASE_BRANCH, BASE_REF, TASK_ID, ISSUE_NUMBER, ISSUE_PR_LINK, PR_EXCEPTIONS, PR_TEST_PLAN_BLOCK, PR_DESCRIPTION_GUIDANCE, APPLY_CONVENTIONS, CODE_AGENT_OUTPUT
|
|
526
511
|
|
|
527
|
-
Run once, after the gates, under every strategy.
|
|
512
|
+
Run once, after the gates, under every strategy. No Code agent opens a PR: the Git agent does, and it pastes `ISSUE_PR_LINK`, `PR_EXCEPTIONS` and `PR_TEST_PLAN_BLOCK` through their paste gates and scrubs the body (D11) before `gh pr create`. This command renders no link line and creates no PR itself: the Git agent's Phase-1 rendering is the only one, forwarded verbatim.
|
|
528
513
|
|
|
529
514
|
```
|
|
530
515
|
Agent(subagent_type="Git"):
|
|
531
516
|
"OPERATION: ensure-pr-ready
|
|
532
517
|
WORKTREE_PATH: {worktree}
|
|
533
518
|
BASE_BRANCH: {base branch}
|
|
519
|
+
BASE_REF: {BASE_REF}
|
|
534
520
|
TASK_ID: {task-id}
|
|
535
521
|
ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
|
|
536
522
|
ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}
|
|
537
523
|
PR_EXCEPTIONS: {the ## Evidence Exceptions section of {worktree}/.devflow/docs/handoff-{branch_slug}.md verbatim, or (none)}
|
|
538
524
|
PR_TEST_PLAN_BLOCK: {PR_TEST_PLAN_BLOCK verbatim, or (none)}
|
|
539
|
-
PR_DESCRIPTION_GUIDANCE: {pr_description_guidance from Phase 1 unless it is (none), then the Code agents' reports from CODE_AGENT_OUTPUT in spawn order — Implementation, Commits and Key Decisions, and a sequential agent's ## Phase {N} Implementation Summary}
|
|
525
|
+
PR_DESCRIPTION_GUIDANCE: {pr_description_guidance from Phase 1 unless it is (none), then the Code agents' reports from CODE_AGENT_OUTPUT in spawn order — Implementation, Commits and Key Decisions, and a sequential agent's ## Phase {N} Implementation Summary, then Validate's `Lint pack:` line if UNVERIFIED, for Testing}
|
|
540
526
|
APPLY_CONVENTIONS: {APPLY_CONVENTIONS}
|
|
541
527
|
COMMIT_UNCOMMITTED: false
|
|
542
528
|
Open the pull request for this branch and return the pre-flight summary."
|
|
@@ -574,7 +560,7 @@ git push origin HEAD; echo "exit=$?"
|
|
|
574
560
|
**Produces:** EVIDENCE_RESULT
|
|
575
561
|
**Requires:** PR_NUMBER, EVIDENCE_FILE, REVIEW_PUBLICATION
|
|
576
562
|
|
|
577
|
-
Run once, after Phase 10, under every strategy
|
|
563
|
+
Run once, after Phase 10, under every strategy. Skip it only when Phase 9 stopped the run. A `ci` TP reads `INDETERMINATE` only when the CI gate could not tell or did not run.
|
|
578
564
|
|
|
579
565
|
**Push first.** Every claim is keyed to the HEAD an agent reported, and a Harden or Fix agent may have committed without pushing; a claim whose SHA is not in the PR reads `UNVERIFIED`. So push the branch once before the script — never force, and no retry:
|
|
580
566
|
|
|
@@ -594,13 +580,13 @@ Drop the `--evidence` pair when that file does not exist or its path does not ma
|
|
|
594
580
|
|
|
595
581
|
### Phase 12: Report
|
|
596
582
|
|
|
597
|
-
**Requires:** VALIDATION_RESULT, ALIGNMENT_RESULT, QA_RESULT, PR_NUMBER, EVIDENCE_RESULT
|
|
583
|
+
**Requires:** VALIDATION_RESULT, ALIGNMENT_RESULT, QA_RESULT, PR_NUMBER, EVIDENCE_RESULT, GATE_LEVEL
|
|
598
584
|
|
|
599
|
-
Display completion summary with phase status, PR info, and next steps.
|
|
585
|
+
Display completion summary with phase status, `Gate level: {GATE_LEVEL}` with any level note, Validate's `Lint pack:` line if any, PR info, and next steps.
|
|
600
586
|
|
|
601
587
|
Show the test plan's evidence from Phase 11: `Test plan: {VERIFIED-CI + ATTESTED-LOCAL}/{total} verified (VERIFIED-CI {n}, ATTESTED-LOCAL {n})`, read from the `EVIDENCE` line and never inferred, then its `**Body**:` / `**Comment**:` line verbatim. Without an `EVIDENCE` line, show `Test plan: evidence unavailable`; with no test plan, `Test plan: missing`.
|
|
602
588
|
|
|
603
|
-
If any Git agent output emitted `TRACEABILITY: DEGRADED ({reason})` lines during the run, or Phase 10's push, Phase 11's push or Phase 11's script output carried one, surface them verbatim in the report under a `### Traceability` subsection so the user can act on them.
|
|
589
|
+
If any Git agent output emitted `TRACEABILITY: DEGRADED ({reason})` lines during the run, or the fresh base step, Phase 10's push, Phase 11's push or Phase 11's script output carried one, surface them verbatim in the report under a `### Traceability` subsection so the user can act on them.
|
|
604
590
|
|
|
605
591
|
If Phase 9 listed uncommitted files, show them as a `### Uncommitted files` subsection: the user commits them or discards them.
|
|
606
592
|
|
|
@@ -608,14 +594,6 @@ If Phase 1 recorded an evidence exception, show its `## Evidence Exceptions` lin
|
|
|
608
594
|
|
|
609
595
|
### Feature Knowledge Write-Back (Conditional)
|
|
610
596
|
|
|
611
|
-
Resolve `{worktree}` as the checkout's toplevel, because feature knowledge bases are committed with the branch (D-PROMPT-ROOT): from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`) — run
|
|
612
|
-
|
|
613
|
-
```bash
|
|
614
|
-
git -C "{start}" rev-parse --show-toplevel
|
|
615
|
-
```
|
|
616
|
-
|
|
617
|
-
and use its one-line output. If the command fails (outside a git repository), `{worktree}` is the start directory itself. All paths below are relative to `{worktree}`.
|
|
618
|
-
|
|
619
597
|
**Step 1 — Check the opt-out gate, with `{root}` = `{worktree}`:** take the settings line resolved above for that root, resolving it with the settings block when this run has not yet.
|
|
620
598
|
|
|
621
599
|
If the settings line says `KNOWLEDGE=off`, skip write-back entirely. The machine switch (`devflow knowledge --disable`), the repository and the personal settings can each turn knowledge off, and none can turn it back on (D-FEATURES-NARROW-ONLY). The fail-closed line says `KNOWLEDGE=off` too, so an unresolvable line skips write-back.
|
|
@@ -659,13 +637,10 @@ When the Knowledge agent reports `KB_COMMIT: skipped (detached HEAD)`, the files
|
|
|
659
637
|
## Architecture
|
|
660
638
|
|
|
661
639
|
```
|
|
662
|
-
/implement
|
|
663
|
-
│
|
|
664
|
-
├─ Re-validation Path (when user says "re-validate"/"re-check"/"re-run gates")
|
|
665
|
-
│ └─ Branch safety → skip Phase 2 → record BASE_BRANCH → Phases 3-8 → Phase 9, 11, 12
|
|
640
|
+
/implement
|
|
666
641
|
│
|
|
667
642
|
├─ Phase 1: Setup
|
|
668
|
-
├─ Phase 2: Implement
|
|
643
|
+
├─ Phase 2: Implement
|
|
669
644
|
├─ Phase 3: Polish
|
|
670
645
|
├─ Phase 4: Self-Review
|
|
671
646
|
├─ Phase 5: Alignment Check
|
|
@@ -674,7 +649,7 @@ When the Knowledge agent reports `KB_COMMIT: skipped (detached HEAD)`, the files
|
|
|
674
649
|
├─ Phase 8: Re-Validate (only if a qa-fix committed)
|
|
675
650
|
├─ Phase 9: Open PR (every strategy, outside the strategy branches)
|
|
676
651
|
├─ Phase 10: CI Status Gate (every strategy)
|
|
677
|
-
├─ Phase 11: Evidence (every strategy
|
|
652
|
+
├─ Phase 11: Evidence (every strategy)
|
|
678
653
|
├─ Phase 12: Report
|
|
679
654
|
│
|
|
680
655
|
└─ Feature Knowledge Write-Back (Conditional)
|
|
@@ -682,15 +657,11 @@ When the Knowledge agent reports `KB_COMMIT: skipped (detached HEAD)`, the files
|
|
|
682
657
|
|
|
683
658
|
## Principles
|
|
684
659
|
|
|
685
|
-
1. **Orchestration only** - Command spawns agents, never does work itself; the inline calls are the bounded plumbing the charter allows: the Phase 10 and
|
|
686
|
-
2. **
|
|
687
|
-
3. **
|
|
688
|
-
4. **
|
|
689
|
-
5. **Validate agent owns validation** - Never run `npm test`, `npm run build`, or similar in main session; always delegate to Validate agent
|
|
690
|
-
6. **Fix agent owns fixes** - Never implement fixes in main session; spawn Fix agent for validation failures and alignment fixes
|
|
691
|
-
7. **Loop limits** - Max 2 validation retries, max 2 alignment fix iterations, max 2 QA retries before escalating to user; the CI gate allows at most 3 waits and 2 fixes
|
|
692
|
-
8. **CI awareness** - CI status is checked before merge under every strategy, once Phase 9 has opened the PR; test-plan evidence (Phase 11) is recorded under every strategy once the PR exists
|
|
660
|
+
1. **Orchestration only** - Command spawns agents, never does work itself (no tests, builds or fixes); "Spawn X" means call the Agent tool; the inline calls are the bounded plumbing the charter allows: the fresh base step's resolver calls (Phase 1, re-validation), the Phase 10 and 11 pushes, the Phase 10 ci-wait call, the Phase 11 evidence publish call and the evidence script checks
|
|
661
|
+
2. **Honest reporting** - Display agent outputs directly
|
|
662
|
+
3. **Loop limits** - Max 2 validation retries, max 2 alignment fix iterations, max 2 QA retries before escalating to user; the CI gate allows at most 3 waits and 2 fixes
|
|
663
|
+
4. **CI awareness** - CI status is checked before merge; test-plan evidence (Phase 11) is recorded under every strategy
|
|
693
664
|
|
|
694
665
|
## Error Handling
|
|
695
666
|
|
|
696
|
-
If any agent fails, report the phase, agent type
|
|
667
|
+
If any agent fails, report the phase, agent type and error. Offer: retry the phase, investigate, or escalate to user.
|
|
@@ -108,13 +108,13 @@ If the user says "skip" or "just proceed" — skip remaining questions, present
|
|
|
108
108
|
**Produces:** SKIM_CONTEXT, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, GATE_LEVEL
|
|
109
109
|
**Requires:** CONFIRMED_SCOPE
|
|
110
110
|
|
|
111
|
-
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root
|
|
111
|
+
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root in a one-worktree run:
|
|
112
112
|
|
|
113
113
|
```bash
|
|
114
114
|
node "$HOME/.devflow/scripts/resolve-settings.cjs" "{root}" 2>/dev/null; echo "exit=$?"
|
|
115
115
|
```
|
|
116
116
|
|
|
117
|
-
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off>
|
|
117
|
+
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off> CURATION=<on|off> KNOWLEDGE=<on|off> GATE_LEVEL=<full|standard|lean>` — these fields, in this order, nothing else, where `<host>` is a lowercase dotted host name alone, `<key>` is 2–10 of `A-Z`, `0-9` and `_` starting with a letter, and each `<id>` is one of `gdpr`, `hipaa`, `pci-dss`, `soc2`, `iso-27001`, `sox`. **Anything else** (a non-zero exit, no line, extra text, or a missing, reordered or unlisted field or value) ⇒ use `TRACKER=github TRACKER_SOURCE=default TRACKER_WARN=invalid SITE=none KEY=none REVIEW_PUBLICATION=off COMPLIANCE=generic MEMORY=off CURATION=off KNOWLEDGE=off GATE_LEVEL=full` instead.
|
|
118
118
|
|
|
119
119
|
The accepted line is the only source of these values.
|
|
120
120
|
|
|
@@ -72,7 +72,7 @@ For each worktree:
|
|
|
72
72
|
2. **If `--review {timestamp}` provided:** use that specific directory (not supported in multi-worktree mode)
|
|
73
73
|
3. **Otherwise:** sort directories by name descending (timestamps are naturally sortable), scan the 10 most recent directories only. Select the first that contains `review-summary.md` (complete review)
|
|
74
74
|
4. **If latest directory already has `resolution-summary.md`:** the review is resolved — check bug-analysis fallback (step 5b).
|
|
75
|
-
5. **Legacy fallback:** if no timestamped subdirectories exist but flat `*.md` files do in `{worktree}/.devflow/docs/reviews/{branch-slug}/`, read them directly
|
|
75
|
+
5. **Legacy fallback:** if no timestamped subdirectories exist but flat `*.md` files do in `{worktree}/.devflow/docs/reviews/{branch-slug}/`, read them directly.
|
|
76
76
|
|
|
77
77
|
**5b. Bug analysis fallback** — if no qualifying review directory found (no reviews exist, or all resolved):
|
|
78
78
|
- List directories in `{worktree}/.devflow/docs/bug-analysis/{branch-slug}/`
|
|
@@ -86,15 +86,15 @@ Set `TARGET_DIR` to the selected review or bug-analysis directory path, and `TAR
|
|
|
86
86
|
|
|
87
87
|
#### Step 0d: Load Project Context
|
|
88
88
|
|
|
89
|
-
**Produces:** FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL, REVIEW_PUBLICATION, RESOLUTION_TS
|
|
89
|
+
**Produces:** FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL, REVIEW_PUBLICATION, RESOLUTION_TS, GATE_LEVEL
|
|
90
90
|
|
|
91
|
-
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root
|
|
91
|
+
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root in a one-worktree run:
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
94
|
node "$HOME/.devflow/scripts/resolve-settings.cjs" "{root}" 2>/dev/null; echo "exit=$?"
|
|
95
95
|
```
|
|
96
96
|
|
|
97
|
-
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off>
|
|
97
|
+
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off> CURATION=<on|off> KNOWLEDGE=<on|off> GATE_LEVEL=<full|standard|lean>` — these fields, in this order, nothing else, where `<host>` is a lowercase dotted host name alone, `<key>` is 2–10 of `A-Z`, `0-9` and `_` starting with a letter, and each `<id>` is one of `gdpr`, `hipaa`, `pci-dss`, `soc2`, `iso-27001`, `sox`. **Anything else** (a non-zero exit, no line, extra text, or a missing, reordered or unlisted field or value) ⇒ use `TRACKER=github TRACKER_SOURCE=default TRACKER_WARN=invalid SITE=none KEY=none REVIEW_PUBLICATION=off COMPLIANCE=generic MEMORY=off CURATION=off KNOWLEDGE=off GATE_LEVEL=full` instead.
|
|
98
98
|
|
|
99
99
|
The accepted line is the only source of these values.
|
|
100
100
|
|
|
@@ -179,6 +179,12 @@ Resolve this per worktree — unlike the evidence policy above, the settings lin
|
|
|
179
179
|
|
|
180
180
|
Set it per worktree, from that worktree's lens, and pass that worktree's `COMPLIANCE_DIRECTIVE` to each of its Code and Fix spawns, on a line of its own.
|
|
181
181
|
|
|
182
|
+
**Gate level.** Each worktree keeps its own `GATE_LEVEL`. When any is `standard` or `lean`, once per run, run `d="${CLAUDE_CONFIG_DIR:-}"; case "$d" in /*) ;; *) d="$HOME/.claude" ;; esac; printf '%s\n' "$d"` in Bash and Read `<that directory>/skills/devflow:agent-references/references/commands/resolve-levels.md` with the Read tool, and apply each row to the phase it names, as the reference says.
|
|
183
|
+
|
|
184
|
+
- No row or rule overrides the next two lines.
|
|
185
|
+
- If the Read fails, or the file has no `## Phases` heading with the `| Phase | standard | lean |` header, or a row breaks its grammar, apply no row in any worktree, keep every `GATE_LEVEL` and say `level reference unreadable: no level rows applied`.
|
|
186
|
+
- No level changes the Triage security gate or the ESCALATED route. The Verification Gate, the CI gate and the compliance directive run at every level.
|
|
187
|
+
|
|
182
188
|
**Mint `RESOLUTION_TS` once per run:** `date -u +%Y-%m-%dT%H:%M:%SZ`. Every worktree reuses it — the resolution comment's dedup marker is searched per PR, so one run key keeps a retry of this run deduplicated while the next /resolve on the same PR posts. Phase 5 writes it as the summary's `**Date**:` and Phase 9b-2 passes it, so the local file and the posted marker agree.
|
|
183
189
|
|
|
184
190
|
### Phase 1: Parse Issues
|
|
@@ -248,13 +254,15 @@ Follow devflow:apply-feature-knowledge for FEATURE_KNOWLEDGE."
|
|
|
248
254
|
|
|
249
255
|
Wait for Triage agent to complete before proceeding. Parse verdict ledger from Triage agent output:
|
|
250
256
|
- **ESCALATED**: Security issues requiring human escalation
|
|
251
|
-
- **FIX_NOW**: Valid issues assigned to Code agents (with risk tier: Standard | Careful)
|
|
257
|
+
- **FIX_NOW**: Valid issues assigned to Code agents (with risk tier: Standard | Careful | `Standard, prose only: edit text alone; agent instructions count as logic; if this issue needs a logic change, leave it unedited and name it`; any other value counts as Careful). SCOPE gives one `{id}: {tier}` line per issue.
|
|
252
258
|
- **FALSE_POSITIVE**: Issues the Review agent got wrong (with cited evidence)
|
|
253
259
|
- **BY_DESIGN**: Intentional code (with a recorded decision, stated in words, or a code doc citation)
|
|
254
260
|
- **FIX_SEPARATE**: Valid but out of blast-radius scope (must become manage-debt ticket)
|
|
255
261
|
- **TECH_DEBT**: Architectural overhaul only — LAST RESORT
|
|
256
262
|
- **DUPLICATE**: Collapsed duplicate issue — carries `duplicate_of: <primary-id>` referencing the non-DUPLICATE primary; inherits the primary's outcome
|
|
257
263
|
|
|
264
|
+
A ledger `### Summary` line `- Tiers: not applied (…)` is the level note.
|
|
265
|
+
|
|
258
266
|
**Triage agent completeness assertion:** Verify the parsed ledger against ISSUES before proceeding:
|
|
259
267
|
1. Every issue `id` from ISSUES must appear in exactly one verdict bucket — none may vanish, none may appear in multiple buckets. DUPLICATE is a valid bucket; a valid DUPLICATE entry must name its `duplicate_of` primary (the `Duplicate Of` column of the ledger's DUPLICATE table) and that primary must be a non-DUPLICATE issue id. A missing `duplicate_of` or one that chains to another DUPLICATE is a **Triage agent failure** (retry-then-abort as below).
|
|
260
268
|
2. If the Triage agent output is empty, contains a skill re-entrancy guard string (e.g., contains `already running`), or is missing any issue IDs from ISSUES: treat as a **Triage agent failure**:
|
|
@@ -268,10 +276,10 @@ Wait for Triage agent to complete before proceeding. Parse verdict ledger from T
|
|
|
268
276
|
**Produces:** BATCHES
|
|
269
277
|
**Requires:** TRIAGE_RESULTS
|
|
270
278
|
|
|
271
|
-
If FIX_NOW list is empty: skip to Phase 5
|
|
279
|
+
If FIX_NOW list is empty: skip to Phase 5, then run Phases 9, 9b, 9c and 10.
|
|
272
280
|
|
|
273
281
|
Otherwise, batch FIX_NOW issues for Code agent execution. **DUPLICATE issues are never dispatched** — they inherit the primary's outcome:
|
|
274
|
-
- **Same-file issues** → one batch (one Code agent per file
|
|
282
|
+
- **Same-file issues** → one batch (one Code agent per file)
|
|
275
283
|
- **Distinct-file issues** → parallel Code agents
|
|
276
284
|
- **Max 5 issues per batch** — chunk large sets
|
|
277
285
|
|
|
@@ -302,24 +310,27 @@ Spawn distinct-file batch Code agents **in a single message** (parallel). Sequen
|
|
|
302
310
|
Collect from each Code agent:
|
|
303
311
|
- `{status, commitShas, unresolved}` per batch
|
|
304
312
|
- `## Verification` block (commands run + results)
|
|
313
|
+
- An unresolved prose-only issue that Code names as needing a logic change, and whose type is not `security` → FIX_SEPARATE in TRIAGE_RESULTS, Reason `needs a logic change`; every other unresolved issue stays Blocked
|
|
305
314
|
|
|
306
315
|
### Phase 5: Write resolution-summary.md
|
|
307
316
|
|
|
308
317
|
**Produces:** RESOLUTION_FILE (early write for compaction safety)
|
|
309
|
-
**Requires:** TRIAGE_RESULTS, CODE_AGENT_RESULTS, TARGET_DIR, TARGET_DIR_REL, BRANCH_INFO, RESOLUTION_TS
|
|
318
|
+
**Requires:** TRIAGE_RESULTS, CODE_AGENT_RESULTS, TARGET_DIR, TARGET_DIR_REL, BRANCH_INFO, RESOLUTION_TS, GATE_LEVEL
|
|
310
319
|
|
|
311
|
-
**Immediately write `resolution-summary.md`** to `{TARGET_DIR}` using the Write tool.
|
|
320
|
+
**Immediately write `resolution-summary.md`** to `{TARGET_DIR}` using the Write tool.
|
|
312
321
|
|
|
313
322
|
Set `Tracked` for FIX_SEPARATE and TECH_DEBT items to `(pending)` — to be backfilled after Phase 9 manage-debt (or `TRACEABILITY: DEGRADED ({reason})` if manage-debt degrades).
|
|
314
323
|
|
|
315
324
|
DUPLICATE issues are listed **only** in `## Duplicates` — never in `## Fixed Issues`, `## False Positives`, `## By Design`, `## Fix Separately`, `## Deferred to Tech Debt`, `## Escalations`, or `## Blocked`. A duplicate of a FALSE_POSITIVE primary therefore leaves only the primary in the `False Positive` row and the `## False Positives` section; the same holds for every other outcome the duplicate inherits.
|
|
316
325
|
|
|
317
|
-
|
|
326
|
+
Open each Issue cell with its severity in brackets when it has one, as `[HIGH]`.
|
|
327
|
+
|
|
328
|
+
Use the template from the Output Artifact section below. Put text not for public posting in a final `## Private notes` section.
|
|
318
329
|
|
|
319
330
|
### Phase 6: Polish
|
|
320
331
|
|
|
321
332
|
**Produces:** POLISH_RESULT
|
|
322
|
-
**Requires:** CODE_AGENT_RESULTS
|
|
333
|
+
**Requires:** CODE_AGENT_RESULTS, GATE_LEVEL
|
|
323
334
|
|
|
324
335
|
If any fixes were made, spawn Polish agent to refine the changed code:
|
|
325
336
|
|
|
@@ -380,7 +391,7 @@ git -C {worktree} push
|
|
|
380
391
|
|
|
381
392
|
**If `fork_no_push` is set:** do not push. Record `Push: skipped — cannot push to fork` under `## Verification`, and skip Phase 8 — no pushed commit exists for CI to check.
|
|
382
393
|
|
|
383
|
-
**Route after push:** VERIFICATION_STATUS = PASS → continue to Phase 8 (CI gate).
|
|
394
|
+
**Route after push:** VERIFICATION_STATUS = PASS → continue to Phase 8 (CI gate). FAILED or SKIPPED → skip Phase 8 and continue with Phase 9 and the later phases in order.
|
|
384
395
|
|
|
385
396
|
### Phase 8: CI Status Gate (Conditional)
|
|
386
397
|
|
|
@@ -550,7 +561,7 @@ If the script prints a `TRACEABILITY: DEGRADED` line: warn, proceed to Phase 10.
|
|
|
550
561
|
|
|
551
562
|
### Phase 10: Report
|
|
552
563
|
|
|
553
|
-
**Requires:** BRANCH_INFO, TARGET_DIR, PR_COMMENT, THREAD_RESOLUTION_RESULT
|
|
564
|
+
**Requires:** BRANCH_INFO, TARGET_DIR, PR_COMMENT, THREAD_RESOLUTION_RESULT, GATE_LEVEL
|
|
554
565
|
|
|
555
566
|
The resolution summary was already written to `{TARGET_DIR}/resolution-summary.md` in Phase 5 (updated by Phase 7, Phase 9 and Phase 9b-1). Display results to the user:
|
|
556
567
|
|
|
@@ -560,6 +571,7 @@ The resolution summary was already written to `{TARGET_DIR}/resolution-summary.m
|
|
|
560
571
|
**Branch**: {branch}
|
|
561
572
|
**Reviews Processed**: {n} reports from {TARGET_DIR}
|
|
562
573
|
**Total Issues**: {n}
|
|
574
|
+
**Gate level**: {GATE_LEVEL, with any level note}
|
|
563
575
|
|
|
564
576
|
### Results
|
|
565
577
|
| Outcome | Count |
|
|
@@ -605,14 +617,6 @@ In multi-worktree mode, report results per worktree with aggregate summary.
|
|
|
605
617
|
|
|
606
618
|
### Feature Knowledge Write-Back (Conditional)
|
|
607
619
|
|
|
608
|
-
Resolve `{worktree}` as the checkout's toplevel, because feature knowledge bases are committed with the branch (D-PROMPT-ROOT): from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`) — run
|
|
609
|
-
|
|
610
|
-
```bash
|
|
611
|
-
git -C "{start}" rev-parse --show-toplevel
|
|
612
|
-
```
|
|
613
|
-
|
|
614
|
-
and use its one-line output. If the command fails (outside a git repository), `{worktree}` is the start directory itself. All paths below are relative to `{worktree}`.
|
|
615
|
-
|
|
616
620
|
**Step 1 — Check the opt-out gate, with `{root}` = `{worktree}`:** take the settings line resolved above for that root, resolving it with the settings block when this run has not yet.
|
|
617
621
|
|
|
618
622
|
If the settings line says `KNOWLEDGE=off`, skip write-back entirely. The machine switch (`devflow knowledge --disable`), the repository and the personal settings can each turn knowledge off, and none can turn it back on (D-FEATURES-NARROW-ONLY). The fail-closed line says `KNOWLEDGE=off` too, so an unresolvable line skips write-back.
|
|
@@ -659,21 +663,18 @@ When the Knowledge agent reports `KB_COMMIT: skipped (detached HEAD)`, the files
|
|
|
659
663
|
/resolve (orchestrator - spawns agents only)
|
|
660
664
|
│
|
|
661
665
|
├─ Phase 0: Worktree Discovery & Pre-flight
|
|
662
|
-
├─ Phase 1: Parse issues from TARGET_DIR
|
|
666
|
+
├─ Phase 1: Parse issues from TARGET_DIR
|
|
663
667
|
├─ Phase 1b: Fetch external threads (evidence policy required)
|
|
664
668
|
├─ Phase 2: Global Triage [Triage agent, opus, single agent]
|
|
665
|
-
├─ Phase 3: Batch FIX_NOW issues
|
|
666
|
-
├─ Phase 4: Fix [Code agent × N
|
|
669
|
+
├─ Phase 3: Batch FIX_NOW issues
|
|
670
|
+
├─ Phase 4: Fix [Code agent × N]
|
|
667
671
|
├─ Phase 5: Write resolution-summary.md (compaction safety; Tracked = "(pending)" or "(pending — TRACEABILITY: DEGRADED)" if manage-debt degrades)
|
|
668
|
-
├─ Phase 6: Polish
|
|
672
|
+
├─ Phase 6: Polish
|
|
669
673
|
├─ Phase 7: Verification Gate [Validate agent, haiku] + push + Fix agent validation-fix loop ≤2
|
|
670
|
-
├─ Phase 8: CI Status Gate (conditional
|
|
674
|
+
├─ Phase 8: CI Status Gate (conditional)
|
|
671
675
|
├─ Phase 9: Git agent (manage-debt) — FIX_SEPARATE + TECH_DEBT → backfill Tracked={ISSUE_REF} (or TRACEABILITY: DEGRADED on failure)
|
|
672
676
|
│
|
|
673
|
-
├─ Phase 9b:
|
|
674
|
-
│ ├─ Step 9b-0: verify-evidence.cjs --stale-out → ≤1 Test agent on the stale TPs (wrapped) — only after this run's push
|
|
675
|
-
│ ├─ Step 9b-1: Git agent (resolve-review-threads) — evidence policy required
|
|
676
|
-
│ ├─ Step 9b-2: Git agent (post-resolution-summary, REVIEW_PUBLICATION) — always-on
|
|
677
|
+
├─ Phase 9b: 9b-0 Test agent (stale TPs), 9b-1/9b-2 Git agent (threads, resolution comment)
|
|
677
678
|
│ └─ Step 9b-3: verify-evidence.cjs publish (inline, no Git spawn) — only when the head moved
|
|
678
679
|
│
|
|
679
680
|
├─ Phase 9c: verify-evidence.cjs readiness (inline, no Git spawn) — non-author approval required, report-only
|
|
@@ -686,27 +687,23 @@ When the Knowledge agent reports `KB_COMMIT: skipped (detached HEAD)`, the files
|
|
|
686
687
|
| Case | Handling |
|
|
687
688
|
|------|----------|
|
|
688
689
|
| No reviews exist | Check bug-analysis fallback (Step 0c-5b); if also absent, error and suggest `/code-review` or `/bug-analysis` |
|
|
689
|
-
| All false positives | Normal completion, report shows 0 fixes |
|
|
690
690
|
| Fix attempt fails | Revert changes, mark BLOCKED, continue others |
|
|
691
691
|
| Issue dependencies | Sequential chain, skip dependents if predecessor blocked |
|
|
692
|
-
| No
|
|
693
|
-
| Latest review already resolved | Check bug-analysis fallback (Step 0c-5b); if also absent, skip worktree and suggest `/code-review` or `/bug-analysis` |
|
|
692
|
+
| No issues parsed | Report "No issues to resolve" |
|
|
694
693
|
| `--review {timestamp}` in multi-worktree mode | Not supported — use `--path` + `--review` to target specific worktree + review |
|
|
695
694
|
| gh/GitHub absent | manage-debt degrades (`TRACEABILITY: DEGRADED ({reason})`); Tracked stays `(pending — TRACEABILITY: DEGRADED ({reason}))` — recorded, not dropped |
|
|
696
695
|
| `EVIDENCE_POLICY` is `standard` | Phases 1b and 9b-step-1 are skipped; post-resolution-summary (Phase 9b step 2) still runs if a PR is known |
|
|
697
696
|
| `REQUIRE_NON_AUTHOR_APPROVAL` is `false` | Phase 9c is skipped and reported as SKIPPED |
|
|
698
|
-
| Public repo (`auto` mode) | Git agent probes visibility, posts counts-only STUB comment; full resolution report stays local |
|
|
699
697
|
| `reviewPublication: off` | Git agent skips posting the resolution comment (OFF) — except that, only when `EVIDENCE_POLICY` is `required`, Step 0d passes `stub` and a counts-only STUB comment posts |
|
|
700
|
-
| Fork PR this run cannot push to
|
|
698
|
+
| Fork PR this run cannot push to | `TRACEABILITY: DEGRADED (cannot push to fork)` → `fork_no_push`: no push in Phase 7, Phase 8 skipped, 9b-1 records FIXED threads as DEGRADED, 9b-2 still posts; the head did not move, so 9b-0 and 9b-3 are skipped |
|
|
701
699
|
| The PR has no trusted evidence record | 9b-0 finds no vouched-for stale line, so no Test agent runs; 9b-3 still refreshes the block and comment, every TP without a claim reading `UNVERIFIED` |
|
|
702
700
|
| A CI run behind a claim has expired (~90 days) | The TP reads `INDETERMINATE` — never verified, never failed — until a claim at a newer SHA settles it |
|
|
703
701
|
|
|
704
702
|
## Principles
|
|
705
703
|
|
|
706
704
|
1. **Orchestration only** - Command spawns agents, doesn't do git/resolve work itself
|
|
707
|
-
2. **
|
|
708
|
-
3. **
|
|
709
|
-
4. **Traceability-aware** - Policy-gated ops (thread fetch/resolve, merge readiness) are skipped cleanly when the evidence policy does not ask for them; resolution comment (Phase 9b-2) is always-on; test-plan evidence is re-verified (≤1 Test agent) and refreshed only when this run moved the head (Steps 9b-0, 9b-3)
|
|
705
|
+
2. **Git agent for git work** - All git operations go through Git agent; inline scripts are plumbing
|
|
706
|
+
3. **Traceability-aware** - Policy-gated ops are skipped cleanly when the evidence policy does not ask for them; resolution comment (Phase 9b-2) is always-on; test-plan evidence is re-verified (≤1 Test agent) and refreshed only when this run moved the head (Steps 9b-0, 9b-3)
|
|
710
707
|
|
|
711
708
|
## Output Artifact
|
|
712
709
|
|
|
@@ -719,6 +716,7 @@ Written in Phase 5 (Collect Results) to `{TARGET_DIR}/resolution-summary.md`:
|
|
|
719
716
|
**Date**: {RESOLUTION_TS}
|
|
720
717
|
**Review**: {TARGET_DIR_REL}
|
|
721
718
|
**Command**: /resolve
|
|
719
|
+
**Gate level**: {GATE_LEVEL, with any level note}
|
|
722
720
|
|
|
723
721
|
## Statistics
|
|
724
722
|
| Metric | Value |
|
|
@@ -24,13 +24,13 @@ Detect changed files and build context:
|
|
|
24
24
|
4. Build TASK_DESCRIPTION from recent commit messages or branch name
|
|
25
25
|
5. Record `HEAD_BEFORE` (`git rev-parse HEAD`) now, before Polish runs — Phase 3 compares against it
|
|
26
26
|
|
|
27
|
-
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root
|
|
27
|
+
**Resolve the settings line** once per worktree root, reusing a line this run already resolved for the same root. `{root}` is the worktree the values are for — the repository root in a one-worktree run:
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
30
|
node "$HOME/.devflow/scripts/resolve-settings.cjs" "{root}" 2>/dev/null; echo "exit=$?"
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off>
|
|
33
|
+
Accept the output only when it is exactly two lines: `exit=0` last and, before it, one line of the form `TRACKER=<github|jira|linear> TRACKER_SOURCE=<project|personal|machine|default> TRACKER_WARN=<none|mismatch|invalid> SITE=<none|https://<host>> KEY=<none|<key>> REVIEW_PUBLICATION=<off|auto|full> COMPLIANCE=<off|generic|<id>[,<id>…]> MEMORY=<on|off> CURATION=<on|off> KNOWLEDGE=<on|off> GATE_LEVEL=<full|standard|lean>` — these fields, in this order, nothing else, where `<host>` is a lowercase dotted host name alone, `<key>` is 2–10 of `A-Z`, `0-9` and `_` starting with a letter, and each `<id>` is one of `gdpr`, `hipaa`, `pci-dss`, `soc2`, `iso-27001`, `sox`. **Anything else** (a non-zero exit, no line, extra text, or a missing, reordered or unlisted field or value) ⇒ use `TRACKER=github TRACKER_SOURCE=default TRACKER_WARN=invalid SITE=none KEY=none REVIEW_PUBLICATION=off COMPLIANCE=generic MEMORY=off CURATION=off KNOWLEDGE=off GATE_LEVEL=full` instead.
|
|
34
34
|
|
|
35
35
|
The accepted line is the only source of these values.
|
|
36
36
|
|
|
@@ -175,14 +175,6 @@ Display summary:
|
|
|
175
175
|
|
|
176
176
|
### Feature Knowledge Write-Back (Conditional)
|
|
177
177
|
|
|
178
|
-
Resolve `{worktree}` as the checkout's toplevel, because feature knowledge bases are committed with the branch (D-PROMPT-ROOT): from the start directory — `WORKTREE_PATH` if provided, otherwise cwd (`devflow:worktree-support`) — run
|
|
179
|
-
|
|
180
|
-
```bash
|
|
181
|
-
git -C "{start}" rev-parse --show-toplevel
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
and use its one-line output. If the command fails (outside a git repository), `{worktree}` is the start directory itself. All paths below are relative to `{worktree}`.
|
|
185
|
-
|
|
186
178
|
**Step 1 — Check the opt-out gate, with `{root}` = `{worktree}`:** take the settings line resolved above for that root, resolving it with the settings block when this run has not yet.
|
|
187
179
|
|
|
188
180
|
If the settings line says `KNOWLEDGE=off`, skip write-back entirely. The machine switch (`devflow knowledge --disable`), the repository and the personal settings can each turn knowledge off, and none can turn it back on (D-FEATURES-NARROW-ONLY). The fail-closed line says `KNOWLEDGE=off` too, so an unresolvable line skips write-back.
|