yadflow 3.18.0 → 3.19.0-next.2
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 +46 -0
- package/README.md +11 -11
- package/bin/yad.mjs +8 -8
- package/cli/artifact-status.mjs +4 -4
- package/cli/checkpoint.mjs +25 -25
- package/cli/commit.mjs +1 -1
- package/cli/companion.mjs +2 -2
- package/cli/doctor.mjs +10 -10
- package/cli/epic-state.mjs +29 -29
- package/cli/errors.mjs +1 -1
- package/cli/gate.mjs +32 -33
- package/cli/hook.mjs +4 -4
- package/cli/hubcommit.mjs +1 -1
- package/cli/ledger.mjs +3 -3
- package/cli/lib.mjs +23 -9
- package/cli/manifest.mjs +42 -21
- package/cli/migrate.mjs +54 -12
- package/cli/next.mjs +5 -5
- package/cli/openpr.mjs +8 -8
- package/cli/plan.mjs +28 -9
- package/cli/platform.mjs +1 -1
- package/cli/report.mjs +1 -1
- package/cli/review.mjs +5 -5
- package/cli/setup.mjs +22 -10
- package/cli/ship.mjs +1 -1
- package/cli/skip.mjs +1 -1
- package/cli/thread.mjs +1 -1
- package/cli/tidy.mjs +2 -2
- package/cli/update-commit.mjs +1 -1
- package/package.json +1 -1
- package/skills/sdlc/config.yaml +30 -30
- package/skills/sdlc/module-help.csv +21 -21
- package/skills/yad-analysis/SKILL.md +10 -10
- package/skills/yad-architecture/SKILL.md +10 -10
- package/skills/yad-architecture/references/contract-format.md +2 -3
- package/skills/yad-backfill/SKILL.md +5 -5
- package/skills/yad-change/SKILL.md +13 -13
- package/skills/yad-change/references/triage.md +2 -3
- package/skills/yad-checks/SKILL.md +34 -16
- package/skills/yad-checks/references/check-gates.md +63 -19
- package/skills/yad-checks/templates/checks/build-test-lint.sh +25 -7
- package/skills/yad-checks/templates/checks/epic-open.sh +1 -1
- package/skills/yad-checks/templates/checks/install-deps.sh +46 -0
- package/skills/yad-checks/templates/checks/ledger-guard.sh +41 -12
- package/skills/yad-checks/templates/checks/package-manager.sh +140 -0
- package/skills/yad-checks/templates/checks/reconcile-debt-check.sh +3 -3
- package/skills/yad-checks/templates/github/yad-checks.yml +24 -3
- package/skills/yad-checks/templates/github/yad-hub-checks.yml +2 -2
- package/skills/yad-checks/templates/github/yad-verified-commits.yml +1 -1
- package/skills/yad-checks/templates/gitlab/.gitlab-ci.yml +7 -1
- package/skills/yad-checks/templates/gitlab/yad-checks.gitlab-ci.yml +12 -3
- package/skills/yad-checks/templates/gitlab/yad-hub-checks.gitlab-ci.yml +2 -2
- package/skills/yad-checks/templates/gitlab/yad-verified-commits.gitlab-ci.yml +1 -1
- package/skills/yad-checks/templates/hooks/ledger-guard.sh +1 -1
- package/skills/yad-commit/SKILL.md +2 -2
- package/skills/yad-connect-design/SKILL.md +1 -1
- package/skills/yad-connect-docs/SKILL.md +1 -1
- package/skills/yad-connect-repos/SKILL.md +32 -15
- package/skills/yad-connect-repos/references/code-context.md +2 -2
- package/skills/yad-connect-repos/references/hub-config.md +25 -11
- package/skills/yad-connect-repos/references/repos-registry.md +3 -3
- package/skills/yad-connect-testing/SKILL.md +1 -1
- package/skills/yad-defects/SKILL.md +1 -1
- package/skills/yad-discovery/SKILL.md +6 -6
- package/skills/yad-discovery/references/discovery-schema.md +1 -1
- package/skills/yad-docs/SKILL.md +3 -3
- package/skills/yad-docs/templates/app/package-lock.json +65 -51
- package/skills/yad-docs/templates/app/package.json +1 -1
- package/skills/yad-docs-overview/SKILL.md +3 -3
- package/skills/yad-docs-overview/references/pipeline-model.md +17 -11
- package/skills/yad-engineer-review/SKILL.md +9 -9
- package/skills/yad-engineer-review/references/ship-and-record.md +8 -8
- package/skills/yad-epic/SKILL.md +15 -15
- package/skills/yad-epic/references/state-schema.md +30 -30
- package/skills/yad-hub-bridge/SKILL.md +14 -14
- package/skills/yad-hub-bridge/references/bridge.md +17 -17
- package/skills/yad-hub-bridge/references/login-roster.md +3 -3
- package/skills/yad-hub-bridge/templates/checks/hub-route.sh +1 -1
- package/skills/yad-hub-bridge/templates/gitlab/yad-gate-sync.gitlab-ci.yml +1 -1
- package/skills/yad-implement/SKILL.md +3 -3
- package/skills/yad-open-pr/SKILL.md +4 -4
- package/skills/yad-pair-review/SKILL.md +12 -12
- package/skills/yad-pair-review/references/session-state.md +3 -3
- package/skills/yad-pr-template/SKILL.md +4 -4
- package/skills/yad-pr-template/references/risk-routing.md +1 -1
- package/skills/yad-pr-template/templates/checks/pr-template.sh +18 -10
- package/skills/yad-pr-template/templates/checks/pr-title.sh +7 -7
- package/skills/yad-pr-template/templates/hub/github/pull_request_template.md +1 -1
- package/skills/yad-pr-template/templates/hub/gitlab/merge_request_templates/Default.md +1 -1
- package/skills/yad-reconcile/SKILL.md +1 -1
- package/skills/yad-report/SKILL.md +1 -1
- package/skills/yad-review-companion/SKILL.md +7 -7
- package/skills/yad-review-gate/SKILL.md +18 -18
- package/skills/yad-review-gate/references/gating.md +3 -3
- package/skills/yad-run/SKILL.md +10 -10
- package/skills/yad-run/references/run-loop.md +8 -8
- package/skills/yad-ship/SKILL.md +4 -4
- package/skills/yad-spec/SKILL.md +10 -11
- package/skills/yad-status/SKILL.md +13 -13
- package/skills/yad-stories/SKILL.md +12 -12
- package/skills/yad-stories/references/story-schema.md +3 -3
- package/skills/yad-stub/SKILL.md +3 -3
- package/skills/yad-sync-repos/SKILL.md +1 -1
- package/skills/yad-test-cases/SKILL.md +12 -13
- package/skills/yad-test-cases/references/test-cases-schema.md +1 -1
- package/skills/yad-ui/SKILL.md +10 -10
|
@@ -10,12 +10,12 @@ requirement-gathering for the whole product — under the reserved `EP-discovery
|
|
|
10
10
|
hand off to `yad-review-gate`. The output `roadmap.md` is the menu of features; each feature is later
|
|
11
11
|
taken into the normal `yad-epic` flow, which reads the roadmap for project context.
|
|
12
12
|
|
|
13
|
-
This is a **
|
|
13
|
+
This is a **Shape step**: human-authored with AI assist and **never auto-advances**. It runs **once
|
|
14
14
|
per project** and is **optional** — a team that already knows what to build can skip it and start at
|
|
15
15
|
`yad-epic`. It supports **both greenfield and brownfield**, and produces a **competitor study in both**.
|
|
16
16
|
|
|
17
17
|
This skill enforces the build plan's core rules: all state lives in files; IDs are engine-assigned
|
|
18
|
-
(the reserved `EP-discovery`, never a typed feature slug);
|
|
18
|
+
(the reserved `EP-discovery`, never a typed feature slug); Shape steps are locked to `human_approve`.
|
|
19
19
|
|
|
20
20
|
## Conventions
|
|
21
21
|
|
|
@@ -63,7 +63,7 @@ roadmap extends the real system rather than re-proposing it.
|
|
|
63
63
|
Open the discovery authoring branch `discovery/EP-discovery` per the shared procedure
|
|
64
64
|
(`../yad-epic/references/state-schema.md` → "Authoring branches"): git-safe (skip with a note if
|
|
65
65
|
`{project-root}` is not a git work tree), check out the branch if it exists, else create it from the
|
|
66
|
-
hub's default branch. Author and commit the discovery set on it. Distinct from the
|
|
66
|
+
hub's default branch. Author and commit the discovery set on it. Distinct from the verified ledger's
|
|
67
67
|
`review/EP-discovery/discovery` branch.
|
|
68
68
|
|
|
69
69
|
### Step 4 — Write the discovery set
|
|
@@ -113,7 +113,7 @@ Notes:
|
|
|
113
113
|
- Also create an empty approvals ledger `.sdlc/approvals.json` and comments ledger
|
|
114
114
|
`.sdlc/comments.json`, each containing `[]`, and the `reviews/` directory.
|
|
115
115
|
- Commit the seed on the `discovery/EP-discovery` branch, and cut `review/EP-discovery/discovery` from
|
|
116
|
-
it so the **first** review PR/MR carries the ledger to the default branch. In
|
|
116
|
+
it so the **first** review PR/MR carries the ledger to the default branch. In verified mode
|
|
117
117
|
`ledger-guard` exempts a new epic's ledger (creation, not mutation, #162); every later change to it
|
|
118
118
|
is CI's. See `../yad-epic/references/state-schema.md`, "Authoring branches".
|
|
119
119
|
|
|
@@ -121,11 +121,11 @@ Notes:
|
|
|
121
121
|
Report: the path to the discovery set, and that the next action is **review** via `yad-review-gate`
|
|
122
122
|
(base rule: owner + 1 reviewer) on the virtual artifact `discovery/`. **Never mark discovery-review
|
|
123
123
|
approved here** — only real reviewers do that through the gate. When the discovery gate passes, the
|
|
124
|
-
state moves to the `discovery-done` sentinel (not `ready-for-build` — discovery has no
|
|
124
|
+
state moves to the `discovery-done` sentinel (not `ready-for-build` — discovery has no Build); the
|
|
125
125
|
roadmap is now the input that each `yad-epic` reads (its "Step 2c — read the roadmap"). When the hub
|
|
126
126
|
has a platform, the gate opens a review PR on the hub (via `yad-hub-bridge`) and
|
|
127
127
|
`yad-review-gate action: sync` pulls platform approvals/comments into the ledger; otherwise the review
|
|
128
|
-
is recorded
|
|
128
|
+
is recorded local.
|
|
129
129
|
|
|
130
130
|
## Reference
|
|
131
131
|
- Discovery artifact templates + the 2-step state shape: `references/discovery-schema.md`.
|
|
@@ -29,7 +29,7 @@ object and the 2-step chain.
|
|
|
29
29
|
`yad gate open` / `yad gate sync` warn with the missing filenames. Write all six (in greenfield,
|
|
30
30
|
`current-state.md` is a short clean-slate note) before handing off to the gate.
|
|
31
31
|
- On approval the gate sets `currentStep: "discovery-done"` (a terminal sentinel — discovery has **no**
|
|
32
|
-
|
|
32
|
+
Build, so it never becomes `ready-for-build`).
|
|
33
33
|
- The discovery files (relative to the epic dir) the gate commits on the review branch and re-hashes at
|
|
34
34
|
merge are: `market-research.md`, `competitor-analysis.md`, `current-state.md`, `feasibility.md`,
|
|
35
35
|
`requirements.md`, `roadmap.md` (the `DISCOVERY_FILES` list).
|
package/skills/yad-docs/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yad-docs
|
|
3
|
-
description: 'Generates the per-epic interactive documentation site — a vendored React/Vite/Tailwind SPA with an animated flow canvas and role-based stakeholder doc pages — from the epic''s approved artifacts (epic, architecture, the locked contract, UI design, stories, code-context, test cases). Themes it from the design tokens, wires the docs.json base path, and drives `yad docs build/deploy` to publish to Pages (or build-only when no target). This is an OUTPUT ENRICHMENT, never a gated
|
|
3
|
+
description: 'Generates the per-epic interactive documentation site — a vendored React/Vite/Tailwind SPA with an animated flow canvas and role-based stakeholder doc pages — from the epic''s approved artifacts (epic, architecture, the locked contract, UI design, stories, code-context, test cases). Themes it from the design tokens, wires the docs.json base path, and drives `yad docs build/deploy` to publish to Pages (or build-only when no target). This is an OUTPUT ENRICHMENT, never a gated Shape step: it never mutates state.json steps, approvals, or the contract lock. Use when the user says "generate the docs site", "build the interactive docs", or "deploy the epic docs".'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# SDLC — Author the Interactive Docs Site (per-epic, output enrichment)
|
|
@@ -12,7 +12,7 @@ stakeholder doc pages** (each lens → a set of doc sections). The shell is gene
|
|
|
12
12
|
generated entirely into `src/data/*.ts` and the theme into `src/index.css`.
|
|
13
13
|
|
|
14
14
|
This is an **output enrichment**, exactly like `design-links.json` / `test-links.json` — **NOT a gated
|
|
15
|
-
|
|
15
|
+
Shape step.** It **never** mutates `.sdlc/state.json` `steps[]`, `approvals.json`, or
|
|
16
16
|
`contract-lock.json`, and it never adds a `state.json` step. It reads the *approved* shape and renders
|
|
17
17
|
it; it never decides approval. When a docs target is connected (`yad-connect-docs` → `.sdlc/docs.json`)
|
|
18
18
|
the site is built + deployed; when none is, it is npm-built to a local `dist/` (build-only).
|
|
@@ -152,7 +152,7 @@ the default-theme degrade), the **deploy URL** or "build-only", and the **stalen
|
|
|
152
152
|
- The connected docs target + base-path resolution: `../yad-connect-docs/SKILL.md`.
|
|
153
153
|
- The design tokens this themes from: `../yad-connect-design/SKILL.md`.
|
|
154
154
|
- The code-context the data enriches: `../yad-connect-repos/SKILL.md`.
|
|
155
|
-
- The authoring pattern (
|
|
155
|
+
- The authoring pattern (Shape step author that writes link artifacts without gating):
|
|
156
156
|
`../yad-ui/SKILL.md`.
|
|
157
157
|
- State schema + the "Authoring branches" procedure: `../yad-epic/references/state-schema.md`.
|
|
158
158
|
- The project overview site + the staleness/CI reconciler: `../yad-docs-overview/SKILL.md`,
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"framer-motion": "^12.34.4",
|
|
12
12
|
"react": "^19.2.0",
|
|
13
13
|
"react-dom": "^19.2.0",
|
|
14
|
-
"react-router-dom": "^7.18.
|
|
14
|
+
"react-router-dom": "^7.18.2",
|
|
15
15
|
"zustand": "^5.0.11"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
@@ -505,29 +505,43 @@
|
|
|
505
505
|
}
|
|
506
506
|
},
|
|
507
507
|
"node_modules/@humanfs/core": {
|
|
508
|
-
"version": "0.19.
|
|
509
|
-
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.
|
|
510
|
-
"integrity": "sha512-
|
|
508
|
+
"version": "0.19.2",
|
|
509
|
+
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
|
|
510
|
+
"integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
|
|
511
511
|
"dev": true,
|
|
512
512
|
"license": "Apache-2.0",
|
|
513
|
+
"dependencies": {
|
|
514
|
+
"@humanfs/types": "^0.15.0"
|
|
515
|
+
},
|
|
513
516
|
"engines": {
|
|
514
517
|
"node": ">=18.18.0"
|
|
515
518
|
}
|
|
516
519
|
},
|
|
517
520
|
"node_modules/@humanfs/node": {
|
|
518
|
-
"version": "0.16.
|
|
519
|
-
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.
|
|
520
|
-
"integrity": "sha512
|
|
521
|
+
"version": "0.16.8",
|
|
522
|
+
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
|
|
523
|
+
"integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
|
|
521
524
|
"dev": true,
|
|
522
525
|
"license": "Apache-2.0",
|
|
523
526
|
"dependencies": {
|
|
524
|
-
"@humanfs/core": "^0.19.
|
|
527
|
+
"@humanfs/core": "^0.19.2",
|
|
528
|
+
"@humanfs/types": "^0.15.0",
|
|
525
529
|
"@humanwhocodes/retry": "^0.4.0"
|
|
526
530
|
},
|
|
527
531
|
"engines": {
|
|
528
532
|
"node": ">=18.18.0"
|
|
529
533
|
}
|
|
530
534
|
},
|
|
535
|
+
"node_modules/@humanfs/types": {
|
|
536
|
+
"version": "0.15.0",
|
|
537
|
+
"resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
|
|
538
|
+
"integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
|
|
539
|
+
"dev": true,
|
|
540
|
+
"license": "Apache-2.0",
|
|
541
|
+
"engines": {
|
|
542
|
+
"node": ">=18.18.0"
|
|
543
|
+
}
|
|
544
|
+
},
|
|
531
545
|
"node_modules/@humanwhocodes/module-importer": {
|
|
532
546
|
"version": "1.0.1",
|
|
533
547
|
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
|
|
@@ -1470,9 +1484,9 @@
|
|
|
1470
1484
|
}
|
|
1471
1485
|
},
|
|
1472
1486
|
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
|
|
1473
|
-
"version": "5.0.
|
|
1474
|
-
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.
|
|
1475
|
-
"integrity": "sha512-
|
|
1487
|
+
"version": "5.0.9",
|
|
1488
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz",
|
|
1489
|
+
"integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
|
|
1476
1490
|
"dev": true,
|
|
1477
1491
|
"license": "MIT",
|
|
1478
1492
|
"dependencies": {
|
|
@@ -1658,9 +1672,9 @@
|
|
|
1658
1672
|
"license": "MIT"
|
|
1659
1673
|
},
|
|
1660
1674
|
"node_modules/baseline-browser-mapping": {
|
|
1661
|
-
"version": "2.
|
|
1662
|
-
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.
|
|
1663
|
-
"integrity": "sha512-
|
|
1675
|
+
"version": "2.11.21",
|
|
1676
|
+
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz",
|
|
1677
|
+
"integrity": "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==",
|
|
1664
1678
|
"dev": true,
|
|
1665
1679
|
"license": "Apache-2.0",
|
|
1666
1680
|
"bin": {
|
|
@@ -1671,9 +1685,9 @@
|
|
|
1671
1685
|
}
|
|
1672
1686
|
},
|
|
1673
1687
|
"node_modules/brace-expansion": {
|
|
1674
|
-
"version": "1.1.
|
|
1675
|
-
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.
|
|
1676
|
-
"integrity": "sha512-
|
|
1688
|
+
"version": "1.1.18",
|
|
1689
|
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz",
|
|
1690
|
+
"integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==",
|
|
1677
1691
|
"dev": true,
|
|
1678
1692
|
"license": "MIT",
|
|
1679
1693
|
"dependencies": {
|
|
@@ -1682,9 +1696,9 @@
|
|
|
1682
1696
|
}
|
|
1683
1697
|
},
|
|
1684
1698
|
"node_modules/browserslist": {
|
|
1685
|
-
"version": "4.28.
|
|
1686
|
-
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.
|
|
1687
|
-
"integrity": "sha512-
|
|
1699
|
+
"version": "4.28.9",
|
|
1700
|
+
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz",
|
|
1701
|
+
"integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==",
|
|
1688
1702
|
"dev": true,
|
|
1689
1703
|
"funding": [
|
|
1690
1704
|
{
|
|
@@ -1702,11 +1716,11 @@
|
|
|
1702
1716
|
],
|
|
1703
1717
|
"license": "MIT",
|
|
1704
1718
|
"dependencies": {
|
|
1705
|
-
"baseline-browser-mapping": "^2.
|
|
1706
|
-
"caniuse-lite": "^1.0.
|
|
1707
|
-
"electron-to-chromium": "^1.5.
|
|
1708
|
-
"node-releases": "^2.0.
|
|
1709
|
-
"update-browserslist-db": "^1.2
|
|
1719
|
+
"baseline-browser-mapping": "^2.11.20",
|
|
1720
|
+
"caniuse-lite": "^1.0.30001810",
|
|
1721
|
+
"electron-to-chromium": "^1.5.420",
|
|
1722
|
+
"node-releases": "^2.0.54",
|
|
1723
|
+
"update-browserslist-db": "^1.3.2"
|
|
1710
1724
|
},
|
|
1711
1725
|
"bin": {
|
|
1712
1726
|
"browserslist": "cli.js"
|
|
@@ -1726,9 +1740,9 @@
|
|
|
1726
1740
|
}
|
|
1727
1741
|
},
|
|
1728
1742
|
"node_modules/caniuse-lite": {
|
|
1729
|
-
"version": "1.0.
|
|
1730
|
-
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.
|
|
1731
|
-
"integrity": "sha512-
|
|
1743
|
+
"version": "1.0.30001810",
|
|
1744
|
+
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
|
|
1745
|
+
"integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
|
|
1732
1746
|
"dev": true,
|
|
1733
1747
|
"funding": [
|
|
1734
1748
|
{
|
|
@@ -1868,9 +1882,9 @@
|
|
|
1868
1882
|
}
|
|
1869
1883
|
},
|
|
1870
1884
|
"node_modules/electron-to-chromium": {
|
|
1871
|
-
"version": "1.5.
|
|
1872
|
-
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.
|
|
1873
|
-
"integrity": "sha512-
|
|
1885
|
+
"version": "1.5.422",
|
|
1886
|
+
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.422.tgz",
|
|
1887
|
+
"integrity": "sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA==",
|
|
1874
1888
|
"dev": true,
|
|
1875
1889
|
"license": "ISC"
|
|
1876
1890
|
},
|
|
@@ -2815,9 +2829,9 @@
|
|
|
2815
2829
|
"license": "MIT"
|
|
2816
2830
|
},
|
|
2817
2831
|
"node_modules/nanoid": {
|
|
2818
|
-
"version": "3.3.
|
|
2819
|
-
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.
|
|
2820
|
-
"integrity": "sha512-
|
|
2832
|
+
"version": "3.3.18",
|
|
2833
|
+
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
|
|
2834
|
+
"integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
|
|
2821
2835
|
"dev": true,
|
|
2822
2836
|
"funding": [
|
|
2823
2837
|
{
|
|
@@ -2841,9 +2855,9 @@
|
|
|
2841
2855
|
"license": "MIT"
|
|
2842
2856
|
},
|
|
2843
2857
|
"node_modules/node-releases": {
|
|
2844
|
-
"version": "2.0.
|
|
2845
|
-
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.
|
|
2846
|
-
"integrity": "sha512-
|
|
2858
|
+
"version": "2.0.54",
|
|
2859
|
+
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz",
|
|
2860
|
+
"integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==",
|
|
2847
2861
|
"dev": true,
|
|
2848
2862
|
"license": "MIT",
|
|
2849
2863
|
"engines": {
|
|
@@ -2954,9 +2968,9 @@
|
|
|
2954
2968
|
}
|
|
2955
2969
|
},
|
|
2956
2970
|
"node_modules/postcss": {
|
|
2957
|
-
"version": "8.5.
|
|
2958
|
-
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.
|
|
2959
|
-
"integrity": "sha512-
|
|
2971
|
+
"version": "8.5.28",
|
|
2972
|
+
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
|
|
2973
|
+
"integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
|
|
2960
2974
|
"dev": true,
|
|
2961
2975
|
"funding": [
|
|
2962
2976
|
{
|
|
@@ -2974,7 +2988,7 @@
|
|
|
2974
2988
|
],
|
|
2975
2989
|
"license": "MIT",
|
|
2976
2990
|
"dependencies": {
|
|
2977
|
-
"nanoid": "^3.3.
|
|
2991
|
+
"nanoid": "^3.3.18",
|
|
2978
2992
|
"picocolors": "^1.1.1",
|
|
2979
2993
|
"source-map-js": "^1.2.1"
|
|
2980
2994
|
},
|
|
@@ -3034,9 +3048,9 @@
|
|
|
3034
3048
|
}
|
|
3035
3049
|
},
|
|
3036
3050
|
"node_modules/react-router": {
|
|
3037
|
-
"version": "7.18.
|
|
3038
|
-
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.
|
|
3039
|
-
"integrity": "sha512-
|
|
3051
|
+
"version": "7.18.3",
|
|
3052
|
+
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.3.tgz",
|
|
3053
|
+
"integrity": "sha512-gyXgtdr5uACJ5b1Q4udzjVV+tb/rlHIMJKuJ0e89R4Kzgz47z/rgP0dIKxktqIEUhDHluGTPJJH/wRha7CyqsA==",
|
|
3040
3054
|
"license": "MIT",
|
|
3041
3055
|
"dependencies": {
|
|
3042
3056
|
"cookie": "^1.0.1",
|
|
@@ -3056,12 +3070,12 @@
|
|
|
3056
3070
|
}
|
|
3057
3071
|
},
|
|
3058
3072
|
"node_modules/react-router-dom": {
|
|
3059
|
-
"version": "7.18.
|
|
3060
|
-
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.
|
|
3061
|
-
"integrity": "sha512-
|
|
3073
|
+
"version": "7.18.3",
|
|
3074
|
+
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.3.tgz",
|
|
3075
|
+
"integrity": "sha512-ytVbyBBM7vMfRCam25r0WMhSVSom909A8p+8m0/f1w853dz/xfFu6etAT2SEbVoSnI+ZoPRDqIsQXVT89gp7kg==",
|
|
3062
3076
|
"license": "MIT",
|
|
3063
3077
|
"dependencies": {
|
|
3064
|
-
"react-router": "7.18.
|
|
3078
|
+
"react-router": "7.18.3"
|
|
3065
3079
|
},
|
|
3066
3080
|
"engines": {
|
|
3067
3081
|
"node": ">=20.0.0"
|
|
@@ -3319,9 +3333,9 @@
|
|
|
3319
3333
|
"license": "MIT"
|
|
3320
3334
|
},
|
|
3321
3335
|
"node_modules/update-browserslist-db": {
|
|
3322
|
-
"version": "1.2
|
|
3323
|
-
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.
|
|
3324
|
-
"integrity": "sha512-
|
|
3336
|
+
"version": "1.3.2",
|
|
3337
|
+
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz",
|
|
3338
|
+
"integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==",
|
|
3325
3339
|
"dev": true,
|
|
3326
3340
|
"funding": [
|
|
3327
3341
|
{
|
|
@@ -7,7 +7,7 @@ description: 'Generates the project-level SDLC-overview interactive site — the
|
|
|
7
7
|
|
|
8
8
|
**Goal:** Render the **whole yadflow pipeline** — every stage from setup → ship — as an interactive site,
|
|
9
9
|
reusing the same shell as the per-epic docs (`skills/yad-docs/templates/app/`). Where `yad-docs`
|
|
10
|
-
animates one epic's flows, this animates the **workflow itself**: the
|
|
10
|
+
animates one epic's flows, this animates the **workflow itself**: the Shape gates, Build, the
|
|
11
11
|
automation dial, the setup connectors. The hand-maintained overview report stays the **main
|
|
12
12
|
documentation at the Pages root** (`<base>/`, served from `public/report.html` and `public/index.html`);
|
|
13
13
|
this interactive SPA mounts under `<base>/app/` and is reached from the report — the report links
|
|
@@ -39,7 +39,7 @@ It only reads the pipeline definition and writes a project-level site. When a do
|
|
|
39
39
|
There is no epic; the inputs are the workflow's own config + manifest (full mapping in
|
|
40
40
|
`references/pipeline-model.md`):
|
|
41
41
|
|
|
42
|
-
- `skills/sdlc/config.yaml` — the
|
|
42
|
+
- `skills/sdlc/config.yaml` — the Shape/Build steps, the **two dials** (assistance, automation),
|
|
43
43
|
defaults, the review-gate rule, the build conventions, the automation/trust thresholds.
|
|
44
44
|
- `skills/sdlc/module-help.csv` — the **canonical skill manifest**: each skill's `phase`,
|
|
45
45
|
`preceded-by` / `followed-by`, and `outputs`. This is the ordering source of truth.
|
|
@@ -56,7 +56,7 @@ git work tree). Generate and commit on it.
|
|
|
56
56
|
Map the pipeline onto the same data structures `yad-docs` uses (concrete mapping in
|
|
57
57
|
`references/pipeline-model.md`):
|
|
58
58
|
|
|
59
|
-
- **Flow paths** = the **phases** — `Setup`, `Front-zero` (discovery), `
|
|
59
|
+
- **Flow paths** = the **phases** — `Setup`, `Front-zero` (discovery), `Shape`, `Build`, `Automation`, `Change management` (feature threads).
|
|
60
60
|
- **Flow steps** = the **skills/gates in order** (from `module-help.csv` `preceded-by`/`followed-by`),
|
|
61
61
|
each step's `messages` = the skill's `outputs`, and `sideEffects` = the `.sdlc/` files it writes.
|
|
62
62
|
- **System components** = the **durable state objects** — the product hub, each `.sdlc/*.json`
|
|
@@ -10,7 +10,7 @@ ordering source of truth is `skills/sdlc/module-help.csv` (`phase`, `preceded-by
|
|
|
10
10
|
|
|
11
11
|
| Shell primitive | Overview meaning |
|
|
12
12
|
|-----------------|------------------|
|
|
13
|
-
| `FlowPath` (`paths.ts`) | a **phase**: Setup, Front-zero (discovery),
|
|
13
|
+
| `FlowPath` (`paths.ts`) | a **phase**: Setup, Front-zero (discovery), Shape, Build, Automation, Change management (feature threads). |
|
|
14
14
|
| `FlowStep` (within a path) | a **skill or gate** in order; `messages` = its `outputs`; `sideEffects` = the `.sdlc/` files it writes; `status`/`bookingStatus` annotate gated vs. enrichment vs. earned. |
|
|
15
15
|
| `SystemComponent` (`components.ts`) | a **durable state object** (the hub, each `.sdlc/*.json`, code repos, the design/testing/learning tools, the platform). |
|
|
16
16
|
| `RoleConfig` (`roles.ts`) | a **lens** → its relevant sections + paths. |
|
|
@@ -35,7 +35,7 @@ and never gates.
|
|
|
35
35
|
### Path: Front-zero (`phase: 0-front`)
|
|
36
36
|
The OPTIONAL once-per-project discovery phase, modelled as the reserved "epic zero" `EP-discovery`.
|
|
37
37
|
Greenfield AND brownfield; a 2-step author→review chain whose review binds to the whole artifact set
|
|
38
|
-
and terminates at `discovery-done` (no
|
|
38
|
+
and terminates at `discovery-done` (no Build).
|
|
39
39
|
|
|
40
40
|
| Step (skill) | Gate | Outputs / sideEffects |
|
|
41
41
|
|--------------|------|------------------------|
|
|
@@ -44,7 +44,13 @@ and terminates at `discovery-done` (no build half).
|
|
|
44
44
|
`roadmap.md` is the menu of features each `yad-epic` reads (Step 2c) — reference-only, never
|
|
45
45
|
auto-seeds epics.
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
<!-- `1-front` and `3-build` are DATA — the `phase` column in skills/sdlc/module-help.csv, which
|
|
48
|
+
the overview build reads. The Shape/Build/Run rename deliberately left them alone: change-safety
|
|
49
|
+
rule 3 says a release may add but never rename, so a stored value moves in a major with a
|
|
50
|
+
migration, not in a wording sweep. The display names below are the new vocabulary; the ids are
|
|
51
|
+
the old one, on purpose. -->
|
|
52
|
+
|
|
53
|
+
### Path: Shape (`phase: 1-front`)
|
|
48
54
|
The gated authoring chain + the reusable review gate (10 steps, or 12 with the optional analysis).
|
|
49
55
|
|
|
50
56
|
| Step (skill) | Gate | Outputs / sideEffects |
|
|
@@ -59,7 +65,7 @@ The gated authoring chain + the reusable review gate (10 steps, or 12 with the o
|
|
|
59
65
|
| `yad-review-companion` | the fun/visible review layer (trailer/cards/chat + engagement) | `approvals.json` `engagement`, platform trailer/cards |
|
|
60
66
|
| `yad-hub-bridge` | the platform PR/MR bridge | `hub-prs.json` |
|
|
61
67
|
|
|
62
|
-
### Path: Build
|
|
68
|
+
### Path: Build (`phase: 3-build`)
|
|
63
69
|
Per-story, per-repo: `spec → tasks → implement → checks → engineer-review`, plus the commit/PR helpers.
|
|
64
70
|
|
|
65
71
|
| Step (skill) | Outputs / sideEffects |
|
|
@@ -78,7 +84,7 @@ node classes from the diagram.
|
|
|
78
84
|
|
|
79
85
|
| Step (skill) | Outputs / sideEffects |
|
|
80
86
|
|--------------|------------------------|
|
|
81
|
-
| `yad-run` | drives the
|
|
87
|
+
| `yad-run` | drives the Build loop; `build-state/<story>.json`, `trust-log.json`, kill switch |
|
|
82
88
|
| `yad-learn` | tutoring; `learning-records.json` (LOCAL-ONLY, gitignored) |
|
|
83
89
|
| `yad-status` | read-only view (no writes) |
|
|
84
90
|
| `yad-docs` / `yad-docs-overview` / `yad-docs-sync` | the docs sites + their `docs-build.json` manifests |
|
|
@@ -86,9 +92,9 @@ node classes from the diagram.
|
|
|
86
92
|
### Path: Change management — feature threads (`phase: 6-change`)
|
|
87
93
|
The post-lock evolution layer. Once an epic is **sealed** (all stories shipped), behaviour can no longer
|
|
88
94
|
be mutated in place — a change request becomes a **new epic threaded to its parent** (genesis → change →
|
|
89
|
-
defect), inheriting unchanged
|
|
95
|
+
defect), inheriting unchanged Shape artifacts **by reference** and re-authoring only what changes, so
|
|
90
96
|
locked artifacts are never mutated and never go stale, only superseded. Three CI gates enforce the thread
|
|
91
|
-
(`lineage-check`, `epic-open`, `reconcile-debt`). This path never gates the
|
|
97
|
+
(`lineage-check`, `epic-open`, `reconcile-debt`). This path never gates the Shape chain; `yad-change` is
|
|
92
98
|
the intake, then it hands off to the normal authoring skills + the review gate.
|
|
93
99
|
|
|
94
100
|
| Step (skill) | Outputs / sideEffects |
|
|
@@ -99,7 +105,7 @@ the intake, then it hands off to the normal authoring skills + the review gate.
|
|
|
99
105
|
| `yad-reconcile` | advisory drift / orphan / debt sweep (read-only; mirrors `yad-docs-sync`) |
|
|
100
106
|
|
|
101
107
|
CLI: `yad thread [<epic>]` prints a thread + its resolved current truth + open debt; `yad reconcile`
|
|
102
|
-
runs the sweep. The three thread gates ride in the
|
|
108
|
+
runs the sweep. The three thread gates ride in the Build `yad-checks` set above.
|
|
103
109
|
|
|
104
110
|
## System components = the durable state objects
|
|
105
111
|
|
|
@@ -121,11 +127,11 @@ The eight yadflow lenses, each to its relevant phase sections + paths:
|
|
|
121
127
|
|
|
122
128
|
| Lens | Relevant phases / sections |
|
|
123
129
|
|------|----------------------------|
|
|
124
|
-
| analyst | Setup intent, project discovery (front-zero), analysis step,
|
|
125
|
-
| pm | project discovery (market/feasibility/roadmap), epic, stories; the
|
|
130
|
+
| analyst | Setup intent, project discovery (front-zero), analysis step, Shape discovery |
|
|
131
|
+
| pm | project discovery (market/feasibility/roadmap), epic, stories; the Shape gates |
|
|
126
132
|
| architect | architecture + the locked contract; escalation |
|
|
127
133
|
| ux | UI design, design tool connection, the design system |
|
|
128
|
-
| dev |
|
|
134
|
+
| dev | Build: spec → implement, the per-repo loop |
|
|
129
135
|
| tester | test-cases (parallel track), the testing tool, checks |
|
|
130
136
|
| reviewer | the review gate, comments, the hub bridge |
|
|
131
137
|
| engineer | engineer review + ship, the merge gate, automation dial/trust |
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yad-engineer-review
|
|
3
|
-
description: 'Build
|
|
3
|
+
description: 'Build Step E of the gated SDLC — AI review, engineer review, then merge. Wire an advisory AI first-pass (CodeRabbit) on the PR/MR; record the human engineer review with the same human_approve discipline as the Shape 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 "record the engineer review", "merge this task", or "wire the AI review". (To commit + open the PR/MR, use yad-ship.)'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# SDLC — Engineer Review & Merge (
|
|
6
|
+
# SDLC — Engineer Review & Merge (Build Step E)
|
|
7
7
|
|
|
8
8
|
**Goal:** Take a task PR/MR that has passed the **check gates** (Step C) through two sets of eyes and
|
|
9
9
|
out to production: an **AI first-pass** (advisory) and a **human engineer review** (the authority),
|
|
10
|
-
then **ship** — merge, record the ship, and update the story state. This is the last
|
|
11
|
-
(build plan §E). It is a **human gate**, the same `human_approve` discipline as the
|
|
10
|
+
then **ship** — merge, record the ship, and update the story state. This is the last Build step
|
|
11
|
+
(build plan §E). It is a **human gate**, the same `human_approve` discipline as the Shape steps:
|
|
12
12
|
**nothing auto-advances**; the engineer owns the merge.
|
|
13
13
|
|
|
14
14
|
## Conventions
|
|
@@ -66,7 +66,7 @@ approve); `yad review reconcile --epic <id> --repo <r> --pr <n>` stamps it onto
|
|
|
66
66
|
platform (mutating the ship's shard where it lives, or its folded entry if already tidied). Soft by default (both count; a bare approve draws `yad review nudge`); only gates when
|
|
67
67
|
`hub.review.requireEngagement: true`. The signal is gameable by design and sits **beside** the CI gates,
|
|
68
68
|
never above them.
|
|
69
|
-
Recording an approval does **not** ship — shipping is a separate, explicit step.
|
|
69
|
+
Recording an approval does **not** ship — shipping is a separate, explicit step. Shape discipline:
|
|
70
70
|
the gate talks only through files; refuse to treat AI review as a human approval.
|
|
71
71
|
|
|
72
72
|
### Step 3 — `ship` (merge + record + update state)
|
|
@@ -94,18 +94,18 @@ engineer-review rule is satisfied (Step 2). Then:
|
|
|
94
94
|
a rejected one is `rejected`. This is the evidence that later earns a step its `machine_advance`
|
|
95
95
|
(it never weakens the merge gate — the engineer still owns the merge).
|
|
96
96
|
- **Commit the machine-written ledgers.** Run `yad checkpoint --push` from `{project-root}` to commit
|
|
97
|
-
the
|
|
97
|
+
the Build ledgers just written (the `build-log/` shard, and the `trust-log/` shard /
|
|
98
98
|
`build-state/<story>.json` if the story ran through `yad-run`) as one `chore(hub): …` audit-trail
|
|
99
99
|
commit — default branch only, staging the shard dirs (`yad tidy up` folds finished shards later),
|
|
100
|
-
never a
|
|
100
|
+
never a Shape gate file. It is the Build analogue of the Shape `yad gate` sync. The
|
|
101
101
|
same commit also **carries the story `status:` flip** you just wrote (`approved → in-build/shipped`,
|
|
102
102
|
#112) — because that story now has a build-log ship, checkpoint stages `stories/<story>.md` alongside
|
|
103
103
|
the ledgers, so the artifact never drifts from build-log and you never fall back to a raw git-to-main
|
|
104
104
|
push. (The code-repo `tasks.md` is committed in its own repo as usual.)
|
|
105
105
|
|
|
106
106
|
### Step 4 — Stop
|
|
107
|
-
Report what shipped and the story's state. Do not advance anything else; the
|
|
108
|
-
stays as it was (`ready-for-build`).
|
|
107
|
+
Report what shipped and the story's state. Do not advance anything else; the Shape `state.json`
|
|
108
|
+
stays as it was (`ready-for-build`). Build is recorded in `build-log.json` + the story status.
|
|
109
109
|
|
|
110
110
|
## Hard rules (build plan §E, Cross-cutting)
|
|
111
111
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Ship — the build ledger and the story state
|
|
2
2
|
|
|
3
|
-
Step E (`yad-engineer-review`) closes
|
|
3
|
+
Step E (`yad-engineer-review`) closes Build: 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
|
|
@@ -59,16 +59,16 @@ without the `{ epic, ships }` wrapper):
|
|
|
59
59
|
}
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
This is the
|
|
62
|
+
This is the Build analogue of Shape's `approvals.json` — files only, no hidden state, so a
|
|
63
63
|
future service can drive ship by writing the same records. Like the trust log and build-state, it is a
|
|
64
|
-
machine-written ledger committed by **`yad checkpoint`** (the
|
|
64
|
+
machine-written ledger committed by **`yad checkpoint`** (the Build analogue of `yad gate` sync),
|
|
65
65
|
not by hand: after recording the ship, `yad checkpoint --push` lands the new `build-log/` shard as a
|
|
66
|
-
`chore(hub): …` audit-trail commit on the default branch (allowlist-scoped to the
|
|
67
|
-
never a
|
|
66
|
+
`chore(hub): …` audit-trail commit on the default branch (allowlist-scoped to the Build ledgers,
|
|
67
|
+
never a Shape gate file); `yad tidy up` folds finished shards into `build-log.json` later.
|
|
68
68
|
|
|
69
69
|
### Retroactive ship — a pre-tracking story (#142)
|
|
70
70
|
|
|
71
|
-
A story that was merged and shipped **before** the
|
|
71
|
+
A story that was merged and shipped **before** the Build ledger existed has no build-log ship, so
|
|
72
72
|
`yad checkpoint` can't carry its `status: shipped` flip (the flip is only carried when a ship backs it,
|
|
73
73
|
#112) — leaving a raw `git push origin main` as the only way to land it, against the never-raw-git
|
|
74
74
|
convention. To reconcile it through yad, record a **retroactive** ship, then checkpoint carries the flip
|
|
@@ -83,7 +83,7 @@ It writes ONE minimal ship shard marked `retroactive: true` (`task` defaults to
|
|
|
83
83
|
the normal checkpoint so the story's already-made `status:` flip rides along in the **same** commit. It
|
|
84
84
|
refuses when the story already has a ship **in that repo** (then it isn't pre-tracking there — use the
|
|
85
85
|
normal flow). It does **not** author the story frontmatter — and to keep evidence and the flip atomic (the no-drift
|
|
86
|
-
invariant), it **refuses** unless you have already set a
|
|
86
|
+
invariant), it **refuses** unless you have already set a Build `status:` (`in-build` or `shipped`) in
|
|
87
87
|
`stories/<story>.md`, so a ship shard is never committed while the artifact still says `approved`.
|
|
88
88
|
|
|
89
89
|
**Where the record lands — it is a shard, not an append to `build-log.json`.** Like every other ship, a
|
|
@@ -129,7 +129,7 @@ a bare approve draws a friendly `yad review nudge`); it only gates ship when
|
|
|
129
129
|
`hub.review.requireEngagement: true`. `yad review reconcile --epic <id> --repo <r> --pr <n>` reads the
|
|
130
130
|
code PR's approvals (with the engagement signal) and stamps them onto the matching ship record — writing
|
|
131
131
|
back into the ship's shard where it lives (or its folded entry if the story was already tidied) — the
|
|
132
|
-
|
|
132
|
+
Build **bridge**, the analogue of `yad gate sync`. The signal is gameable by design ("visible, not
|
|
133
133
|
impossible"): it makes engineer-review quality visible, it does not prove a human read the diff. It sits
|
|
134
134
|
**beside** the CI gates (build/test/lint/contract/verified-commits) — never above them; CI still
|
|
135
135
|
decides machine safety, the merge is still the human act.
|