yadflow 3.19.0-next.2 → 4.0.0-next.3
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 +371 -0
- package/README.md +160 -22
- package/bin/commands.mjs +46 -0
- package/bin/yad.mjs +506 -117
- package/cli/artifact-status.mjs +30 -11
- package/cli/capture.mjs +417 -0
- package/cli/checkpoint.mjs +47 -27
- package/cli/claims.mjs +165 -0
- package/cli/codeowners-command.mjs +170 -0
- package/cli/codeowners.mjs +397 -0
- package/cli/commit.mjs +13 -9
- package/cli/dial.mjs +183 -0
- package/cli/docs.mjs +88 -32
- package/cli/doctor.mjs +1682 -90
- package/cli/epic-state.mjs +3460 -211
- package/cli/epic.mjs +506 -0
- package/cli/errors.mjs +3 -0
- package/cli/fold.mjs +247 -0
- package/cli/gate-local.mjs +296 -0
- package/cli/gate.mjs +977 -183
- package/cli/history.mjs +556 -0
- package/cli/hook.mjs +264 -53
- package/cli/hubcommit.mjs +9 -19
- package/cli/index-command.mjs +87 -0
- package/cli/ledger.mjs +54 -4
- package/cli/lib.mjs +161 -9
- package/cli/manifest.mjs +376 -38
- package/cli/migrate.mjs +683 -52
- package/cli/mode.mjs +170 -0
- package/cli/next.mjs +365 -86
- package/cli/openpr.mjs +193 -34
- package/cli/owners.mjs +266 -0
- package/cli/people.mjs +657 -0
- package/cli/plan.mjs +466 -125
- package/cli/platform.mjs +109 -128
- package/cli/product-index.mjs +287 -0
- package/cli/protection.mjs +706 -0
- package/cli/reconcile.mjs +40 -12
- package/cli/repo-publish.mjs +24 -26
- package/cli/repo.mjs +23 -14
- package/cli/report.mjs +24 -14
- package/cli/review.mjs +19 -22
- package/cli/riskmap-command.mjs +289 -0
- package/cli/riskmap.mjs +373 -0
- package/cli/setup.mjs +127 -279
- package/cli/ship.mjs +6 -5
- package/cli/skill.mjs +180 -0
- package/cli/skip.mjs +211 -30
- package/cli/thread.mjs +41 -16
- package/cli/tidy.mjs +18 -18
- package/cli/update-commit.mjs +21 -21
- package/cli/usage.mjs +115 -109
- package/package.json +3 -3
- package/skills/sdlc/config.yaml +149 -70
- package/skills/sdlc/module-help.csv +24 -24
- package/skills/yad-analysis/SKILL.md +121 -59
- package/skills/yad-architecture/SKILL.md +30 -18
- package/skills/yad-architecture/references/contract-format.md +8 -5
- package/skills/yad-backfill/SKILL.md +10 -4
- package/skills/yad-backfill/references/backfill.md +8 -1
- package/skills/yad-backfill/templates/checks/backfill-check.sh +10 -2
- package/skills/yad-change/SKILL.md +119 -42
- package/skills/yad-change/references/triage.md +42 -27
- package/skills/yad-checks/SKILL.md +68 -35
- package/skills/yad-checks/references/check-gates.md +310 -85
- package/skills/yad-checks/templates/checks/commit-message.sh +17 -3
- package/skills/yad-checks/templates/checks/contract-check.sh +130 -9
- package/skills/yad-checks/templates/checks/epic-open.sh +2 -2
- package/skills/yad-checks/templates/checks/ledger-guard.sh +55 -8
- package/skills/yad-checks/templates/checks/lineage-check.sh +23 -9
- package/skills/yad-checks/templates/checks/reconcile-debt-check.sh +1 -1
- package/skills/yad-checks/templates/checks/risk-map-check.sh +438 -0
- package/skills/yad-checks/templates/checks/verified-commits.sh +20 -46
- package/skills/yad-checks/templates/github/yad-checks.yml +13 -2
- package/skills/yad-checks/templates/github/yad-hub-checks.yml +5 -5
- package/skills/yad-checks/templates/github/yad-update-guard.yml +7 -5
- package/skills/yad-checks/templates/github/yad-verified-commits.yml +4 -4
- package/skills/yad-checks/templates/gitlab/yad-checks.gitlab-ci.yml +10 -1
- package/skills/yad-checks/templates/gitlab/yad-hub-checks.gitlab-ci.yml +5 -5
- package/skills/yad-checks/templates/gitlab/yad-verified-commits.gitlab-ci.yml +3 -3
- package/skills/yad-checks/templates/hooks/ledger-guard-cursor.sh +91 -0
- package/skills/yad-checks/templates/hooks/ledger-guard.sh +37 -6
- package/skills/yad-checks/templates/hooks/yad-capture.sh +53 -0
- package/skills/yad-commit/SKILL.md +4 -4
- package/skills/yad-connect-design/SKILL.md +5 -5
- package/skills/yad-connect-design/references/design-context.md +1 -1
- package/skills/yad-connect-design/references/design-registry.md +2 -2
- package/skills/yad-connect-docs/SKILL.md +11 -11
- package/skills/yad-connect-docs/references/docs-registry.md +1 -1
- package/skills/yad-connect-learning/SKILL.md +5 -5
- package/skills/yad-connect-learning/references/learning-registry.md +2 -2
- package/skills/yad-connect-repos/SKILL.md +66 -45
- package/skills/yad-connect-repos/references/code-context.md +4 -4
- package/skills/yad-connect-repos/references/hub-config.md +47 -51
- package/skills/yad-connect-repos/references/repos-registry.md +8 -7
- package/skills/yad-connect-repos/references/risk-map.md +81 -0
- package/skills/yad-connect-testing/SKILL.md +5 -5
- package/skills/yad-connect-testing/references/testing-context.md +3 -4
- package/skills/yad-connect-testing/references/testing-registry.md +2 -2
- package/skills/yad-defects/SKILL.md +7 -7
- package/skills/yad-discovery/SKILL.md +131 -94
- package/skills/yad-discovery/references/discovery-schema.md +22 -6
- package/skills/yad-discovery/references/foundation-schema.md +374 -0
- package/skills/yad-docs/SKILL.md +13 -8
- package/skills/yad-docs/references/data-mapping.md +9 -7
- package/skills/yad-docs/templates/app/package-lock.json +3 -3
- package/skills/yad-docs-overview/SKILL.md +30 -15
- package/skills/yad-docs-overview/references/pipeline-model.md +33 -20
- package/skills/yad-docs-sync/SKILL.md +10 -5
- package/skills/yad-docs-sync/references/staleness.md +8 -7
- package/skills/yad-engineer-review/SKILL.md +81 -17
- package/skills/yad-engineer-review/references/ship-and-record.md +17 -8
- package/skills/yad-epic/SKILL.md +173 -92
- package/skills/yad-epic/references/state-schema.md +610 -94
- package/skills/yad-hub-bridge/SKILL.md +57 -38
- package/skills/yad-hub-bridge/references/bridge.md +94 -67
- package/skills/yad-hub-bridge/references/login-roster.md +163 -70
- package/skills/yad-hub-bridge/templates/checks/hub-route.sh +22 -19
- package/skills/yad-hub-bridge/templates/github/yad-gate-sync.yml +34 -14
- package/skills/yad-hub-bridge/templates/gitlab/gitlab-ci.include-root.yml +2 -2
- package/skills/yad-hub-bridge/templates/gitlab/yad-gate-sync.gitlab-ci.yml +21 -11
- package/skills/yad-implement/SKILL.md +27 -13
- package/skills/yad-implement/references/implement-conventions.md +2 -2
- package/skills/yad-learn/SKILL.md +9 -9
- package/skills/yad-learn/references/learning-state.md +2 -2
- package/skills/yad-open-pr/SKILL.md +61 -26
- package/skills/yad-pair-review/SKILL.md +7 -5
- package/skills/yad-pair-review/references/session-state.md +1 -1
- package/skills/yad-pr-template/SKILL.md +47 -26
- package/skills/yad-pr-template/references/risk-routing.md +97 -24
- package/skills/yad-pr-template/templates/checks/pr-template.sh +34 -11
- package/skills/yad-pr-template/templates/checks/pr-title.sh +32 -9
- package/skills/yad-pr-template/templates/checks/risk-route.sh +107 -14
- package/skills/yad-pr-template/templates/github/pull_request_template.md +7 -5
- package/skills/yad-pr-template/templates/gitlab/merge_request_templates/Default.md +7 -5
- package/skills/yad-pr-template/templates/hub/github/pull_request_template.md +14 -13
- package/skills/yad-pr-template/templates/hub/gitlab/merge_request_templates/Default.md +14 -12
- package/skills/yad-reconcile/SKILL.md +3 -3
- package/skills/yad-report/SKILL.md +5 -5
- package/skills/yad-review-companion/SKILL.md +6 -3
- package/skills/yad-review-gate/SKILL.md +203 -93
- package/skills/yad-review-gate/references/gating.md +232 -54
- package/skills/yad-run/SKILL.md +81 -51
- package/skills/yad-run/references/run-loop.md +61 -39
- package/skills/yad-ship/SKILL.md +15 -11
- package/skills/yad-spec/SKILL.md +21 -6
- package/skills/yad-spec/references/spec-handoff.md +17 -5
- package/skills/yad-status/SKILL.md +115 -50
- package/skills/yad-stories/SKILL.md +37 -21
- package/skills/yad-stories/references/story-schema.md +7 -6
- package/skills/yad-stub/SKILL.md +58 -47
- package/skills/yad-sync-repos/SKILL.md +2 -2
- package/skills/yad-test-cases/SKILL.md +32 -23
- package/skills/yad-test-cases/references/test-cases-schema.md +7 -4
- package/skills/yad-timeline/SKILL.md +8 -7
- package/skills/yad-ui/SKILL.md +41 -18
- package/cli/roster.mjs +0 -164
- package/skills/sdlc/install.sh +0 -68
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yadflow",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Yadflow — the gated, team, multi-repo SDLC: author → review → build with a PR-driven review gate and a zero-dependency `yad` CLI (setup, gate, commit, open-pr, ship, repo, thread, reconcile).
|
|
3
|
+
"version": "4.0.0-next.3",
|
|
4
|
+
"description": "Yadflow — the gated, team, multi-repo SDLC: author → review → build with a PR-driven review gate and a zero-dependency `yad` CLI (setup, gate, commit, open-pr, ship, repo, thread, reconcile). Plus 38 yad-* skills.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "AbdelRahman Nasr",
|
|
7
7
|
"license": "MIT",
|
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
},
|
|
50
50
|
"keywords": [
|
|
51
51
|
"sdlc",
|
|
52
|
+
"adlc",
|
|
52
53
|
"yad",
|
|
53
54
|
"yadflow",
|
|
54
|
-
"bmad",
|
|
55
55
|
"workflow",
|
|
56
56
|
"cli",
|
|
57
57
|
"spec-driven-development",
|
package/skills/sdlc/config.yaml
CHANGED
|
@@ -1,21 +1,31 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
module_title: "SDLC Workflow"
|
|
7
|
-
methodology: gated-team-multirepo-sdlc
|
|
1
|
+
# yadflow configuration
|
|
2
|
+
# The source is skills/sdlc/config.yaml in the yadflow package. `yad setup` and `yad update` copy it into
|
|
3
|
+
# each project as .sdlc/config.yaml, and the skills read that copy. You may edit the copy: `yad update`
|
|
4
|
+
# records the hash it wrote in .sdlc/managed.json, reports an edited copy as `modified` and keeps it.
|
|
5
|
+
# `yad update --overwrite-local` replaces an edited copy, after saving it beside the file as .yad-orig.
|
|
8
6
|
|
|
9
7
|
# Where epic "thinking" artifacts and per-epic state live (the product repo).
|
|
10
8
|
product_root: "{project-root}"
|
|
11
9
|
epics_folder: "{project-root}/epics"
|
|
12
10
|
|
|
13
|
-
#
|
|
14
|
-
# brownfield).
|
|
15
|
-
# PR/MR bridge
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
11
|
+
# The Foundation (E75) — the Product level, run once per product before any feature epic (greenfield AND
|
|
12
|
+
# brownfield). Its own folder, `foundation/`, under the fixed id `EP-foundation`: the id keeps the `EP-`
|
|
13
|
+
# prefix so the review gate, the PR/MR bridge, CI sync and `yad next` all operate on it unchanged.
|
|
14
|
+
# `yad foundation new` seeds the ledger; `yad-discovery` authors the sections. A 2-step author→review
|
|
15
|
+
# chain whose review binds to the required sections; on approval it terminates at `foundation-done` (no
|
|
16
|
+
# Build). Its approval is REPORTED, not enforced, before feature work begins. roadmap.md is the menu of
|
|
17
|
+
# features each epic reads (yad-epic / yad-analysis Step 2c) — reference-only, never auto-seeds epics.
|
|
18
|
+
foundation:
|
|
19
|
+
epic_id: "EP-foundation" # reserved id; yad-epic/yad-analysis never pick it
|
|
20
|
+
location: "{project-root}/foundation/" # the sections + .sdlc/ ledger + reviews/ live here
|
|
21
|
+
optional: true # a team that knows what to build starts at yad-epic
|
|
22
|
+
modes: [greenfield, brownfield] # stack.md / repos.md are code-aware in brownfield
|
|
23
|
+
sections: [purpose.md, scope.md, mvp.md, roadmap.md, stack.md, repos.md]
|
|
24
|
+
optional_sections: [market.md, risks.md]
|
|
25
|
+
|
|
26
|
+
# The OLD spelling of the Product level — the "epic zero" every release before E75 wrote. Still READ for
|
|
27
|
+
# this whole major. `yad migrate --apply` converts it into `foundation/` on a local ledger; a verified
|
|
28
|
+
# ledger keeps it (CI owns that ledger). A product has ONE product level: never both.
|
|
19
29
|
discovery:
|
|
20
30
|
epic_id: "EP-discovery" # reserved id; yad-epic/yad-analysis never pick it
|
|
21
31
|
location: "{project-root}/epics/EP-discovery/" # discovery artifacts + ledger live here
|
|
@@ -23,43 +33,101 @@ discovery:
|
|
|
23
33
|
modes: [greenfield, brownfield] # current-state is code-aware in brownfield; competitor study in both
|
|
24
34
|
artifacts: [market-research.md, competitor-analysis.md, current-state.md, feasibility.md, requirements.md, roadmap.md]
|
|
25
35
|
|
|
26
|
-
#
|
|
27
|
-
project_name: yadflow
|
|
36
|
+
# The language the skills speak in, and the language they write documents in.
|
|
28
37
|
communication_language: English
|
|
29
38
|
document_output_language: English
|
|
30
|
-
output_folder: "{project-root}/_bmad-output"
|
|
31
39
|
|
|
32
40
|
# Default dials applied to every new step (build plan §2).
|
|
41
|
+
# The lifecycle, top down: three PARTS, six PHASES inside them, and the steps inside those.
|
|
42
|
+
#
|
|
43
|
+
# A phase is DERIVED from a step's id and is never written into `state.json` — there is nothing to
|
|
44
|
+
# author here, nothing to keep in step, and no way for it to disagree with the step it describes.
|
|
45
|
+
# `stepPhase` in cli/epic-state.mjs is the one definition; this block is the same table in the file
|
|
46
|
+
# people read. A review gate takes the phase of the artifact it reviews, so `epic-review` is Discover.
|
|
47
|
+
#
|
|
48
|
+
# Release and Operate are NAMED and not built. No step, skill or gate exists for either yet.
|
|
49
|
+
#
|
|
50
|
+
# NOTE the word: "phase" here means one of these six. It does NOT mean the numbered development
|
|
51
|
+
# phases of yadflow itself (docs/phase-N-build-plan.md), which is what "Phase 4a/4b" means elsewhere
|
|
52
|
+
# in these files, nor a gate's internal merge phase.
|
|
53
|
+
# The step CATALOGUE lives in code — `STEPS` in `cli/epic-state.mjs` (E4). It is the one place that
|
|
54
|
+
# says what a step is: its phase, whether it authors or gates, what artifact it writes, which skill
|
|
55
|
+
# runs it, and which step a gate reviews. The phase rows below mirror the `steps:` half of it and a
|
|
56
|
+
# test holds the two together row for row; everything else about a step is read from the code, not
|
|
57
|
+
# from here. `yad doctor` reports a project chain that disagrees with the catalogue and rewrites
|
|
58
|
+
# nothing — for this whole major the FILE wins (rule 3), because the five authoring skills still
|
|
59
|
+
# hand-write their `state.json` seed. E5 makes a profile seed the chain from the catalogue instead.
|
|
60
|
+
lifecycle:
|
|
61
|
+
parts: [Shape, Build, Run]
|
|
62
|
+
# Lifecycle PROFILES (E5) — the route an epic takes through the steps, defined in code as
|
|
63
|
+
# `LIFECYCLE_PROFILES` (`cli/epic-state.mjs`). Three were routes the skills already seeded by hand:
|
|
64
|
+
# `classic` (the 10-step chain, `epic` first — yad-epic / yad-stub / yad-change), `analysis-first`
|
|
65
|
+
# (the 12-step chain, `analysis` before `epic` — yad-analysis) and `discovery` (the product
|
|
66
|
+
# front-zero — yad-discovery, now the OLD spelling of the Product level). `foundation` is that level
|
|
67
|
+
# as E75 writes it — `yad foundation new`. Two are the short lanes E40 added, which nobody seeded before:
|
|
68
|
+
# `chore` (4 steps, `epic` then `stories`) and `spike` (6, the analysis in front of the chore lane).
|
|
69
|
+
# Neither short lane carries an architecture gate, so neither has a contract of its own, and neither
|
|
70
|
+
# marks any step optional. Each epic RECORDS its route as `profile` in `state.json`
|
|
71
|
+
# (file shape 6); `yad epic new` writes it when it seeds the chain, and for an epic that predates the
|
|
72
|
+
# field `yad migrate` fills it in by matching the chain. The chain stays the truth — `yad doctor`
|
|
73
|
+
# compares the two. NOT the `hub.json` `profile`, which is the unrelated setup record
|
|
74
|
+
# { codebase, repo_layout, team_size }.
|
|
75
|
+
profiles: [classic, analysis-first, chore, spike, discovery, foundation]
|
|
76
|
+
# The PRODUCT level's phase (E75) — a ladder of its own, run once per product before any epic, and
|
|
77
|
+
# part of no Part. `discovery` is listed because it is the old spelling of the same level.
|
|
78
|
+
product_phases:
|
|
79
|
+
- { id: foundation, name: Foundation, level: product, built: true, steps: [foundation, discovery] }
|
|
80
|
+
phases:
|
|
81
|
+
- { id: discover, name: Discover, part: Shape, built: true, steps: [analysis, epic] }
|
|
82
|
+
- { id: design, name: Design, part: Shape, built: true, steps: [architecture, ui-design] }
|
|
83
|
+
- { id: plan, name: Plan, part: Shape, built: true, steps: [stories, test-cases] }
|
|
84
|
+
- { id: build, name: Build, part: Build, built: true, steps: [spec, tasks, implement, checks, engineer-review] }
|
|
85
|
+
- { id: release, name: Release, part: Run, built: false, steps: [] } # E32 builds it
|
|
86
|
+
- { id: operate, name: Operate, part: Run, built: false, steps: [] } # E33 builds it
|
|
87
|
+
# `currentStep` markers that are NOT steps: they never appear in `steps[]` and have no phase.
|
|
88
|
+
sentinels: [ready-for-build, backfill-pending, backfill-done, discovery-done, foundation-done]
|
|
89
|
+
|
|
33
90
|
defaults:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
#
|
|
91
|
+
# The two dials: who does the work, and who moves it forward. Renamed in shape 4; BOTH names are
|
|
92
|
+
# written on every step and the OLD one is still the one read, so an older CLI and the skills that
|
|
93
|
+
# hand-write state.json keep working. See docs/migrations/shape-4.md.
|
|
94
|
+
assistance: review # none | review | heavy (old name — still authoritative)
|
|
95
|
+
driver: pair # human | pair | agent (new name, shape 4)
|
|
96
|
+
automation: human_approve # human_approve | machine_advance (old name — still authoritative)
|
|
97
|
+
advance: human # human | auto (new name, shape 4)
|
|
98
|
+
# Shape steps (foundation [optional, the Product level — discovery is its old spelling], analysis [optional], epic, architecture,
|
|
37
99
|
# ui-design [optional — skippable N/A for UI-less epics via `yad skip <epic> ui-design --reason "<why>"`],
|
|
38
|
-
# stories, test-cases) are locked to
|
|
100
|
+
# stories, test-cases) are locked to `advance: human` and may NOT be set to `advance: auto` in this
|
|
39
101
|
# version (build plan §1, §8.7).
|
|
40
102
|
shape_steps_locked: true
|
|
41
103
|
# Each Shape authoring step opens its own branch at the start of the step (the <step> is the step id:
|
|
42
104
|
# discovery | analysis | epic | architecture | ui-design | stories | test-cases). Git/greenfield-safe; distinct
|
|
43
|
-
# from the verified ledger's review branch (
|
|
105
|
+
# from the verified ledger's review branch (product.artifact_branch). See yad-epic/references/state-schema.md.
|
|
44
106
|
shape_authoring_branch: "<step>/EP-<slug>"
|
|
45
107
|
|
|
46
108
|
# Team review gate defaults (build plan §3 piece 2, §4).
|
|
47
109
|
review_gate:
|
|
48
|
-
default_reviewers
|
|
110
|
+
# `default_reviewers` is no longer read since E62 (the owner + reviewer role rule is gone). A team gate
|
|
111
|
+
# needs 1 approval from someone other than the author (base 1); the full count adds the risk step
|
|
112
|
+
# below, which is advisory. E72 caps that count at the active people less one and reports it;
|
|
113
|
+
# only the base holds a gate.
|
|
114
|
+
default_reviewers: 1 # legacy, not read since E62
|
|
49
115
|
# Solo mode (a lone developer): a relaxed, opt-in safety guarantee, recorded per-project in
|
|
50
116
|
# .sdlc/hub.json (`solo: true`). On GitHub you CANNOT approve your own PR, so requiring an approval
|
|
51
117
|
# would deadlock a solo user. Solo waives the APPROVAL requirement only — the review PR/MR and its
|
|
52
118
|
# MERGE stay (CI still runs on the PR, and the merge is what advances the step). Net: the gate passes
|
|
53
119
|
# on `merged + all comment threads resolved`, no approval needed. NOT a default; team gates are
|
|
54
120
|
# unchanged. (Branch protection must not "require approvals", or the solo dev's own merge is blocked —
|
|
55
|
-
# `yad doctor` warns when it does.)
|
|
121
|
+
# `yad doctor` warns when it does.) Switch it with `yad mode solo --reason "<why>"` / `yad mode team` (E10),
|
|
122
|
+
# which records who, when and why, and writes `mode: solo|team` beside `solo`; a gate that passes in solo
|
|
123
|
+
# mode records `waived: "solo"` on its closing record.
|
|
56
124
|
solo: false
|
|
57
|
-
escalate_when: [contract, auth, payments] #
|
|
58
|
-
# PR-driven automation (the `yad gate` CLI). With a
|
|
125
|
+
escalate_when: [contract, auth, payments] # risk tags that add a risk step (contract +2, auth/payments +1; the largest, never the sum)
|
|
126
|
+
# PR-driven automation (the `yad gate` CLI). With a Product platform, the review rides the per-step
|
|
59
127
|
# PR/MR: `yad gate sync` maps platform reviews/threads into the file ledger and the step
|
|
60
|
-
# AUTO-ADVANCES on merge, once (a) the
|
|
128
|
+
# AUTO-ADVANCES on merge, once (a) the approval rule is met, (b) every comment thread is resolved,
|
|
61
129
|
# and (c) the review PR/MR is merged. The merge is the human approval act, so Shape steps still never
|
|
62
|
-
#
|
|
130
|
+
# `advance: auto`. The file ledger stays the source of truth; no platform / no gh|glab => local.
|
|
63
131
|
advance_on: merge # merge of the approved, fully-resolved review PR advances the step
|
|
64
132
|
revoke_on: artifact-change # re-hash the artifact (contract surface for architecture); a changed
|
|
65
133
|
# hash drops the bound approvals so reviewers re-approve. NOT per-commit.
|
|
@@ -122,10 +190,10 @@ build:
|
|
|
122
190
|
# Shape artifacts can never go stale), and reconcile-debt (a hotfix's ship-first debt blocks the next
|
|
123
191
|
# change on its thread until paid). See the `change:` block below.
|
|
124
192
|
gates: [spec-link, contract-check, build-test-lint, lineage-check, epic-open, reconcile-debt]
|
|
125
|
-
# Pattern gates — commit subject + PR/MR title + PR/MR template-usage. Profile-aware (code|hub): code
|
|
126
|
-
# repos validate the Conventional-Commits / task-PR conventions; the
|
|
127
|
-
# artifact-review conventions (review/EP-<slug>/<artifact>, the
|
|
128
|
-
# the separate security gate (signature
|
|
193
|
+
# Pattern gates — commit subject + PR/MR title + PR/MR template-usage. Profile-aware (code|hub|product): code
|
|
194
|
+
# repos validate the Conventional-Commits / task-PR conventions; the Product validates its
|
|
195
|
+
# artifact-review conventions (review/EP-<slug>/<artifact>, the Product PR template). verified-commits is
|
|
196
|
+
# the separate security gate (a platform-Verified signature only; no author allowlist since E62). All blocking in CI; both repos + Product.
|
|
129
197
|
pattern_gates: [commit-message, pr-title, pr-template]
|
|
130
198
|
ci_platforms: [github, gitlab] # both wired from skills/yad-checks/templates/; GitHub is this product repo's platform
|
|
131
199
|
contract_surface_glob: "specs/*/contracts/**" # the repo's quoted contract slice; a diff here needs Contract-Change + a re-locked contract
|
|
@@ -133,10 +201,10 @@ build:
|
|
|
133
201
|
pr_templates:
|
|
134
202
|
github: ".github/pull_request_template.md"
|
|
135
203
|
gitlab: ".gitlab/merge_request_templates/Default.md"
|
|
136
|
-
hub: # Shape artifact-review PR/MR on the
|
|
204
|
+
hub: # Shape artifact-review PR/MR on the Product (yad-pr-template repo:hub)
|
|
137
205
|
github: ".github/pull_request_template.md"
|
|
138
206
|
gitlab: ".gitlab/merge_request_templates/Default.md"
|
|
139
|
-
risk_levels: [low, medium, high] # high
|
|
207
|
+
risk_levels: [low, medium, high] # high +1 / a contract surface +2 to the approver count (advisory; yad-review-gate count)
|
|
140
208
|
# Step E (yad-engineer-review) — AI review (advisory) + engineer review (the human gate) + merge.
|
|
141
209
|
ai_review: coderabbit # advisory first pass; never the authority (.coderabbit.yaml)
|
|
142
210
|
# Append-only ship ledger (Build analogue of approvals.json), stored shard-then-fold: writers add one
|
|
@@ -155,15 +223,15 @@ build:
|
|
|
155
223
|
promote: yad-stub # `yad-backfill promote EP-<slug>` flips a brownfield stub epic (change.stub) to a real, verified feature epic once its spec is approved
|
|
156
224
|
|
|
157
225
|
# Code context (yad-connect-repos) — the front/"brain" phases are made code-aware. Code repos are
|
|
158
|
-
# connected to the
|
|
226
|
+
# connected to the Product once (or any time a new repo is added), and an AI-readable picture of
|
|
159
227
|
# each is cached so epic/architecture/ui/stories consider what already exists in the code. The product
|
|
160
|
-
# repo is the Shape phase TOOLCHAIN
|
|
228
|
+
# repo is the Shape phase TOOLCHAIN: repomix (and Impeccable) are installed/run here and target the
|
|
161
229
|
# connected code repos by path — code repos need no install for this. (The Build CI gates are the
|
|
162
230
|
# exception: they live INSIDE each code repo and run in that repo's CI — see build.gates above.)
|
|
163
231
|
code_context:
|
|
164
232
|
registry: "{project-root}/.sdlc/repos.json" # project-wide repo registry (NOT per-epic)
|
|
165
233
|
cache_dir: "{project-root}/.sdlc/code-context" # per-repo pack.md + code-map.md live here
|
|
166
|
-
tools: [repomix, impeccable] # Shape phase toolchain, installed in the
|
|
234
|
+
tools: [repomix, impeccable] # Shape phase toolchain, installed in the Product
|
|
167
235
|
pack_flags: "--compress --include-logs --style markdown" # reuse backfill flags; Secretlint by default
|
|
168
236
|
staleness: head-sha # stale when a repo's HEAD != registry syncedHead
|
|
169
237
|
refresh: human # a stale repo is a HUMAN decision: Shape phase
|
|
@@ -251,42 +319,38 @@ docs:
|
|
|
251
319
|
# tokens — publishing runs as the LOCAL user's own gh/glab or the platform CI. Idempotent, refreshable.
|
|
252
320
|
auth: user
|
|
253
321
|
|
|
254
|
-
#
|
|
255
|
-
# The
|
|
256
|
-
# comment/approval cycle runs through a real PR/MR on the
|
|
322
|
+
# Product platform + Shape review bridge (yad-connect-repos `detect-hub`; yad-review-gate + yad-hub-bridge).
|
|
323
|
+
# The Product is itself a git repo on a platform. With a verified ledger, the Shape review/
|
|
324
|
+
# comment/approval cycle runs through a real PR/MR on the Product: a review PR is opened per artifact, reviewers
|
|
257
325
|
# approve/comment on the platform (their own gh/glab auth — NO stored tokens), and `yad-review-gate action: sync`
|
|
258
326
|
# pulls that state into the file ledger (approvals.json/reviews/*.md) and runs the UNCHANGED gate predicate.
|
|
259
327
|
# The file ledger stays the source of truth. Degrades to the local gate when there is no platform / no CLI.
|
|
260
|
-
hub
|
|
261
|
-
|
|
262
|
-
|
|
328
|
+
# Renamed from `hub:` (shape 3). Nothing in the engine parses this file — the skills read it — so
|
|
329
|
+
# there is no compatibility shim here: an older project simply still says `hub:`, and the skills name
|
|
330
|
+
# both. The paths below carry both names too, for the same reason the files do.
|
|
331
|
+
product:
|
|
332
|
+
config: "{project-root}/.sdlc/product.json" # product platform (committed, like repos.json); no roster since E62
|
|
333
|
+
config_legacy: "{project-root}/.sdlc/hub.json" # the older name, still written and still the one READ this major
|
|
334
|
+
pr_ledger: "{project-root}/epics/EP-<slug>/.sdlc/product-prs.json" # per-step review-PR record (sibling of approvals.json)
|
|
335
|
+
pr_ledger_legacy: "{project-root}/epics/EP-<slug>/.sdlc/hub-prs.json" # the older name — written alongside it AND still the one read, like config_legacy
|
|
263
336
|
bridge: true # master enable; false => local Shape gates everywhere
|
|
264
|
-
platforms: [github, gitlab] # detected from the
|
|
337
|
+
platforms: [github, gitlab] # detected from the Product's own `git remote get-url origin`
|
|
265
338
|
artifact_branch: "review/EP-<slug>/<artifact-base>" # branch a review PR is opened on, per artifact
|
|
266
|
-
# roster
|
|
267
|
-
#
|
|
339
|
+
# No roster since E62: yadflow stores no people. Approvals record the platform login as `approver`. A
|
|
340
|
+
# `roster` in hub.json or `domain_owner(s)` in repos.json left by an older release decides nothing (the
|
|
341
|
+
# roster's name -> login pairs only let the first sync recognise older approvals).
|
|
268
342
|
|
|
269
|
-
# Phase 4 (automation) — the SECOND dial made real
|
|
270
|
-
#
|
|
271
|
-
#
|
|
272
|
-
# never
|
|
343
|
+
# Phase 4 (automation) — the SECOND dial made real: the orchestrator (yad-run) reads it and acts. Since
|
|
344
|
+
# E34 the dial is SET, not earned. `yad dial` sets it — a Build lane step's dial in build-state, a Shape
|
|
345
|
+
# author step's for the whole project in `.sdlc/automation.json` — and shows the step's run record as
|
|
346
|
+
# advice, never as a refusal. A review gate is never auto (rule 1).
|
|
347
|
+
# The KILL SWITCH is not in this file any more: `yad kill --reason "<why>"` / `yad unkill` record it in
|
|
348
|
+
# `.sdlc/automation.json`. This file is installed and hash-managed by `yad update`, so a value edited here
|
|
349
|
+
# stops the file being updated — and nothing reads `kill_switch` now. `yad doctor` fails on one left `true`.
|
|
273
350
|
automation:
|
|
274
351
|
# The only steps that MAY be automated, safest-end first (phase-4-build-plan.md build order).
|
|
275
|
-
# Phase 4a ships the engine + earns `checks` (Step B). `tasks`/`implement` advance are Phase 4b.
|
|
276
352
|
back_steps: [spec, tasks, implement, checks]
|
|
277
|
-
default: human_approve #
|
|
278
|
-
# A Build step is a CANDIDATE for machine_advance only once its trust-log slice clears this bar.
|
|
279
|
-
# "It seems fine" is not evidence (phase-4-build-plan.md §"Explicitly NOT").
|
|
280
|
-
trust_threshold:
|
|
281
|
-
min_runs: 5 # at least this many recorded runs at the step
|
|
282
|
-
min_approved_unchanged: 0.8 # >= this fraction "approved-unchanged" over those runs
|
|
283
|
-
# Hard lock — the dial-setter REFUSES machine_advance for these, regardless of trust evidence.
|
|
284
|
-
# The Shape authoring steps (already locked:true in state.json; analysis is optional) + the human
|
|
285
|
-
# merge gate.
|
|
286
|
-
locked_steps: [discovery, analysis, epic, architecture, ui-design, stories, test-cases, engineer-review]
|
|
287
|
-
# Kill switch (phase-4-build-plan.md §Safety): true => every step forced to human_approve
|
|
288
|
-
# system-wide, no per-step edits. One line, instantly reversible. Toggle via `yad-run action: kill`.
|
|
289
|
-
kill_switch: false
|
|
353
|
+
default: human_approve # = `advance: human`. Every lane step starts manual; `yad dial` turns one to auto
|
|
290
354
|
|
|
291
355
|
# Phase 6 (post-lock change management) — FEATURE THREADS. After the contract locks and code ships, a
|
|
292
356
|
# change must not MUTATE a locked artifact (that destroys the audit trail and the lock). Instead every
|
|
@@ -297,18 +361,31 @@ automation:
|
|
|
297
361
|
# docs/phase-6-build-plan.md and skills/yad-change. yad-defects/yad-timeline render it; yad-reconcile
|
|
298
362
|
# (read-only, like yad-docs-sync) flags orphan/drift; the three gates above enforce it.
|
|
299
363
|
change:
|
|
300
|
-
# The
|
|
301
|
-
|
|
364
|
+
# The work-item TYPE (epic.md frontmatter). Two names carry it: `kind:` is the original and is still
|
|
365
|
+
# the one that is READ; `type:` is the same value under the name from shape 5 on. Write both.
|
|
366
|
+
# `feature` and `chore` are the genesis types — they may stand alone with no `parent:`.
|
|
367
|
+
kinds: [feature, change, defect, hotfix, chore]
|
|
368
|
+
types: [feature, change, defect, hotfix, chore] # the same list under the newer name
|
|
369
|
+
genesis_types: [feature, chore] # may have no `parent:` (cli isGenesisType)
|
|
370
|
+
# GROUPING. `theme:` on epic.md is a FREE tag — one word or short phrase shared by every epic that
|
|
371
|
+
# belongs together. It is what stands in for a rung above the Epic: the ladder is
|
|
372
|
+
# Product -> Epic -> Story -> Task, and grouping is a label rather than a level. There is no list of
|
|
373
|
+
# allowed themes and nothing to register, it is optional, and it is ONE tag (`theme: [a, b]` reads
|
|
374
|
+
# as no theme at all). It lives only in epic.md — no copy in state.json, so no file shape changed.
|
|
375
|
+
# Any language. `yad doctor` reports one theme spelled two ways (theme:variants), because two
|
|
376
|
+
# spellings group as two, and a `#` inside the value (theme:commented), because these frontmatter
|
|
377
|
+
# readers keep the whole rest of the line and the printed `#…` is only decoration.
|
|
378
|
+
grouping_frontmatter: [theme]
|
|
302
379
|
# Triage DEPTH (yad-change auto-proposes, human confirms) -> which Shape steps are re-authored vs
|
|
303
380
|
# inherited. defect-fix re-authors stories+test-cases only; contract-surface re-authors architecture
|
|
304
|
-
# and RE-LOCKS (a new hash
|
|
381
|
+
# and RE-LOCKS (a new hash sends architecture-review back through review, with the contract risk step, as today).
|
|
305
382
|
depths: [defect-fix, behavioral-no-surface, contract-surface, new-capability]
|
|
306
383
|
thread_id: genesis_epic_id # the thread id = the genesis epic's id (never renamed -> stablest anchor)
|
|
307
384
|
# Lineage frontmatter added to epic.md (mirrors the design:/testing: enrichment blocks — the locked
|
|
308
385
|
# state.json step shape is untouched). `thread` is a DERIVED cache (authoritative = walk `parent` to
|
|
309
386
|
# the root); a mismatch is detectable corruption (yad doctor threadChecks). defect/hotfix also carry
|
|
310
387
|
# origin/severity/escape_stage/root_cause for the quality report (yad-defects).
|
|
311
|
-
lineage_frontmatter: [kind, thread, parent, inherits, supersedes, origin, severity, escape_stage, root_cause]
|
|
388
|
+
lineage_frontmatter: [kind, type, thread, parent, inherits, supersedes, origin, severity, escape_stage, root_cause]
|
|
312
389
|
artifact_bases: [epic, architecture, contract, ui-design, stories, test-cases] # what `inherits` may list
|
|
313
390
|
severity: [sev1, sev2, sev3, sev4] # defect/hotfix severity
|
|
314
391
|
# Per-change-epic ledgers (siblings of approvals.json; the locked state.json shape is untouched).
|
|
@@ -326,14 +403,16 @@ change:
|
|
|
326
403
|
seal_on: all-stories-shipped
|
|
327
404
|
# Brownfield stub anchor (yad-stub): an already-built feature with NO epic can't be a change parent
|
|
328
405
|
# (yad-change requires a real parent; lineage-check rejects a missing one). yad-stub mints the smallest
|
|
329
|
-
# real thread anchor — a genesis epic.md (kind:feature, thread:self) marked `stub:
|
|
330
|
-
# `verified: false`, with a state.json carrying `kind: stub`
|
|
406
|
+
# real thread anchor — a genesis epic.md (kind+type: feature, thread:self) marked `stub:
|
|
407
|
+
# backfill-pending` / `verified: false`, with a state.json carrying the lifecycle marker `kind: stub`
|
|
408
|
+
# BESIDE the work-item `type: feature` + `currentStep: backfill-pending`. A change
|
|
331
409
|
# threaded off a stub inherits only what exists (boundHash: null for the undocumented surface bases) and
|
|
332
410
|
# writes NO pointer-lock; change.json records `parentStub: true`. `yad-backfill promote` flips the stub
|
|
333
411
|
# to verified (clears the marker), at which point contract protection begins for the thread.
|
|
334
412
|
stub:
|
|
335
413
|
marker: backfill-pending # epic.md `stub:` value while the anchor is un-promoted
|
|
336
|
-
state_kind: stub # state.json top-level `kind` + `currentStep: backfill-pending` sentinel
|
|
414
|
+
state_kind: stub # state.json top-level `kind` + `currentStep: backfill-pending` sentinel.
|
|
415
|
+
# A LIFECYCLE marker, not the work-item type — a stub carries both.
|
|
337
416
|
allow_stub_parent: true # a change/defect MAY thread off an un-promoted stub (default on)
|
|
338
417
|
promote_by: yad-backfill # `yad-backfill promote EP-<slug>` documents + flips the stub to real
|
|
339
418
|
hotfix:
|
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs
|
|
2
|
-
SDLC Workflow,yad-discovery,
|
|
2
|
+
SDLC Workflow,yad-discovery,Foundation,DI,"The Foundation — the Product level, once per product before any epic (greenfield AND brownfield). After yad foundation new seeds the ledger, with the analyst + pm write the sections into foundation/ (EP-foundation): purpose, market (optional), scope (what it is and is not), MVP, roadmap, stack, repos, risks (optional). roadmap.md becomes the menu of features each yad-epic reads. Its approval is reported, not enforced, before feature work. Never auto-advances.",,{idea: one-line product idea} {mode: greenfield|brownfield},0-front,,yad-review-gate,false,foundation/,purpose.md market.md scope.md mvp.md roadmap.md stack.md repos.md risks.md state.json
|
|
3
3
|
SDLC Workflow,yad-analysis,Author Analysis,AN,"Optional Shape step: with the analyst pressure-test a feature idea and write the discovery brief into analysis.md. Assigns the EP-<slug> ID and seeds .sdlc state (the chain that puts analysis before epic). If skipped, the epic step does this shaping inline. Never auto-advances.",,{idea: one-line feature idea},1-front,,yad-review-gate,false,epics/EP-<slug>/,analysis.md state.json
|
|
4
4
|
SDLC Workflow,yad-epic,Author Epic,AE,"Shape step 1: shape an idea with analyst then pm into epic.md; assign EP-<slug> ID and seed .sdlc state. Never auto-advances.",,{idea: one-line feature idea},1-front,,yad-review-gate,true,epics/EP-<slug>/,epic.md state.json
|
|
5
|
-
SDLC Workflow,yad-review-gate,Team Review Gate,RG,"Reusable review+approve gate for
|
|
5
|
+
SDLC Workflow,yad-review-gate,Team Review Gate,RG,"Reusable review+approve gate for every Shape review. Shares an artifact for review, records comments and approvals as files, enforces at least 1 approval from someone other than the author (contract/auth/payments add a risk step to the count, capped at the active people less one and advisory), advances state only when approved.",,{artifact: file under the epic} {action: open|comment|approve|advance},1-front,,,true,epics/EP-<slug>/reviews/,reviews/*.md approvals.json state.json
|
|
6
6
|
SDLC Workflow,yad-review-companion,Review Companion,RC,"Fun, easy, transparent review companion for the review gates (Shape gate AND Build code PR). Generates a 60-sec AI trailer of what changed and where the risk is, deals swipe-through review cards, and runs a grounded chat where a reviewer's questions become the review record — then records an engagement signal on the approval (verified vs none) and posts a friendly public @-mention nudge on a bare rubber-stamp. Companion comments carry a noblock marker so they never hold the gate. Soft by default (visible, not impossible); gates only when hub.review.requireEngagement. Never auto-advances.",,{epic: EP-<slug>} {artifact} | {repo} {pr} {action: trailer|cards|chat|nudge},1-front,,,false,epics/EP-<slug>/reviews/ | code PR,trailer/cards/chat (platform) approvals.json engagement
|
|
7
7
|
SDLC Workflow,yad-pair-review,Pair Review,PV,"The guided, two-way, teaching pair-review walkthrough — the AI-driven 5th companion face (Shape gate AND Build code PR). The human opens a PR/MR with an AI session and the AI walks them through the change one stop at a time (highest-risk first), gives comprehensive context per change, then asks a Socratic question; the human answers and asks back until BOTH declare satisfied. Doubles as a learning session: demonstrates a transferable review method, scores the engineer, and records review-skill growth in the local-only yad-learn ledger (rolled up by yad status). Soft and additive — NEVER blocks; rides the engagement signal and surfaces genuine concerns as normal blocking comments. Never auto-advances.",,{epic: EP-<slug>} {artifact} | {repo} {pr} {member} {action: walkthrough|record|rubric},3-build,yad-review-companion,,false,epics/EP-<slug>/reviews/ | code PR | epics/EP-<slug>/learning/ (local-only),pair session (platform) learning-records.json learning/<member>--review-<pr>.md
|
|
8
8
|
SDLC Workflow,yad-architecture,Author Architecture,AA,"Shape step 3: with the architect author architecture.md and the locked contract.md; hash-lock the contract surface. Never auto-advances.",,{epic: EP-<slug>},1-front,yad-review-gate,yad-review-gate,true,epics/EP-<slug>/,architecture.md contract.md contract-lock.json state.json
|
|
9
9
|
SDLC Workflow,yad-ui,Author UI Design,AU,"Shape step 5: with the ux-designer author ui-design.md and DESIGN.md, driving Impeccable slash-commands when installed. Never auto-advances.",,{epic: EP-<slug>},1-front,yad-review-gate,yad-review-gate,true,epics/EP-<slug>/,ui-design.md DESIGN.md state.json
|
|
10
10
|
SDLC Workflow,yad-stories,Author Stories,AS,"Shape step 7: with the pm break the epic into repo-tagged stories with stable EP-<slug>-S0N IDs, one file each under stories/. Never auto-advances.",,{epic: EP-<slug>},1-front,yad-review-gate,yad-review-gate,true,epics/EP-<slug>/stories/,stories/EP-<slug>-S0N.md state.json
|
|
11
|
-
SDLC Workflow,yad-test-cases,Author Test Cases,TC,"Shape step 9 (PARALLEL, non-blocking): opens when the stories gate passes — the epic is already ready-for-build, so Build can start at the same time the tester works here. With the test architect
|
|
12
|
-
SDLC Workflow,yad-connect-repos,Connect Code Repos,CR,"Setup/maintenance: connect code repos to the
|
|
11
|
+
SDLC Workflow,yad-test-cases,Author Test Cases,TC,"Shape step 9 (PARALLEL, non-blocking): opens when the stories gate passes — the epic is already ready-for-build, so Build can start at the same time the tester works here. With the test architect author test-cases.md covering the approved stories, and — when a testing tool is connected (.sdlc/testing.json) — generate/link the actual automation tests in it, recording test-links.json; otherwise produce the test-case artifact only. Its review never moves currentStep off ready-for-build. Never auto-advances.",,{epic: EP-<slug>},1-front,yad-review-gate,yad-review-gate,true,epics/EP-<slug>/,test-cases.md test-links.json state.json
|
|
12
|
+
SDLC Workflow,yad-connect-repos,Connect Code Repos,CR,"Setup/maintenance: connect code repos to the Product so the Shape/brain phases are code-aware. Registers each repo (GitHub or GitLab, local-user auth, no stored tokens) in .sdlc/repos.json and caches a Repomix pack + a lightweight code-map (existing endpoints/events/data-models/modules, secret-scanned). Idempotent and refreshable; staleness tracked by HEAD sha. yad repo refresh --push publishes the refreshed code-maps + registry to the Product default branch as a chore(hub): sync code-context [skip ci] audit commit. Also drafts each code repo's .sdlc/risk-map (a level per directory, no names) by reading the code, marked guessed for a person to confirm. Run at setup or any time a new repo is added. Not a gated state — never touches epic state or approvals.",,{action: connect|refresh|list|disconnect} {repo: <name>} {path: <path-or-absolute>} {git_url: <ssh-or-https>},0-setup,,yad-sync-repos,false,.sdlc/,repos.json code-context/<repo>/pack.md code-context/<repo>/code-map.md
|
|
13
13
|
SDLC Workflow,yad-sync-repos,Sync Connected Repos,SR,"Setup/maintenance: bring every connected repo up to date in one shot — switch each repo in .sdlc/repos.json to its default_branch and fast-forward it from origin (local-user git, no stored tokens). Working-tree only; never a gate and never writes the registry. A dirty repo is skipped and reported (never overwritten); a diverged branch is left for manual resolution (fast-forward only). After pulling, a repo's cached pack goes stale — points the human at yad repo refresh.",,{action: sync} {repo: <name>},0-setup,yad-connect-repos,yad-connect-design,false,,(none — working-tree only)
|
|
14
|
-
SDLC Workflow,yad-connect-design,Connect Design Tool,CD,"Setup/maintenance: connect a design tool (Figma-first, pluggable) to the
|
|
15
|
-
SDLC Workflow,yad-connect-testing,Connect Testing Tool,CT,"Setup/maintenance: connect a testing tool (Playwright-first, pluggable) to the
|
|
14
|
+
SDLC Workflow,yad-connect-design,Connect Design Tool,CD,"Setup/maintenance: connect a design tool (Figma-first, pluggable) to the Product so the UI design step can materialize the actual feature design (mobile screens / web pages) inside it, alongside ui-design.md + DESIGN.md. Records the tool + project/file references in .sdlc/design.json (local-user / MCP-session auth, no stored tokens), detecting whether a design-tool MCP is available and degrading to markdown-only when absent. Idempotent and refreshable; one connection per project. Not a gated state — never touches epic state or approvals.",,"{action: connect|refresh|list|disconnect} {tool: figma|pencil|none} {project_url: <team/project/file url>} {files: {web,mobile}}",0-setup,,yad-ui,false,.sdlc/,design.json
|
|
15
|
+
SDLC Workflow,yad-connect-testing,Connect Testing Tool,CT,"Setup/maintenance: connect a testing tool (Playwright-first, pluggable) to the Product so the test-cases step can implement the actual automation tests in it, alongside test-cases.md. Records the tool + project/suite references in .sdlc/testing.json (local-user / MCP-session auth, no stored tokens), detecting whether a testing-tool MCP is available and degrading to artifacts-only when absent. Idempotent and refreshable; one connection per project. Not a gated state — never touches epic state or approvals.",,{action: connect|refresh|list|disconnect} {tool: playwright|cypress|pytest|none} {project_url: <project/config reference>} {suites: {<repo>}},0-setup,,yad-test-cases,false,.sdlc/,testing.json
|
|
16
16
|
SDLC Workflow,yad-connect-learning,Connect Learning Tool,CL,"Setup/maintenance: connect a learning/tutoring tool (DeepTutor-first, pluggable) so the cross-cutting learning layer can tutor any team member, at any SDLC stage, in the context of what is being built. Records the tool + an optional grounded knowledge base in .sdlc/learning.json (local-user auth, no stored tokens), detecting whether the DeepTutor CLI is on PATH (a subprocess like Repomix, not an MCP) and degrading to harness-native tutoring when absent. Idempotent and refreshable; one connection per project. Not a gated state — never touches epic state or approvals.",,{action: connect|refresh|list|disconnect} {tool: deeptutor|none} {kb: <name>} {ground: true|false},0-setup,,yad-learn,false,.sdlc/,learning.json
|
|
17
|
-
SDLC Workflow,yad-learn,Learn (Tutor),LN,"Cross-cutting learning layer: at ANY SDLC stage a team member can ask to learn a concept and be tutored in the context of what the team is building. Routes to the connected learning tool (.sdlc/learning.json, DeepTutor-first) grounded in the project knowledge base, or degrades to harness-native tutoring (the harness model reading the artifacts). Renders a tutorial artifact and appends to a per-member learning ledger kept LOCAL-ONLY (gitignored, never committed/pushed to the
|
|
17
|
+
SDLC Workflow,yad-learn,Learn (Tutor),LN,"Cross-cutting learning layer: at ANY SDLC stage a team member can ask to learn a concept and be tutored in the context of what the team is building. Routes to the connected learning tool (.sdlc/learning.json, DeepTutor-first) grounded in the project knowledge base, or degrades to harness-native tutoring (the harness model reading the artifacts). Renders a tutorial artifact and appends to a per-member learning ledger kept LOCAL-ONLY (gitignored, never committed/pushed to the Product or any code repo) so it stays a private, personal skills log (yad-status rolls up the local records). Purely opt-in — never blocks a gate, never touches epic state, approvals, or the contract lock.",,{concept: <idea>} {context: <focus>} {epic: EP-<slug>} {stage: <sdlc stage>} {member: <who>} {mode: explain|deep|quiz} {action: learn|list|complete},anytime,,,false,epics/EP-<slug>/,learning-records.json learning/<member>--<concept>.md
|
|
18
18
|
SDLC Workflow,yad-spec,Author Spec,SP,"Build Step A: for one ready-for-build story and one of its repos, run the heavy Spec Kit ceremony once (specify→clarify→plan→analyze→checklist→tasks) inside that code repo, writing specs/<story-id>/ in Spec Kit's layout (drives /speckit.* when installed, else hand-authors and records speckit: not-installed). References the locked contract; never re-invents the surface. Writes link.md back to the story. Never auto-advances.",,{epic: EP-<slug>} {story: EP-<slug>-S0N} {repo: <one of story.repos>},3-build,yad-review-gate,,false,demo-repos/<repo>/specs/<story-id>/,spec.md research.md data-model.md contracts/ plan.md tasks.md link.md
|
|
19
19
|
SDLC Workflow,yad-implement,Implement Task,IM,"Build Step B: with the dev lens, implement ONE atomic task from a story's tasks.md as a small diff (<=3 files) on its own branch feat/<story>-<task>-<slug> in the code repo. Diff stays inside the task's declared files (flag and STOP if it grows beyond them). Commit ends with a Task: <story>-<task> trailer; add Contract-Change: yes only when the locked contract surface is touched (routes back to the architecture gate). Never auto-advances.",,{epic: EP-<slug>} {story: EP-<slug>-S0N} {repo: <one of story.repos>} {task: T0N},3-build,yad-spec,,false,demo-repos/<repo>/,branch+commit per atomic task
|
|
20
|
-
SDLC Workflow,yad-checks,Check Gates,CK,"Build Step C: wire and run the production-safety CI gates on a code repo (and
|
|
21
|
-
SDLC Workflow,yad-pr-template,PR/MR Template,PT,"Build Step D: detect a code repo's platform and commit the matching PR/MR template (.github/pull_request_template.md or .gitlab/merge_request_templates/Default.md) with an Impact & Risk block. A high risk level (or a touched contract
|
|
20
|
+
SDLC Workflow,yad-checks,Check Gates,CK,"Build Step C: wire and run the production-safety CI gates on a code repo (and Product) — spec-link (every change links a real story/spec via its Task trailer), contract-check (a contract-surface change without Contract-Change + an updated re-locked contract FAILS and routes back to the architecture gate), build/test/lint, verified-commits (every commit carries a platform-Verified signature), and the pattern gates commit-message / pr-title / pr-template (profile-aware code|hub). CI-agnostic bash invoked by GitHub Actions and GitLab CI. Blocking in CI; the human still owns the merge. Never auto-advances.",,{repo: <one of an epic's repos | hub>} {action: wire|run} {base: target branch},3-build,yad-implement,,false,demo-repos/<repo>/,checks/*.sh .github/workflows/yad-checks.yml .gitlab/ci/yad-checks.yml
|
|
21
|
+
SDLC Workflow,yad-pr-template,PR/MR Template,PT,"Build Step D: detect a code repo's platform and commit the matching PR/MR template (.github/pull_request_template.md or .gitlab/merge_request_templates/Default.md) with an Impact & Risk block. A high risk level (or a touched contract surface) raises the approver count — the same count yad-review-gate prints. Ships the routing helper risk-route.sh plus the pattern-gate scripts pr-title.sh and pr-template.sh (used by yad-checks). Never auto-advances.",,{repo: <one of an epic's repos | hub>} {action: wire|route} {body: PR description file},3-build,yad-checks,,false,demo-repos/<repo>/,.github/pull_request_template.md .gitlab/merge_request_templates/Default.md checks/risk-route.sh checks/pr-title.sh checks/pr-template.sh
|
|
22
22
|
SDLC Workflow,yad-commit,Commit by Convention,CM,"Build helper: commit ONE staged atomic change by the conventions — a Conventional-Commits subject, the fixed trailer block (Task -> Contract-Change -> Co-Authored-By), and the <=3-file atomic guard. The human git author owns the commit; an assisting AI is recorded only as a Co-Authored-By footer chosen per-commit with --ai (claude|copilot|cursor|coderabbit|none, default none). Drives the yad commit CLI. Never auto-advances.",,{type: feat|fix|...} {message: subject} {ai: <tool|none>} {task: <id>} {contract-change: true|false},3-build,yad-implement,,false,<repo>/,one commit
|
|
23
|
-
SDLC Workflow,yad-open-pr,Open PR/MR,OP,"Build helper: open a code-repo task PR/MR from the committed platform template — detect GitHub/GitLab, push the task branch, create the PR/MR with the body prefilled (Summary / Story-task / Impact & Risk) and the title defaulting to the commit subject.
|
|
24
|
-
SDLC Workflow,yad-ship,Commit + Open PR/MR,SP2,"Build helper: commit AND open the task PR/MR in one step — a thin orchestration over yad-commit then yad-open-pr. Commits the staged atomic change by the conventions, then pushes the branch and opens the PR/MR from the committed template
|
|
25
|
-
SDLC Workflow,yad-hub-bridge,Hub Review Bridge,HB,"The templated PR/MR bridge for the Shape review gate: when the
|
|
26
|
-
SDLC Workflow,yad-engineer-review,Engineer Review & Merge,ER,"Build Step E: wire an advisory AI first-pass (CodeRabbit) on the PR, record the human engineer review with the same
|
|
23
|
+
SDLC Workflow,yad-open-pr,Open PR/MR,OP,"Build helper: open a code-repo task PR/MR from the committed platform template — detect GitHub/GitLab, push the task branch, create the PR/MR with the body prefilled (Summary / Story-task / Impact & Risk) and the title defaulting to the commit subject. Assigns the logged-in gh/glab login and requests no reviewers; high risk / contract surface raises the approver count (risk-route.sh prints it). Bases the PR on the repo's RESOLVED default branch (--base, else repos.json default_branch, else hub.json default_branch for a PR on the Product itself, else the platform's own default, else origin/HEAD, else main) instead of a hardcoded main, and warns when the base is not the platform default — that loses the AI first pass irreversibly. Drives the yad open-pr CLI. Never merges; never auto-advances.",,{repo: <name>} {risk: low|medium|high} {contract-change: true|false} {base: <branch>},3-build,yad-commit,,false,<repo>/,one PR/MR
|
|
24
|
+
SDLC Workflow,yad-ship,Commit + Open PR/MR,SP2,"Build helper: commit AND open the task PR/MR in one step — a thin orchestration over yad-commit then yad-open-pr. Commits the staged atomic change by the conventions, then pushes the branch and opens the PR/MR from the committed template, assigned to the logged-in gh/glab login with no reviewers requested. The PR step runs ONLY if the commit lands (a failed commit, tripped guard, or --dry-run stops before pushing). Drives the yad ship CLI. Never merges; never auto-advances.",,{type: feat|fix|...} {message: subject} {ai: <tool|none>} {repo: <name>} {risk: low|medium|high} {contract-change: true|false} {base: <branch>},3-build,yad-pr-template,,false,<repo>/,one commit + one PR/MR
|
|
25
|
+
SDLC Workflow,yad-hub-bridge,Hub Review Bridge,HB,"The templated PR/MR bridge for the Shape review gate: when the Product has a platform (.sdlc/hub.json), open a review PR/MR on the Product for an authored artifact, apply the touched-domain labels (no reviewers are requested), and provide the read-only gh/glab recipes yad-review-gate's sync uses to pull platform comments + approvals into the file ledger. Local-user auth, no stored tokens; file ledger stays the source of truth; degrades to local when no platform/CLI. Never auto-advances.",,{epic: EP-<slug>} {artifact: epic.md|architecture.md|ui-design.md|stories/} {action: open|route},1-front,yad-review-gate,yad-review-gate,false,epics/EP-<slug>/.sdlc/,hub-prs.json
|
|
26
|
+
SDLC Workflow,yad-engineer-review,Engineer Review & Merge,ER,"Build Step E: wire an advisory AI first-pass (CodeRabbit) on the PR, record the human engineer review with the same advance-human discipline as the Shape gates (1 approval from someone other than the author; high risk / contract / auth / payments add an advisory risk step), and on merge record the ship in epics/<epic>/.sdlc/build-log.json and update the story state. AI review is advisory, never the authority; the human owns the merge. Never auto-advances.",,{epic: EP-<slug>} {story: EP-<slug>-S0N} {task: T0N} {repo: <repo>} {action: ai-review|approve|ship},3-build,yad-ship,,false,epics/EP-<slug>/.sdlc/,build-log.json story-status
|
|
27
27
|
SDLC Workflow,yad-backfill,Backfill Specs,BF,"Build Step G: generate specs for already-built features in an existing repo. Confirm Repomix (npx repomix CLI), pack ONE feature (compress + git logs, secret-scan), feed to AI with a 'describe what exists, do not invent' prompt, write a DRAFT spec marked verified: false. Human approval (reuse yad-review-gate) makes it real. Boundary auto-proposed and human-confirmed. A change is blocked only until the features it touches have approved specs. The promote action flips a brownfield stub epic (yad-stub) to a real, verified feature epic once its backfill spec is approved. Never auto-advances.",,{repo: <repo>} {feature: <name + globs>} {action: pack|draft|approve|gate|promote} {epic: EP-<slug> (promote)},3-build,,,false,demo-repos/<repo>/specs/backfill/<feature>/,spec.md backfill-check.sh
|
|
28
|
-
SDLC Workflow,yad-run,Run (Automation),RN,"Phase 4 orchestrator: drive a story's Build loop (spec→tasks→implement→checks) in one code repo, reading each step's
|
|
29
|
-
SDLC Workflow,yad-status,SDLC Status,SS,"Read-only: print the full Shape step chain, per-step dials, contract lock, story repo tags, and pending approvals at the active gate. For stories in Build, also print each Build step's automation dial and status, the
|
|
30
|
-
SDLC Workflow,yad-report,Report Issue,RP,"Self issue reporter: when a yad flow breaks, file a well-formed bug in the upstream yadflow repo with AUTO-SCRUBBED diagnostics (yadflow/node/os version, tool present+authenticated booleans,
|
|
28
|
+
SDLC Workflow,yad-run,Run (Automation),RN,"Phase 4 orchestrator: drive a story's Build loop (spec→tasks→implement→checks) in one code repo, reading each step's advance dial through the engine (yad dial --json) — on auto it advances on its own, on human it stops for a human. Records every run in the trust log, the run record yad dial shows as advice. A clean checks pass on auto advances to the engineer review; any FAIL / scope overrun / contract touch HALTS. set-dial runs yad dial (no trust threshold since E34; a gate is refused); kill/unkill run yad kill / yad unkill, recorded in .sdlc/automation.json. Never drives a Shape step; the human merge gate never auto-advances.",,{epic: EP-<slug>} {story: EP-<slug>-S0N} {repo: <repo>} {action: run|set-dial|kill|unkill} {step: <back-step>} {to: human|auto},4-automate,yad-spec,yad-engineer-review,false,epics/EP-<slug>/.sdlc/,build-state/<story-id>.json trust-log.json
|
|
29
|
+
SDLC Workflow,yad-status,SDLC Status,SS,"Read-only: print the full Shape step chain, per-step dials, contract lock, story repo tags, and pending approvals at the active gate. For stories in Build, also print each Build step's automation dial and status, the run record (runs / % approved-unchanged, as advice), the Shape author dials and the kill switch from .sdlc/automation.json.",,{epic: EP-<slug>},anytime,,,false,,
|
|
30
|
+
SDLC Workflow,yad-report,Report Issue,RP,"Self issue reporter: when a yad flow breaks, file a well-formed bug in the upstream yadflow repo with AUTO-SCRUBBED diagnostics (yadflow/node/os version, tool present+authenticated booleans, Product platform enum, the YadError code/hint, a path-scrubbed message, and the failing command + flag NAMES only) — never absolute paths, hostnames, git URLs, repo names, logins/emails, epic/story IDs, branch names, or flag values. Searches open issues first to avoid duplicates, previews the exact payload, and asks before posting to the public repo; files via an authenticated gh (the upstream repo is on GitHub) or a prefilled issues/new URL fallback. Also offered automatically after an unexpected failure (interactive only; YAD_NO_REPORT=1 disables). Never a gate, never touches epic state.",,{message: one-line summary},,,,false,,
|
|
31
31
|
SDLC Workflow,yad-connect-docs,Connect Docs Target,DX,"Setup/maintenance: connect a docs/Pages publishing target so the interactive-docs steps can deploy the generated site (not just commit its source). Auto-detects the platform from .sdlc/hub.json (github->github-pages, gitlab->gitlab-pages, null->build-only), resolves the Vite base path, and records the target in .sdlc/docs.json (local-user auth, no stored tokens). Degrades to build-only when gh/glab is absent. Idempotent and refreshable; one connection per project. Not a gated state — never touches epic state or approvals.",,{action: connect|refresh|list|disconnect} {target: github-pages|gitlab-pages|none} {scope: hub|<repo>|dedicated} {base_path: <override>},0-setup,,yad-docs,false,.sdlc/,docs.json
|
|
32
|
-
SDLC Workflow,yad-docs,Author Docs Site,DS,"Generate the per-epic interactive documentation SPA (animated flow canvas + role-based stakeholder doc pages) from the epic's approved artifacts (epic, architecture, locked contract, ui-design, stories, code-context, test-cases), themed by the connected design system, into epics/EP-<slug>/docs-site/. Copies the vendored React/Vite/Tailwind shell verbatim and generates src/data/*.ts deterministically; drives the yad docs build/deploy CLI to publish to Pages (or build-only). An OUTPUT ENRICHMENT — never a gate; never mutates state.json, approvals, or the contract lock.",,{epic: EP-<slug>} {action: generate|refresh|deploy} {login_gate: true|false}
|
|
33
|
-
SDLC Workflow,yad-docs-overview,Docs Overview Site,DO,"Generate the project SDLC-overview interactive site (docs/sdlc-site/) — every stage from setup to ship modeled as flow paths, system components, and stakeholder roles — reusing the same vendored shell, themed with yadflow's brand palette. Reads config.yaml + module-help.csv + the overview diagram as the pipeline source. Folds the hand-maintained docs/index.html report into the site as report.html (linked from the nav). Not a gate — a project-level enrichment that regenerates whenever the skill set / pipeline changes.",,{action: generate|deploy}
|
|
34
|
-
SDLC Workflow,yad-docs-sync,Docs Sync,DY,"Maintenance/CI: keep the generated doc sites fresh. Detect staleness (a content hash of the approved artifacts + the connected repos' HEAD shas + the doc-shell version vs each site's build manifest), report which sites drifted and why, regenerate + redeploy the stale ones, and wire a CI job that rebuilds on push (carrying [skip ci] + a concurrency group to prevent deploy loops). Generalizes the rule that feature work must hand-update docs/index.html + diagrams + skill counts. Refresh is always a human/CI decision; never a gate.",,{action: check|refresh|wire} {epic: EP-<slug>}
|
|
35
|
-
SDLC Workflow,yad-change,Change/Defect Intake,CH,"Phase 6 post-lock change management: the INTAKE + TRIAGE step of a feature thread. Classifies the change DEPTH (defect-fix / behavioral-no-surface / contract-surface / new-capability), seeds a NEW EP-<slug> change-epic threaded to its parent (lineage frontmatter kind/parent/thread/inherits/supersedes
|
|
36
|
-
SDLC Workflow,yad-timeline,Feature Timeline,TL,"Render a feature THREAD (its linked epics, genesis->changes->defects) as an evolution view (the vendored React/Vite/Tailwind shell HTML + a TIMELINE.md summary) AND resolve the inheritance chain into the authoritative current artifact set (thread-resolved.md: the winning source per artifact + the resolved contract-lock hash) — the composed source-of-truth AI/humans read for the next change. Reads frontmatter lineage + each change.json + the build ledger (folded build-log.json UNIONed with every build-log/ shard). An OUTPUT ENRICHMENT — never a gate; never mutates state.",,{thread: EP-<genesis>} {action: generate|deploy}
|
|
37
|
-
SDLC Workflow,yad-defects,Quality-Gap Report,DF,"Generate a per-epic AND per-thread defect/bug report (same vendored shell + DEFECTS.md). Walks the thread for every
|
|
38
|
-
SDLC Workflow,yad-reconcile,Change Reconciler,RE,"Maintenance/CI (mirrors yad-docs-sync — never a gate): detect post-lock DRIFT/ORPHANS — shipped code or a repo HEAD advance (the repos.json syncedHead-vs-current-HEAD rule) with NO owning change-epic in any thread — plus open hotfix reconcile debt, and report which thread drifted and why. refresh points at yad-change to open a reconcile change-epic (or yad-stub first, to anchor orphan brownfield code that has no epic at all) — never silent; wire commits advisory CI ([skip ci] + concurrency, like yad-docs-sync). The actual merge BLOCK is the lineage-check / reconcile-debt gates; this only discovers.",,{action: check|refresh|wire} {thread: EP-<genesis>}
|
|
39
|
-
SDLC Workflow,yad-stub,Stub Genesis Epic,SG,"Phase 6 brownfield helper: mint a STUB genesis epic for an already-built feature that has no epic in the
|
|
32
|
+
SDLC Workflow,yad-docs,Author Docs Site,DS,"Generate the per-epic interactive documentation SPA (animated flow canvas + role-based stakeholder doc pages) from the epic's approved artifacts (epic, architecture, locked contract, ui-design, stories, code-context, test-cases), themed by the connected design system, into epics/EP-<slug>/docs-site/. Copies the vendored React/Vite/Tailwind shell verbatim and generates src/data/*.ts deterministically; drives the yad docs build/deploy CLI to publish to Pages (or build-only). An OUTPUT ENRICHMENT — never a gate; never mutates state.json, approvals, or the contract lock.",,{epic: EP-<slug>} {action: generate|refresh|deploy} {login_gate: true|false},4-automate,yad-review-gate,,false,epics/EP-<slug>/docs-site/,docs-site/ docs-build.json
|
|
33
|
+
SDLC Workflow,yad-docs-overview,Docs Overview Site,DO,"Generate the project SDLC-overview interactive site (docs/sdlc-site/) — every stage from setup to ship modeled as flow paths, system components, and stakeholder roles — reusing the same vendored shell, themed with yadflow's brand palette. Reads config.yaml + module-help.csv + the overview diagram as the pipeline source. Folds the hand-maintained docs/index.html report into the site as report.html (linked from the nav). Not a gate — a project-level enrichment that regenerates whenever the skill set / pipeline changes.",,{action: generate|deploy},4-automate,,,false,docs/sdlc-site/,sdlc-site/ .docs-build.json
|
|
34
|
+
SDLC Workflow,yad-docs-sync,Docs Sync,DY,"Maintenance/CI: keep the generated doc sites fresh. Detect staleness (a content hash of the approved artifacts + the connected repos' HEAD shas + for a per-epic site the doc-shell version, vs each site's build manifest), report which sites drifted and why, regenerate + redeploy the stale ones, and wire a CI job that rebuilds on push (carrying [skip ci] + a concurrency group to prevent deploy loops). Generalizes the rule that feature work must hand-update docs/index.html + diagrams + skill counts. Refresh is always a human/CI decision; never a gate.",,{action: check|refresh|wire} {epic: EP-<slug>},4-automate,,,false,epics/EP-<slug>/.sdlc/,docs-build.json yad-docs.yml
|
|
35
|
+
SDLC Workflow,yad-change,Change/Defect Intake,CH,"Phase 6 post-lock change management: the INTAKE + TRIAGE step of a feature thread. Classifies the change DEPTH (defect-fix / behavioral-no-surface / contract-surface / new-capability), seeds a NEW EP-<slug> change-epic threaded to its parent (lineage frontmatter kind+type/parent/thread/inherits/supersedes ; then `yad epic new --parent` writes the state.json whose inherited steps are carried by reference and only the changed steps run, plus a pointer-lock contract-lock.json when architecture is inherited), and records the intake in change.json (escape_stage + root_cause for defects). For hotfixes it records the ship-first exception and opens reconcile-debt.json. Never auto-advances — hands off to the normal authoring skills + yad-review-gate.",,{parent: EP-<slug>} {title: one-line} {type: change|defect|hotfix} {origin: production|staging|qa|review} {severity: sev1..sev4} {description: text} {affected: artifacts},6-change,,yad-review-gate,false,epics/EP-<slug>/,epic.md state.json change.json reconcile-debt.json contract-lock.json
|
|
36
|
+
SDLC Workflow,yad-timeline,Feature Timeline,TL,"Render a feature THREAD (its linked epics, genesis->changes->defects) as an evolution view (the vendored React/Vite/Tailwind shell HTML + a TIMELINE.md summary) AND resolve the inheritance chain into the authoritative current artifact set (thread-resolved.md: the winning source per artifact + the resolved contract-lock hash) — the composed source-of-truth AI/humans read for the next change. Reads frontmatter lineage + each change.json + the build ledger (folded build-log.json UNIONed with every build-log/ shard). An OUTPUT ENRICHMENT — never a gate; never mutates state.",,{thread: EP-<genesis>} {action: generate|deploy},6-change,,,false,epics/EP-<genesis>/,timeline-site/ thread-resolved.md TIMELINE.md
|
|
37
|
+
SDLC Workflow,yad-defects,Quality-Gap Report,DF,"Generate a per-epic AND per-thread defect/bug report (same vendored shell + DEFECTS.md). Walks the thread for every defect-type change-epic + each change.json defect block + shipped regressions in the build ledger (folded build-log.json UNIONed with every build-log/ shard), aggregates by escape_stage (the SDLC gate that should have caught it) and root_cause, and visualizes WHERE quality gaps systematically come from (e.g. % of thread defects that escaped at the test-cases gate) so the team can harden the originating stage. An OUTPUT ENRICHMENT — never a gate; never mutates state.",,{epic: EP-<slug> | thread: EP-<genesis>} {action: generate|deploy},6-change,,,false,epics/EP-<slug>/,defects-site/ DEFECTS.md
|
|
38
|
+
SDLC Workflow,yad-reconcile,Change Reconciler,RE,"Maintenance/CI (mirrors yad-docs-sync — never a gate): detect post-lock DRIFT/ORPHANS — shipped code or a repo HEAD advance (the repos.json syncedHead-vs-current-HEAD rule) with NO owning change-epic in any thread — plus open hotfix reconcile debt, and report which thread drifted and why. refresh points at yad-change to open a reconcile change-epic (or yad-stub first, to anchor orphan brownfield code that has no epic at all) — never silent; wire commits advisory CI ([skip ci] + concurrency, like yad-docs-sync). The actual merge BLOCK is the lineage-check / reconcile-debt gates; this only discovers.",,{action: check|refresh|wire} {thread: EP-<genesis>},6-change,,,false,epics/EP-<genesis>/.sdlc/,(report) reconcile-debt.json yad-reconcile.yml
|
|
39
|
+
SDLC Workflow,yad-stub,Stub Genesis Epic,SG,"Phase 6 brownfield helper: mint a STUB genesis epic for an already-built feature that has no epic in the Product, so a defect/change can thread off it TODAY (yad-change requires a real parent and dead-ends without one). Creates the smallest real thread anchor — a tiny epic.md (type feature, thread:self, verified:false, stub:backfill-pending) + a seeded state.json (kind:stub / currentStep:backfill-pending) + empty ledgers — never inventing behaviour. Defects thread off it immediately (gates pass; the bug list is derived by the thread rollup); yad-backfill + its promote step later flip it into a real feature epic. Never auto-advances.",,{feature: <name>} {repos: [<repo>]} {description: one-line},6-change,,yad-change,false,epics/EP-<slug>/,epic.md state.json approvals.json comments.json
|