yadflow 1.0.1 → 2.0.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 +25 -0
- package/README.md +137 -134
- package/bin/{sdlc.mjs → yad.mjs} +18 -17
- package/cli/commit.mjs +3 -3
- package/cli/epic-state.mjs +2 -2
- package/cli/gate.mjs +8 -8
- package/cli/lib.mjs +1 -1
- package/cli/manifest.mjs +77 -36
- package/cli/openpr.mjs +3 -3
- package/cli/plan.mjs +88 -1
- package/cli/platform.mjs +2 -2
- package/cli/reconcile.mjs +18 -10
- package/cli/repo.mjs +5 -5
- package/cli/setup.mjs +7 -7
- package/docs/index.html +1227 -0
- package/package.json +10 -7
- package/skills/sdlc/config.yaml +24 -24
- package/skills/sdlc/install.sh +2 -2
- package/skills/sdlc/module-help.csv +16 -16
- package/skills/{sdlc-author-analysis → yad-analysis}/SKILL.md +12 -12
- package/skills/{sdlc-author-architecture → yad-architecture}/SKILL.md +12 -12
- package/skills/{sdlc-author-architecture → yad-architecture}/references/contract-format.md +1 -1
- package/skills/{sdlc-backfill → yad-backfill}/SKILL.md +4 -4
- package/skills/{sdlc-backfill → yad-backfill}/references/backfill.md +2 -2
- package/skills/{sdlc-backfill → yad-backfill}/templates/checks/backfill-check.sh +1 -1
- package/skills/{sdlc-checks → yad-checks}/SKILL.md +20 -20
- package/skills/{sdlc-checks → yad-checks}/references/check-gates.md +21 -21
- package/skills/{sdlc-checks → yad-checks}/templates/checks/contract-check.sh +2 -2
- package/skills/{sdlc-checks → yad-checks}/templates/checks/verified-commits.sh +2 -2
- package/skills/{sdlc-checks/templates/github/sdlc-checks.yml → yad-checks/templates/github/yad-checks.yml} +3 -3
- package/skills/{sdlc-checks/templates/github/sdlc-verified-commits.yml → yad-checks/templates/github/yad-verified-commits.yml} +4 -4
- package/skills/{sdlc-checks → yad-checks}/templates/gitlab/gitlab-ci.include-root.yml +3 -3
- package/skills/{sdlc-checks/templates/gitlab/sdlc-checks.gitlab-ci.yml → yad-checks/templates/gitlab/yad-checks.gitlab-ci.yml} +7 -7
- package/skills/{sdlc-checks/templates/gitlab/sdlc-verified-commits.gitlab-ci.yml → yad-checks/templates/gitlab/yad-verified-commits.gitlab-ci.yml} +4 -4
- package/skills/{sdlc-connect-repos → yad-connect-repos}/SKILL.md +7 -7
- package/skills/{sdlc-connect-repos → yad-connect-repos}/references/code-context.md +6 -6
- package/skills/{sdlc-connect-repos → yad-connect-repos}/references/hub-config.md +3 -3
- package/skills/{sdlc-author-epic → yad-epic}/SKILL.md +13 -13
- package/skills/{sdlc-author-epic → yad-epic}/references/state-schema.md +13 -13
- package/skills/{sdlc-hub-bridge → yad-hub-bridge}/SKILL.md +24 -24
- package/skills/{sdlc-hub-bridge → yad-hub-bridge}/references/bridge.md +11 -11
- package/skills/{sdlc-hub-bridge → yad-hub-bridge}/references/login-roster.md +2 -2
- package/skills/{sdlc-hub-bridge → yad-hub-bridge}/templates/checks/hub-route.sh +3 -3
- package/skills/{sdlc-hub-bridge/templates/github/sdlc-gate-sync.yml → yad-hub-bridge/templates/github/yad-gate-sync.yml} +10 -10
- package/skills/{sdlc-hub-bridge → yad-hub-bridge}/templates/gitlab/gitlab-ci.include-root.yml +3 -3
- package/skills/{sdlc-hub-bridge/templates/gitlab/sdlc-gate-sync.gitlab-ci.yml → yad-hub-bridge/templates/gitlab/yad-gate-sync.gitlab-ci.yml} +11 -11
- package/skills/{sdlc-implement → yad-implement}/SKILL.md +14 -14
- package/skills/{sdlc-implement → yad-implement}/references/implement-conventions.md +4 -4
- package/skills/{sdlc-pr-template → yad-pr-template}/SKILL.md +11 -11
- package/skills/{sdlc-pr-template → yad-pr-template}/references/risk-routing.md +5 -5
- package/skills/{sdlc-pr-template → yad-pr-template}/templates/checks/risk-route.sh +2 -2
- package/skills/{sdlc-pr-template → yad-pr-template}/templates/github/pull_request_template.md +1 -1
- package/skills/{sdlc-pr-template → yad-pr-template}/templates/gitlab/merge_request_templates/Default.md +1 -1
- package/skills/{sdlc-pr-template → yad-pr-template}/templates/hub/github/pull_request_template.md +4 -4
- package/skills/{sdlc-pr-template → yad-pr-template}/templates/hub/gitlab/merge_request_templates/Default.md +4 -4
- package/skills/{sdlc-review-comments → yad-review-comments}/SKILL.md +6 -6
- package/skills/{sdlc-review-comments → yad-review-comments}/references/comment-conventions.md +6 -6
- package/skills/{sdlc-review-comments → yad-review-comments}/templates/github/REVIEW_COMMENTS.md +2 -2
- package/skills/{sdlc-review-comments → yad-review-comments}/templates/gitlab/REVIEW_COMMENTS.md +2 -2
- package/skills/{sdlc-review-gate → yad-review-gate}/SKILL.md +13 -13
- package/skills/{sdlc-review-gate → yad-review-gate}/references/gating.md +3 -3
- package/skills/{sdlc-run → yad-run}/SKILL.md +12 -12
- package/skills/{sdlc-run → yad-run}/references/run-loop.md +10 -10
- package/skills/{sdlc-ship → yad-ship}/SKILL.md +8 -8
- package/skills/{sdlc-ship → yad-ship}/references/ship-and-record.md +3 -3
- package/skills/{sdlc-ship → yad-ship}/templates/.coderabbit.yaml +1 -1
- package/skills/{sdlc-spec → yad-spec}/SKILL.md +11 -11
- package/skills/{sdlc-spec → yad-spec}/references/spec-handoff.md +2 -2
- package/skills/{sdlc-status → yad-status}/SKILL.md +6 -6
- package/skills/{sdlc-author-stories → yad-stories}/SKILL.md +10 -10
- package/skills/{sdlc-author-stories → yad-stories}/references/story-schema.md +1 -1
- package/skills/{sdlc-author-ui → yad-ui}/SKILL.md +9 -9
- /package/skills/{sdlc-checks → yad-checks}/templates/checks/build-test-lint.sh +0 -0
- /package/skills/{sdlc-checks → yad-checks}/templates/checks/spec-link.sh +0 -0
- /package/skills/{sdlc-checks → yad-checks}/templates/gitlab/.gitlab-ci.yml +0 -0
- /package/skills/{sdlc-connect-repos → yad-connect-repos}/references/repos-registry.md +0 -0
- /package/skills/{sdlc-implement → yad-implement}/templates/.gitmessage +0 -0
package/skills/{sdlc-pr-template → yad-pr-template}/templates/hub/github/pull_request_template.md
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- SDLC HUB PR template — front-half artifact review (epic / architecture+contract / ui-design / stories). -->
|
|
2
|
-
<!-- This PR is a REVIEW VEHICLE on the product hub, not a code merge. The file gate (
|
|
2
|
+
<!-- This PR is a REVIEW VEHICLE on the product hub, not a code merge. The file gate (yad-review-gate)
|
|
3
3
|
advances the step; do NOT rely on merging this PR to advance. Reviewers approve/comment here, then a
|
|
4
|
-
`
|
|
4
|
+
`yad-review-gate action: sync` pulls that into the file ledger. -->
|
|
5
5
|
|
|
6
6
|
## Artifact under review
|
|
7
7
|
- Epic: `EP-<slug>`
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
- **Risk tags:** <none | contract | auth | payments> <!-- contract/auth/payments => escalates to domain owners -->
|
|
18
18
|
- **Contract surface:** <n/a | locked @ sha256:…> <!-- architecture only; a re-lock invalidates prior approvals -->
|
|
19
19
|
|
|
20
|
-
## Required approvals (
|
|
20
|
+
## Required approvals (yad-review-gate rule)
|
|
21
21
|
- Base: **owner + 1 reviewer**.
|
|
22
22
|
- Escalated (risk tag set, or a stories PR): **plus one domain-owner per touched repo** — see the
|
|
23
23
|
requested reviewers / `domain:<repo>` labels on this PR. Run `bash checks/hub-route.sh <this-description>`
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
- **Approve** this PR to record an `owner` / `reviewer` / `domain-owner` approval in the file ledger
|
|
28
28
|
(your platform login maps to your SDLC name + role via `.sdlc/hub.json`'s roster).
|
|
29
29
|
- **Comment / request changes** to record review comments (synced into `reviews/<artifact>--<date>--comments.md`).
|
|
30
|
-
- **Do NOT merge to advance** — `
|
|
30
|
+
- **Do NOT merge to advance** — `yad-review-gate action: sync` + `action: advance` move the step.
|
|
31
31
|
|
|
32
32
|
## Checklist
|
|
33
33
|
- [ ] `owner` set in the artifact frontmatter (inherited from `epic.md`)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- SDLC HUB MR template — front-half artifact review (epic / architecture+contract / ui-design / stories). -->
|
|
2
|
-
<!-- This MR is a REVIEW VEHICLE on the product hub, not a code merge. The file gate (
|
|
2
|
+
<!-- This MR is a REVIEW VEHICLE on the product hub, not a code merge. The file gate (yad-review-gate)
|
|
3
3
|
advances the step; do NOT rely on merging this MR to advance. Reviewers approve/comment here, then a
|
|
4
|
-
`
|
|
4
|
+
`yad-review-gate action: sync` pulls that into the file ledger. -->
|
|
5
5
|
|
|
6
6
|
## Artifact under review
|
|
7
7
|
- Epic: `EP-<slug>`
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
- **Risk tags:** <none | contract | auth | payments> <!-- contract/auth/payments => escalates to domain owners -->
|
|
18
18
|
- **Contract surface:** <n/a | locked @ sha256:…> <!-- architecture only; a re-lock invalidates prior approvals -->
|
|
19
19
|
|
|
20
|
-
## Required approvals (
|
|
20
|
+
## Required approvals (yad-review-gate rule)
|
|
21
21
|
- Base: **owner + 1 reviewer**.
|
|
22
22
|
- Escalated (risk tag set, or a stories MR): **plus one domain-owner per touched repo** — see the
|
|
23
23
|
reviewers / `domain:<repo>` labels on this MR. Run `bash checks/hub-route.sh <this-description>` to list them.
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
- **Approve** this MR to record an `owner` / `reviewer` / `domain-owner` approval in the file ledger
|
|
27
27
|
(your platform login maps to your SDLC name + role via `.sdlc/hub.json`'s roster).
|
|
28
28
|
- **Comment** to record review comments (synced into `reviews/<artifact>--<date>--comments.md`).
|
|
29
|
-
- **Do NOT merge to advance** — `
|
|
29
|
+
- **Do NOT merge to advance** — `yad-review-gate action: sync` + `action: advance` move the step.
|
|
30
30
|
|
|
31
31
|
## Checklist
|
|
32
32
|
- [ ] `owner` set in the artifact frontmatter (inherited from `epic.md`)
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
3
|
-
description: 'Installs platform-matched PR/MR review-comment scaffolds into a repo so reviewers leave structured, attributable feedback that maps cleanly into the SDLC file ledger. Works for code repos and the product hub. GitHub has no repo-level multi-comment template, so the scaffold is a committed REVIEW_COMMENTS.md reviewers copy from (saved as Saved Replies on GitHub / comment templates on GitLab). Each canned comment carries an attributable `**<name> (<role>)**` header that matches the `## <name> (<role>)` headings
|
|
2
|
+
name: yad-review-comments
|
|
3
|
+
description: 'Installs platform-matched PR/MR review-comment scaffolds into a repo so reviewers leave structured, attributable feedback that maps cleanly into the SDLC file ledger. Works for code repos and the product hub. GitHub has no repo-level multi-comment template, so the scaffold is a committed REVIEW_COMMENTS.md reviewers copy from (saved as Saved Replies on GitHub / comment templates on GitLab). Each canned comment carries an attributable `**<name> (<role>)**` header that matches the `## <name> (<role>)` headings yad-review-gate writes. Use when the user says "add the comment templates" or "set up review comments" for a repo.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# SDLC — Review Comment Templates
|
|
7
7
|
|
|
8
8
|
**Goal:** Give reviewers a consistent, **attributable** set of canned PR/MR comments so review feedback
|
|
9
9
|
reads the same across repos and **maps cleanly into the file ledger** the gate keeps. The headers match
|
|
10
|
-
the `## <name> (<role>)` shape `
|
|
10
|
+
the `## <name> (<role>)` shape `yad-review-gate` writes into `reviews/<artifact>--<date>--comments.md`
|
|
11
11
|
and the per-commenter record in `comments.json`, so a synced or copy-pasted comment lands without
|
|
12
12
|
reformatting.
|
|
13
13
|
|
|
@@ -55,9 +55,9 @@ Report what was committed. The scaffold is an aid to human review; it approves n
|
|
|
55
55
|
- **Drop only the matching scaffold** for the detected platform.
|
|
56
56
|
- **Attributable headers** — every canned comment keeps the `**<name> (<role>)**` form so the gate's
|
|
57
57
|
ledger and the PR thread agree.
|
|
58
|
-
- **Nothing auto-advances.** Comments feed the human review and (via the bridge) `
|
|
58
|
+
- **Nothing auto-advances.** Comments feed the human review and (via the bridge) `yad-review-gate`.
|
|
59
59
|
|
|
60
60
|
## Reference
|
|
61
61
|
- Comment conventions + the full scaffold contents: `references/comment-conventions.md`.
|
|
62
|
-
- The ledger headings these match: `../
|
|
63
|
-
- The review bridge that syncs platform comments into the ledger: `../
|
|
62
|
+
- The ledger headings these match: `../yad-review-gate/SKILL.md` (comment action) and `references/gating.md`.
|
|
63
|
+
- The review bridge that syncs platform comments into the ledger: `../yad-hub-bridge/SKILL.md`.
|
package/skills/{sdlc-review-comments → yad-review-comments}/references/comment-conventions.md
RENAMED
|
@@ -8,14 +8,14 @@ attributable header:
|
|
|
8
8
|
**<name> (<role>)**
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
`<role>` is one of `owner | reviewer | domain-owner` — the same roles `
|
|
11
|
+
`<role>` is one of `owner | reviewer | domain-owner` — the same roles `yad-review-gate` records. This
|
|
12
12
|
header matches the `## <name> (<role>)` headings the gate writes into
|
|
13
13
|
`reviews/<artifact>--<date>--comments.md`, so a comment copied from the PR thread (or synced by
|
|
14
|
-
`
|
|
14
|
+
`yad-hub-bridge`) needs no reformatting to land in the ledger.
|
|
15
15
|
|
|
16
16
|
## Blocking comments (a gate or rule says stop)
|
|
17
17
|
|
|
18
|
-
These map to the code-repo check gates (`
|
|
18
|
+
These map to the code-repo check gates (`yad-checks`) and the file-boundary / contract rules:
|
|
19
19
|
|
|
20
20
|
- **spec-link** — "This commit has no `Task: <story>-<task>` trailer; the spec-link gate will fail. Add
|
|
21
21
|
the trailer (and ensure `specs/<story>/link.md` exists)."
|
|
@@ -24,12 +24,12 @@ These map to the code-repo check gates (`sdlc-checks`) and the file-boundary / c
|
|
|
24
24
|
- **build-test-lint** — "Lint/build/test is red (or the test doesn't exercise the new behavior). The
|
|
25
25
|
build-test-lint gate must pass with a test that actually exercises the acceptance criterion."
|
|
26
26
|
- **file-boundary** — "This diff touches files the task's `Files:` list didn't declare. Re-scope the
|
|
27
|
-
task (re-run `
|
|
27
|
+
task (re-run `yad-spec`) rather than widening the diff silently."
|
|
28
28
|
|
|
29
29
|
## Escalation / routing comment
|
|
30
30
|
|
|
31
31
|
- **routing** — "Risk is `high` / a contract|auth|payments surface is touched — this needs a
|
|
32
|
-
domain-owner approval per touched repo (the same escalation `
|
|
32
|
+
domain-owner approval per touched repo (the same escalation `yad-review-gate` applies). Run
|
|
33
33
|
`bash checks/risk-route.sh <body>` (code repo) or `bash checks/hub-route.sh <body>` (hub)."
|
|
34
34
|
|
|
35
35
|
## Non-blocking comments
|
|
@@ -41,7 +41,7 @@ These map to the code-repo check gates (`sdlc-checks`) and the file-boundary / c
|
|
|
41
41
|
## Approval note
|
|
42
42
|
|
|
43
43
|
- **approve** — "Approving as `<role>`. Recorded in `approvals.json` (code-repo ship: `build-log.json`).
|
|
44
|
-
On the hub, your approval here is pulled in by `
|
|
44
|
+
On the hub, your approval here is pulled in by `yad-review-gate action: sync`."
|
|
45
45
|
|
|
46
46
|
## Hub front-artifact review
|
|
47
47
|
|
package/skills/{sdlc-review-comments → yad-review-comments}/templates/github/REVIEW_COMMENTS.md
RENAMED
|
@@ -20,13 +20,13 @@ SDLC review ledger (`reviews/<artifact>--<date>--comments.md`) so feedback stays
|
|
|
20
20
|
|
|
21
21
|
**<name> (<role>)**
|
|
22
22
|
- file-boundary: this touches files the task's `Files:` list didn't declare. Re-scope the task (re-run
|
|
23
|
-
`
|
|
23
|
+
`yad-spec`) instead of widening the diff.
|
|
24
24
|
|
|
25
25
|
## Routing / escalation
|
|
26
26
|
|
|
27
27
|
**<name> (<role>)**
|
|
28
28
|
- routing: risk is `high` / a contract|auth|payments surface is touched — needs a domain-owner approval
|
|
29
|
-
per touched repo (same escalation as `
|
|
29
|
+
per touched repo (same escalation as `yad-review-gate`). Run `bash checks/risk-route.sh <body>`.
|
|
30
30
|
|
|
31
31
|
## Non-blocking
|
|
32
32
|
|
package/skills/{sdlc-review-comments → yad-review-comments}/templates/gitlab/REVIEW_COMMENTS.md
RENAMED
|
@@ -20,13 +20,13 @@ SDLC review ledger (`reviews/<artifact>--<date>--comments.md`) so feedback stays
|
|
|
20
20
|
|
|
21
21
|
**<name> (<role>)**
|
|
22
22
|
- file-boundary: this touches files the task's `Files:` list didn't declare. Re-scope the task (re-run
|
|
23
|
-
`
|
|
23
|
+
`yad-spec`) instead of widening the diff.
|
|
24
24
|
|
|
25
25
|
## Routing / escalation
|
|
26
26
|
|
|
27
27
|
**<name> (<role>)**
|
|
28
28
|
- routing: risk is `high` / a contract|auth|payments surface is touched — needs a domain-owner approval
|
|
29
|
-
per touched repo (same escalation as `
|
|
29
|
+
per touched repo (same escalation as `yad-review-gate`). Run `bash checks/risk-route.sh <body>`.
|
|
30
30
|
|
|
31
31
|
## Non-blocking
|
|
32
32
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: yad-review-gate
|
|
3
3
|
description: 'The reusable team review + approve gate for the SDLC. Shares an authored artifact for review, records reviewer comments and approvals as files, enforces the owner + 1 reviewer rule (escalating to domain owners on contract/auth/payments), and advances the epic state ONLY when approval is recorded. Use when the user says "review the analysis/epic/architecture/UI/stories", "comment", "approve", or "advance the gate".'
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -13,7 +13,7 @@ escalation applies only where `risk_tags` or per-repo routing call for it.
|
|
|
13
13
|
|
|
14
14
|
This gate is **swappable and file-driven**: it talks only through files. A front step advances only on a
|
|
15
15
|
human act — recording an approval and `advance`, or (with the bridge) **merging the approved,
|
|
16
|
-
fully-resolved review PR/MR**. It works the same whether a human or the `
|
|
16
|
+
fully-resolved review PR/MR**. It works the same whether a human or the `yad gate` CLI triggers it — the
|
|
17
17
|
trigger is a parameter, not a hardcoded human.
|
|
18
18
|
|
|
19
19
|
## Conventions
|
|
@@ -29,7 +29,7 @@ trigger is a parameter, not a hardcoded human.
|
|
|
29
29
|
- `action`: one of `open` | `comment` | `approve` | `sync` | `advance` (default: `open`).
|
|
30
30
|
- For `comment` / `approve`: the reviewer name and role (`owner` | `reviewer` | `domain-owner`),
|
|
31
31
|
and for domain owners the `domain` (repo/area). Ask if not provided.
|
|
32
|
-
- `sync` needs no reviewer input — it reads the platform PR/MR review state (via `
|
|
32
|
+
- `sync` needs no reviewer input — it reads the platform PR/MR review state (via `yad-hub-bridge`).
|
|
33
33
|
|
|
34
34
|
## On Activation
|
|
35
35
|
|
|
@@ -60,7 +60,7 @@ the rule above, and tell reviewers how to comment/approve. Set the step `status`
|
|
|
60
60
|
|
|
61
61
|
If `.sdlc/hub.json` has a non-null `platform`, `bridge_enabled: true`, `config.yaml` `hub.bridge: true`,
|
|
62
62
|
and `gh`/`glab` is authenticated, **also open a review PR/MR on the hub** by invoking
|
|
63
|
-
`
|
|
63
|
+
`yad-hub-bridge action: open` (epic + artifact). Record the PR in `epics/<epic>/.sdlc/hub-prs.json`
|
|
64
64
|
(`{step, artifact, platform, number, url, branch, lastSyncedAt}`) and report the URL + required
|
|
65
65
|
reviewers. Otherwise (no platform / disabled / no CLI) proceed **file-only** exactly as before — no
|
|
66
66
|
error. Opening the PR records no approvals and never advances.
|
|
@@ -119,7 +119,7 @@ a separate, explicit check.
|
|
|
119
119
|
|
|
120
120
|
**`sync`** — (the platform bridge input path) Pull the hub review PR/MR's review state into the ledger,
|
|
121
121
|
then re-evaluate the rule (Step 3). Read the PR for this step from `.sdlc/hub-prs.json` and use
|
|
122
|
-
`
|
|
122
|
+
`yad-hub-bridge`'s read recipes (`../yad-hub-bridge/references/bridge.md`) to fetch reviews + comments
|
|
123
123
|
via the local user's `gh`/`glab`. For each:
|
|
124
124
|
- map the platform `login` → SDLC `name` + `role` via `.sdlc/hub.json`'s roster (a roster `name` equal
|
|
125
125
|
to a repo's `domain_owner` in `repos.json` becomes that repo's `domain-owner` for a touched domain;
|
|
@@ -131,7 +131,7 @@ via the local user's `gh`/`glab`. For each:
|
|
|
131
131
|
key comments on the platform comment id (re-running `sync` does not duplicate). **Manual approvals (no
|
|
132
132
|
`source` tag) are never touched.** For the architecture+contract step, discard bridge approvals dated
|
|
133
133
|
before a new contract lock (re-lock invalidates platform approvals too). Then refresh the `approved.md`
|
|
134
|
-
roster, set `hub-prs.json` `lastSyncedAt`, and **re-evaluate Step 3**. Under the PR-driven CLI (`
|
|
134
|
+
roster, set `hub-prs.json` `lastSyncedAt`, and **re-evaluate Step 3**. Under the PR-driven CLI (`yad
|
|
135
135
|
gate sync`), `sync` advances the step when Step 3 passes on a **merged**, fully-resolved, approved PR
|
|
136
136
|
(the merge is the human act); otherwise it records state and holds the step `in_review`.
|
|
137
137
|
|
|
@@ -145,7 +145,7 @@ The step may advance **iff ALL hold**:
|
|
|
145
145
|
2. The artifact has not changed since the latest approval round (no newer authored edit than the
|
|
146
146
|
newest `approved` record). If it changed, approvals are stale → return to `comment`. For the
|
|
147
147
|
**architecture+contract** review, also recompute the contract-surface hash (see
|
|
148
|
-
`../
|
|
148
|
+
`../yad-architecture/references/contract-format.md`): if it no longer matches
|
|
149
149
|
`.sdlc/contract-lock.json`, the surface changed → approvals stale → return to `comment` and re-lock.
|
|
150
150
|
|
|
151
151
|
If the predicate **fails**: report exactly which approvals are still missing and STOP. Do not modify
|
|
@@ -161,9 +161,9 @@ If the predicate **passes**:
|
|
|
161
161
|
- Write `state.json`. Report the advance and what the next authored artifact is (or that the epic is
|
|
162
162
|
now `ready-for-build`).
|
|
163
163
|
|
|
164
|
-
### PR-driven automation (the `
|
|
164
|
+
### PR-driven automation (the `yad gate` CLI)
|
|
165
165
|
When the hub has a platform, the mechanical `open`/`sync`/`advance` is performed deterministically by the
|
|
166
|
-
**`
|
|
166
|
+
**`yad gate` CLI** (`yad gate open|sync|comments|status`), which writes the same `.sdlc/` + `reviews/`
|
|
167
167
|
records this skill describes. The skill's job is then the human half: presenting the artifact, helping the
|
|
168
168
|
owner address comments, and narrating the gate. The CLI is the single implementation of the gh/glab
|
|
169
169
|
mechanics — do not hand-run gh/glab recipes when it is installed.
|
|
@@ -172,11 +172,11 @@ Under that CLI the gate **advances on merge**: a review PR/MR whose reviewer rul
|
|
|
172
172
|
comment threads are **all resolved**, and which has been **merged** auto-marks the step `done` and
|
|
173
173
|
unblocks the next step. (Until those three hold, the step stays `in_review`.)
|
|
174
174
|
|
|
175
|
-
`sync` can also be **event-driven**: when the hub is wired with the gate-sync CI (`
|
|
175
|
+
`sync` can also be **event-driven**: when the hub is wired with the gate-sync CI (`yad-hub-bridge`
|
|
176
176
|
`wire` action), every approval / change request / dismissal / merge on the review PR/MR triggers
|
|
177
|
-
`
|
|
177
|
+
`yad gate ci` on the hub, which runs the same sync and commits the ledger updates directly to the
|
|
178
178
|
hub's default branch (pull to see them locally). The predicate, the human merge, and manual
|
|
179
|
-
`
|
|
179
|
+
`yad gate sync` are all unchanged — CI never approves and never merges.
|
|
180
180
|
|
|
181
181
|
### Hard rules (build plan §1, §5)
|
|
182
182
|
- **The merge click is the human approval act.** A front step advances only when a human merges the
|
|
@@ -193,4 +193,4 @@ hub's default branch (pull to see them locally). The predicate, the human merge,
|
|
|
193
193
|
|
|
194
194
|
## Reference
|
|
195
195
|
- Gating details and worked example: `references/gating.md`.
|
|
196
|
-
- The platform PR/MR bridge (`open`/`sync` mechanics, read recipes, roster): `../
|
|
196
|
+
- The platform PR/MR bridge (`open`/`sync` mechanics, read recipes, roster): `../yad-hub-bridge/SKILL.md`.
|
|
@@ -33,7 +33,7 @@ content. This prevents "approve, then quietly change it" (build plan §5 spirit)
|
|
|
33
33
|
For the architecture+contract review there is a second, content-based staleness check: recompute the
|
|
34
34
|
SHA-256 of the contract-surface block and compare it to `.sdlc/contract-lock.json`. A mismatch means
|
|
35
35
|
the locked surface changed even if the file's mtime looks fine — approvals are stale, re-lock and
|
|
36
|
-
re-approve. (Hash recipe: `
|
|
36
|
+
re-approve. (Hash recipe: `yad-architecture/references/contract-format.md`.)
|
|
37
37
|
|
|
38
38
|
## Worked example — epic gate
|
|
39
39
|
|
|
@@ -58,7 +58,7 @@ attributable, and it is the same shape a future service or the platform bridge c
|
|
|
58
58
|
## Platform-backed input (the bridge)
|
|
59
59
|
When the hub has a platform (`.sdlc/hub.json`) and the bridge is enabled, reviewers can approve/comment
|
|
60
60
|
on a real PR/MR instead of (or as well as) the skill recording it directly. `action: sync`
|
|
61
|
-
(`
|
|
61
|
+
(`yad-hub-bridge`) reads that platform state with the reviewer's own `gh`/`glab` and writes the **same**
|
|
62
62
|
`approvals.json` / `comments.json` / `reviews/*.md` records the manual path writes — bridge approvals
|
|
63
63
|
tagged `"source": "bridge"`. **The predicate above is unchanged**: it counts owner/reviewer/domain-owner
|
|
64
64
|
approvals regardless of how they were recorded.
|
|
@@ -69,7 +69,7 @@ approvals regardless of how they were recorded.
|
|
|
69
69
|
comment id) and never touches **manual** approvals.
|
|
70
70
|
- The architecture+contract staleness rule applies to bridge approvals too: a re-lock discards bridge
|
|
71
71
|
approvals dated before the new lock.
|
|
72
|
-
- No platform / no CLI → the gate runs file-only with no error. Detail: `../
|
|
72
|
+
- No platform / no CLI → the gate runs file-only with no error. Detail: `../yad-hub-bridge/references/bridge.md`.
|
|
73
73
|
|
|
74
74
|
## Why this shape
|
|
75
75
|
- Owner + 1 reviewer keeps review load low on a small team (design priority 2) while still requiring
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: yad-run
|
|
3
3
|
description: 'Phase 4 (automation) — the orchestrator that makes the second dial real. Drives a story''s back-half loop (spec → tasks → implement → checks) in one code repo, reading each step''s automation dial from build-state: on machine_advance it advances on its own, on human_approve it stops for a human. Records every run in the trust log (the evidence base for earning automation). Realizes Step B: when checks is earned, a clean gate pass auto-advances to engineer-review; any failure, scope overrun, or contract-surface touch HALTS and pulls in a human. Also sets a step''s dial (gated by trust evidence) and flips the system-wide kill switch. Never advances a front state or the engineer review. Use when the user says "run the build half", "advance story <id>", "set the checks dial", or "kill switch".'
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -32,9 +32,9 @@ signal to seed them from, so they are earned only on real runs.
|
|
|
32
32
|
`trust_threshold`, `locked_steps`, `kill_switch`).
|
|
33
33
|
- Per-story build-half state: `epics/<epic>/.sdlc/build-state/<story-id>.json` (per repo).
|
|
34
34
|
- Trust ledger: `epics/<epic>/.sdlc/trust-log.json` (append-only). Schemas:
|
|
35
|
-
`../
|
|
36
|
-
- The orchestrator **calls the existing step skills unchanged** — `
|
|
37
|
-
(B), `
|
|
35
|
+
`../yad-epic/references/state-schema.md`.
|
|
36
|
+
- The orchestrator **calls the existing step skills unchanged** — `yad-spec` (A), `yad-implement`
|
|
37
|
+
(B), `yad-checks` (C). It owns only the *advance decision*, never what a step does.
|
|
38
38
|
|
|
39
39
|
## Inputs
|
|
40
40
|
|
|
@@ -54,8 +54,8 @@ Read `config.yaml` `automation`, the story's `build-state/<story>.json` (create
|
|
|
54
54
|
### `action: run` — drive the loop
|
|
55
55
|
Walk the steps for `repo` starting at `from`/`currentStep`. For each step:
|
|
56
56
|
|
|
57
|
-
1. **Run the step's skill** — `spec`→`
|
|
58
|
-
`implement`→`
|
|
57
|
+
1. **Run the step's skill** — `spec`→`yad-spec`, `tasks`→ the tasks leg of `yad-spec`,
|
|
58
|
+
`implement`→`yad-implement`, `checks`→`yad-checks (action: run)`. Capture its result.
|
|
59
59
|
2. **Derive trust signals & append a trust-log entry** (`ranBy: machine` if this advance was
|
|
60
60
|
automated, else `human`) — see `references/run-loop.md` for the derivation. Do this for *every*
|
|
61
61
|
step run, pass or fail; the log is the evidence base.
|
|
@@ -63,14 +63,14 @@ Walk the steps for `repo` starting at `from`/`currentStep`. For each step:
|
|
|
63
63
|
to `human_approve`** if `automation.kill_switch` is true OR the step is `locked` OR the step id is
|
|
64
64
|
in `automation.locked_steps`. (So a kill switch or a lock always wins.)
|
|
65
65
|
4. **Decide:**
|
|
66
|
-
- **HALT** if the step failed — any check FAIL, a scope overrun (`
|
|
66
|
+
- **HALT** if the step failed — any check FAIL, a scope overrun (`yad-implement` stopped on the
|
|
67
67
|
file-boundary rule), a contract-surface touch, or any ambiguity. Set the step `status: blocked`,
|
|
68
68
|
write the `rejected` trust entry, **stop the loop**, and report what a human must resolve.
|
|
69
69
|
- else if effective dial is **`machine_advance`** → set the step `done`, advance `currentStep` to
|
|
70
70
|
the next step, and **continue the loop** (this is the Step B auto-advance for `checks`).
|
|
71
71
|
- else (**`human_approve`**) → set the step `done`/`in_review`, **stop** and report
|
|
72
72
|
"waiting for a human at `<next-step>`".
|
|
73
|
-
5. **Always stop at `engineer-review`** (it is `locked`): hand off to `
|
|
73
|
+
5. **Always stop at `engineer-review`** (it is `locked`): hand off to `yad-ship` for the human merge
|
|
74
74
|
gate, which finalizes the trust verdict (confirm/override the provisional one).
|
|
75
75
|
|
|
76
76
|
### `action: set-dial` — earn (or revert) a step's automation
|
|
@@ -87,7 +87,7 @@ Flip `step`'s `automation` to `to` in build-state. Enforce, in order:
|
|
|
87
87
|
### `action: kill` / `action: unkill` — the kill switch
|
|
88
88
|
Set `automation.kill_switch` to `true` (`kill`) or `false` (`unkill`) in `config.yaml`. While true,
|
|
89
89
|
**every** step's effective dial is `human_approve` system-wide — no per-step edits, instantly
|
|
90
|
-
reversible (build plan §Safety). Report the new state and that `
|
|
90
|
+
reversible (build plan §Safety). Report the new state and that `yad-status` will show it.
|
|
91
91
|
|
|
92
92
|
## Hard rules (phase-4-build-plan.md)
|
|
93
93
|
|
|
@@ -104,6 +104,6 @@ reversible (build plan §Safety). Report the new state and that `sdlc-status` wi
|
|
|
104
104
|
|
|
105
105
|
## Reference
|
|
106
106
|
- The loop, the trust-verdict derivation, and the threshold predicate: `references/run-loop.md`.
|
|
107
|
-
- State/trust schemas: `../
|
|
108
|
-
- The steps it drives: `../
|
|
109
|
-
hands off to: `../
|
|
107
|
+
- State/trust schemas: `../yad-epic/references/state-schema.md`.
|
|
108
|
+
- The steps it drives: `../yad-spec/`, `../yad-implement/`, `../yad-checks/`; the human gate it
|
|
109
|
+
hands off to: `../yad-ship/`.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# `
|
|
1
|
+
# `yad-run` — the loop, the trust verdict, the threshold
|
|
2
2
|
|
|
3
3
|
This is the detail behind `SKILL.md`. It restates the orchestration so the skill is self-contained,
|
|
4
4
|
and pins down the two judgments the skill makes: **what trust verdict to record** and **when a step
|
|
@@ -12,9 +12,9 @@ From `config.yaml` `automation.back_steps` plus the human merge gate:
|
|
|
12
12
|
spec → tasks → implement → checks → engineer-review(locked)
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
`spec` and `tasks` are the two legs of `
|
|
16
|
-
`implement` is one atomic task via `
|
|
17
|
-
`engineer-review` is the human gate at `
|
|
15
|
+
`spec` and `tasks` are the two legs of `yad-spec` (the heavy ceremony, then the atomic `tasks.md`).
|
|
16
|
+
`implement` is one atomic task via `yad-implement`. `checks` is `yad-checks (action: run)`.
|
|
17
|
+
`engineer-review` is the human gate at `yad-ship` — always a stop, never automated.
|
|
18
18
|
|
|
19
19
|
## The loop (pseudocode)
|
|
20
20
|
|
|
@@ -24,7 +24,7 @@ bs = build-state/<story>.json.repos[<repo>] # create from defaults if
|
|
|
24
24
|
step = from or bs.currentStep
|
|
25
25
|
|
|
26
26
|
while step is a back step (not engineer-review):
|
|
27
|
-
result = run_step_skill(step) #
|
|
27
|
+
result = run_step_skill(step) # yad-spec | yad-implement | yad-checks
|
|
28
28
|
|
|
29
29
|
signals = derive_signals(step, result) # see "Deriving signals"
|
|
30
30
|
verdict = derive_verdict(signals) # rejected | approved-with-edits | approved-unchanged
|
|
@@ -40,7 +40,7 @@ while step is a back step (not engineer-review):
|
|
|
40
40
|
else: # human_approve
|
|
41
41
|
bs.step.status = "done"; persist; STOP and report "waiting for human at <next>"
|
|
42
42
|
|
|
43
|
-
# reached engineer-review: always stop, hand to
|
|
43
|
+
# reached engineer-review: always stop, hand to yad-ship (human gate, finalizes the verdict)
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
`ranBy` is `machine` when the *previous* step's effective dial caused this step to run without a human
|
|
@@ -62,17 +62,17 @@ per-step dial says. `engineer-review` and the four front states are covered by `
|
|
|
62
62
|
## Deriving signals & the provisional verdict
|
|
63
63
|
|
|
64
64
|
`signals` are the raw facts of the run; the **provisional `verdict`** is derived from them. The human
|
|
65
|
-
gate for each step (the engineer review at `
|
|
65
|
+
gate for each step (the engineer review at `yad-ship` for `implement`; spec acceptance for `spec`;
|
|
66
66
|
first-consume for `tasks`; the gate itself for `checks`) later confirms or overrides the verdict and
|
|
67
67
|
finalizes the entry — a human always has the last word on the trust signal.
|
|
68
68
|
|
|
69
69
|
`signals` (only the relevant ones are set per step — see the table in
|
|
70
|
-
`../
|
|
70
|
+
`../yad-epic/references/state-schema.md`):
|
|
71
71
|
- `checks` — `pass` | `fail` | `n/a` (only the `checks` step runs the three gates).
|
|
72
72
|
- `human_edited_diff` — `true` if a human changed the produced **diff** before merge (`implement`).
|
|
73
73
|
- `human_edited_spec` — `true` if a human edited the generated **spec/plan/tasks** before accepting (`spec`).
|
|
74
74
|
- `task_rescoped` — `true` if a task's declared `Files:`/scope was edited before implementing (`tasks`).
|
|
75
|
-
- `scope_overrun` — `true` if `
|
|
75
|
+
- `scope_overrun` — `true` if `yad-implement` stopped on the file-boundary rule (diff outside the
|
|
76
76
|
task's declared files).
|
|
77
77
|
- `contract_touch` — `true` if the diff touched the locked contract surface without an upstream
|
|
78
78
|
re-lock (routes back to the architecture gate).
|
|
@@ -114,7 +114,7 @@ Reverting (`to: human_approve`) is never gated — automation must be reversible
|
|
|
114
114
|
|
|
115
115
|
## What stays human, always
|
|
116
116
|
|
|
117
|
-
- `engineer-review` — the merge gate. `
|
|
117
|
+
- `engineer-review` — the merge gate. `yad-run` always stops here and hands to `yad-ship`.
|
|
118
118
|
- The four front states (`epic`, `architecture`, `ui-design`, `stories`) — not in `back_steps`, in
|
|
119
119
|
`locked_steps`; the dial-setter refuses them.
|
|
120
120
|
- Any contract-surface change — halts the loop and routes back to the architecture gate, regardless of
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: yad-ship
|
|
3
3
|
description: 'Build-half Step E of the gated SDLC — AI review, engineer review, then ship. Wire an advisory AI first-pass (CodeRabbit) on the PR/MR; record the human engineer review with the same human_approve discipline as the front gates (owner + 1 reviewer, escalating to domain owners on high risk / contract / auth / payments — the Step D routing); and on merge, record the ship in the epic build-log and update the story state so the epic → story → task → PR chain is traceable. Never auto-advances — the human owns the merge. Use when the user says "ship this task", "record the engineer review", or "wire the AI review".'
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -17,9 +17,9 @@ then **ship** — merge, record the ship, and update the story state. This is th
|
|
|
17
17
|
truth: it holds the story and the build ledger).
|
|
18
18
|
- Code repos are separate git repos under `{project-root}/demo-repos/<repo>/`.
|
|
19
19
|
- The build ledger is `{project-root}/epics/<epic>/.sdlc/build-log.json` (append-only).
|
|
20
|
-
- The engineer-review rule reuses `
|
|
20
|
+
- The engineer-review rule reuses `yad-review-gate`: base = at least one `owner` AND one distinct
|
|
21
21
|
`reviewer`; **escalated** (the PR's Impact & Risk is `high`, or it touches contract/auth/payments) =
|
|
22
|
-
base PLUS one `domain-owner` per touched domain — the same routing `
|
|
22
|
+
base PLUS one `domain-owner` per touched domain — the same routing `yad-pr-template`'s
|
|
23
23
|
`risk-route.sh` prints.
|
|
24
24
|
- AI review wiring: `templates/.coderabbit.yaml` → `<repo>/.coderabbit.yaml`.
|
|
25
25
|
|
|
@@ -42,7 +42,7 @@ ran; surface its findings to the engineer. Do **not** treat AI approval as a gat
|
|
|
42
42
|
### Step 2 — `approve` (the engineer review — the human gate)
|
|
43
43
|
A human engineer reads the diff **against the spec** (`specs/<story>/`) and the acceptance criteria,
|
|
44
44
|
and records an approval. Determine the rule from the PR's Impact & Risk block (run
|
|
45
|
-
`../
|
|
45
|
+
`../yad-pr-template/templates/checks/risk-route.sh` on the PR body): base, or escalated to a
|
|
46
46
|
domain-owner per touched domain. Record each approval; re-evaluate whether the rule is satisfied.
|
|
47
47
|
Recording an approval does **not** ship — shipping is a separate, explicit step. Front-half discipline:
|
|
48
48
|
the gate talks only through files; refuse to treat AI review as a human approval.
|
|
@@ -62,7 +62,7 @@ engineer-review rule is satisfied (Step 2). Then:
|
|
|
62
62
|
the story frontmatter `status: shipped`; otherwise `status: in-build`. The chain
|
|
63
63
|
**epic → story → task → PR → mergeCommit** is now traceable end to end.
|
|
64
64
|
- **Finalize the trust verdict (Phase 4).** If this story has a `build-state/<story>.json` (it ran
|
|
65
|
-
through `
|
|
65
|
+
through `yad-run`), the engineer **confirms or overrides** the provisional trust verdict that the
|
|
66
66
|
orchestrator derived for this run, and the final verdict is written to
|
|
67
67
|
`epics/<epic>/.sdlc/trust-log.json`. The human has the last word on the trust signal: a diff merged
|
|
68
68
|
as authored is `approved-unchanged`; one the engineer edited before merge is `approved-with-edits`;
|
|
@@ -76,11 +76,11 @@ stays as it was (`ready-for-build`). The build half is recorded in `build-log.js
|
|
|
76
76
|
## Hard rules (build plan §E, Cross-cutting)
|
|
77
77
|
|
|
78
78
|
- **AI review is advisory, never the authority.** Only a human engineer approval counts toward the gate.
|
|
79
|
-
- **High risk routes to domain owners** — the same escalation as `
|
|
79
|
+
- **High risk routes to domain owners** — the same escalation as `yad-review-gate` / `risk-route.sh`.
|
|
80
80
|
- **Ship only after gates + engineer review.** No gate skipped; the human owns the merge.
|
|
81
81
|
- **Nothing auto-advances.** Step E records human decisions in files; it never machine-advances.
|
|
82
82
|
|
|
83
83
|
## Reference
|
|
84
84
|
- The build ledger + story-state rules: `references/ship-and-record.md`.
|
|
85
|
-
- The escalation reused: `../
|
|
86
|
-
- The gates that must pass first: `../
|
|
85
|
+
- The escalation reused: `../yad-review-gate/SKILL.md`; the routing helper: `../yad-pr-template/`.
|
|
86
|
+
- The gates that must pass first: `../yad-checks/references/check-gates.md`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Ship — the build ledger and the story state
|
|
2
2
|
|
|
3
|
-
Step E (`
|
|
3
|
+
Step E (`yad-ship`) closes the build half: AI review (advisory) → engineer review (the human gate) →
|
|
4
4
|
ship. Shipping records the merge and updates the story state so the whole chain is traceable.
|
|
5
5
|
|
|
6
6
|
## Two sets of eyes
|
|
@@ -10,7 +10,7 @@ ship. Shipping records the merge and updates the story state so the whole chain
|
|
|
10
10
|
gate. Where CodeRabbit can't run (no remote), an equivalent AI first-pass is run by hand and its
|
|
11
11
|
notes captured.
|
|
12
12
|
2. **Engineer review (the authority).** A human reads the diff against the spec and the acceptance
|
|
13
|
-
criteria and records an approval. The rule is `
|
|
13
|
+
criteria and records an approval. The rule is `yad-review-gate`'s:
|
|
14
14
|
- **base:** at least one `owner` AND one distinct `reviewer`.
|
|
15
15
|
- **escalated:** when the PR's Impact & Risk is `high`, or it touches contract/auth/payments — base
|
|
16
16
|
PLUS one `domain-owner` per touched domain (exactly what `risk-route.sh` prints).
|
|
@@ -64,4 +64,4 @@ trailer → story → epic).
|
|
|
64
64
|
2. The **AI review** has run (advisory; findings surfaced to the engineer).
|
|
65
65
|
3. The **engineer review** rule is satisfied (base or escalated per the Impact & Risk block).
|
|
66
66
|
|
|
67
|
-
Only then does the human merge and `
|
|
67
|
+
Only then does the human merge and `yad-ship` record it. Nothing auto-advances.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# CodeRabbit — AI first-pass review (Phase 3 build plan §E).
|
|
2
2
|
# Advisory only: a second set of eyes that COMMENTS on every PR. It never approves or merges — the
|
|
3
|
-
# human engineer review (
|
|
3
|
+
# human engineer review (yad-review-gate discipline) owns that decision. See skills/yad-ship.
|
|
4
4
|
language: en
|
|
5
5
|
reviews:
|
|
6
6
|
request_changes_workflow: false # never block the merge — the engineer review is the gate
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: yad-spec
|
|
3
3
|
description: 'Build-half Step A of the gated SDLC. 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 own layout. Drives /speckit.* as harness slash-commands when installed; authors the same files by hand and records speckit: not-installed when absent. References the locked contract — never re-invents the surface. Writes link.md back to the story. Never auto-advances. Use when the user says "spec story <id> in <repo>" or after a story is ready-for-build.'
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -7,16 +7,16 @@ description: 'Build-half Step A of the gated SDLC. For one ready-for-build story
|
|
|
7
7
|
|
|
8
8
|
**Goal:** Turn ONE `ready-for-build` story into a per-repo Spec Kit spec/plan/tasks inside that
|
|
9
9
|
story's code repo. The heavy spec ceremony runs **once per story per repo**; the light
|
|
10
|
-
tasks → implement loop is **Step B** (`
|
|
10
|
+
tasks → implement loop is **Step B** (`yad-implement`). This step **never re-locks the contract** —
|
|
11
11
|
the cross-repo surface is owned upstream by the architecture gate (build plan §A, Cross-cutting
|
|
12
12
|
"Heavy spec once per story, light loop per task"). It does not advance the front-half state machine;
|
|
13
|
-
when driven by the orchestrator (`
|
|
13
|
+
when driven by the orchestrator (`yad-run`, Phase 4) it records a `spec`/`tasks` trust signal
|
|
14
14
|
(Step 8) — but it never auto-advances a contract change or a front state.
|
|
15
15
|
|
|
16
16
|
Spec Kit is driven as **harness slash-commands** (`/speckit.*`), not a subprocess CLI (Phase 0
|
|
17
17
|
Deviation 3). When Spec Kit is not installed, the same files are hand-authored in Spec Kit's exact
|
|
18
18
|
layout and the spec is marked `speckit: not-installed` — the workflow does not block on the tool. This
|
|
19
|
-
is the same graceful-degradation pattern `
|
|
19
|
+
is the same graceful-degradation pattern `yad-ui` uses for Impeccable.
|
|
20
20
|
|
|
21
21
|
## Conventions
|
|
22
22
|
|
|
@@ -45,7 +45,7 @@ is the same graceful-degradation pattern `sdlc-author-ui` uses for Impeccable.
|
|
|
45
45
|
Read `{project-root}/epics/<epic>/.sdlc/state.json`. Proceed only when
|
|
46
46
|
`currentStep == "ready-for-build"` (the whole front half is `done`). Read the story file
|
|
47
47
|
`epics/<epic>/stories/<story>.md`; confirm `repo` is in its `repos`. If the epic is not ready, STOP
|
|
48
|
-
and point the user at `
|
|
48
|
+
and point the user at `yad-status`. **Do not mutate front-half state** — `ready-for-build` semantics
|
|
49
49
|
stay intact.
|
|
50
50
|
|
|
51
51
|
### Step 2 — Resolve the target code repo
|
|
@@ -87,21 +87,21 @@ spec folder is the authoritative record that this story's spec exists.
|
|
|
87
87
|
|
|
88
88
|
### Step 7 — Stop (front-half state untouched)
|
|
89
89
|
Report: the spec folder path, the files written, whether Spec Kit was used, the task count from
|
|
90
|
-
`tasks.md`, and that the next action is **Step B — `
|
|
90
|
+
`tasks.md`, and that the next action is **Step B — `yad-implement`**. Do **not** edit the epic's
|
|
91
91
|
`state.json`, `approvals.json`, or `contract-lock.json`. Step A is a generation step, not a front gate.
|
|
92
92
|
|
|
93
93
|
### Step 8 — Record the `spec` trust signal (Phase 4b)
|
|
94
|
-
When this step runs under the orchestrator (`
|
|
94
|
+
When this step runs under the orchestrator (`yad-run`), the generated spec is a back-half run that the
|
|
95
95
|
trust log measures (it is the evidence that could later earn the `spec` step a `machine_advance`). The
|
|
96
96
|
verdict is **anchored to the human who accepts the spec**, never self-graded:
|
|
97
97
|
- the human approves the generated `specs/<story>/` untouched → `approved-unchanged`;
|
|
98
98
|
- the human edits the spec/plan/tasks before accepting → `approved-with-edits` (signal
|
|
99
99
|
`human_edited_spec: true`);
|
|
100
100
|
- the spec is rejected or the ceremony re-run → `rejected`.
|
|
101
|
-
`
|
|
102
|
-
pattern as the engineer review finalizing `implement` at `
|
|
101
|
+
`yad-run` records a provisional entry when the spec is generated; this acceptance finalizes it (same
|
|
102
|
+
pattern as the engineer review finalizing `implement` at `yad-ship`). Append the finalized entry to
|
|
103
103
|
`epics/<epic>/.sdlc/trust-log.json` (schema:
|
|
104
|
-
`../
|
|
104
|
+
`../yad-epic/references/state-schema.md`). **Run standalone, no trust entry is written** — the
|
|
105
105
|
log measures orchestrated runs. `spec` stays `human_approve` until its slice clears the threshold;
|
|
106
106
|
this step only *gathers* the evidence, it does not flip the dial.
|
|
107
107
|
|
|
@@ -115,5 +115,5 @@ this step only *gathers* the evidence, it does not flip the dial.
|
|
|
115
115
|
|
|
116
116
|
## Reference
|
|
117
117
|
- Command list, output map, degradation rules, link.md template: `references/spec-handoff.md`.
|
|
118
|
-
- Contract surface format + hash recipe: `../
|
|
118
|
+
- Contract surface format + hash recipe: `../yad-architecture/references/contract-format.md`.
|
|
119
119
|
- Spec Kit facts and the slash-command-vs-CLI deviation: `RESEARCH-NOTES.md` §2 + Phase 3 decisions + Deviation 3.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Spec Kit handoff — command list, output map, and degradation rules
|
|
2
2
|
|
|
3
|
-
Step A (`
|
|
3
|
+
Step A (`yad-spec`) runs the **heavy Spec Kit ceremony once per story per repo** and writes the
|
|
4
4
|
result into the story's code repo. This reference pins the exact commands, the files they produce, and
|
|
5
5
|
how to hand-author the same files faithfully when Spec Kit is not installed — so Step B
|
|
6
|
-
(`
|
|
6
|
+
(`yad-implement`, not built yet) can read them unchanged.
|
|
7
7
|
|
|
8
8
|
## The ceremony (run once, in order)
|
|
9
9
|
|