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.
Files changed (106) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +11 -11
  3. package/bin/yad.mjs +8 -8
  4. package/cli/artifact-status.mjs +4 -4
  5. package/cli/checkpoint.mjs +25 -25
  6. package/cli/commit.mjs +1 -1
  7. package/cli/companion.mjs +2 -2
  8. package/cli/doctor.mjs +10 -10
  9. package/cli/epic-state.mjs +29 -29
  10. package/cli/errors.mjs +1 -1
  11. package/cli/gate.mjs +32 -33
  12. package/cli/hook.mjs +4 -4
  13. package/cli/hubcommit.mjs +1 -1
  14. package/cli/ledger.mjs +3 -3
  15. package/cli/lib.mjs +23 -9
  16. package/cli/manifest.mjs +42 -21
  17. package/cli/migrate.mjs +54 -12
  18. package/cli/next.mjs +5 -5
  19. package/cli/openpr.mjs +8 -8
  20. package/cli/plan.mjs +28 -9
  21. package/cli/platform.mjs +1 -1
  22. package/cli/report.mjs +1 -1
  23. package/cli/review.mjs +5 -5
  24. package/cli/setup.mjs +22 -10
  25. package/cli/ship.mjs +1 -1
  26. package/cli/skip.mjs +1 -1
  27. package/cli/thread.mjs +1 -1
  28. package/cli/tidy.mjs +2 -2
  29. package/cli/update-commit.mjs +1 -1
  30. package/package.json +1 -1
  31. package/skills/sdlc/config.yaml +30 -30
  32. package/skills/sdlc/module-help.csv +21 -21
  33. package/skills/yad-analysis/SKILL.md +10 -10
  34. package/skills/yad-architecture/SKILL.md +10 -10
  35. package/skills/yad-architecture/references/contract-format.md +2 -3
  36. package/skills/yad-backfill/SKILL.md +5 -5
  37. package/skills/yad-change/SKILL.md +13 -13
  38. package/skills/yad-change/references/triage.md +2 -3
  39. package/skills/yad-checks/SKILL.md +34 -16
  40. package/skills/yad-checks/references/check-gates.md +63 -19
  41. package/skills/yad-checks/templates/checks/build-test-lint.sh +25 -7
  42. package/skills/yad-checks/templates/checks/epic-open.sh +1 -1
  43. package/skills/yad-checks/templates/checks/install-deps.sh +46 -0
  44. package/skills/yad-checks/templates/checks/ledger-guard.sh +41 -12
  45. package/skills/yad-checks/templates/checks/package-manager.sh +140 -0
  46. package/skills/yad-checks/templates/checks/reconcile-debt-check.sh +3 -3
  47. package/skills/yad-checks/templates/github/yad-checks.yml +24 -3
  48. package/skills/yad-checks/templates/github/yad-hub-checks.yml +2 -2
  49. package/skills/yad-checks/templates/github/yad-verified-commits.yml +1 -1
  50. package/skills/yad-checks/templates/gitlab/.gitlab-ci.yml +7 -1
  51. package/skills/yad-checks/templates/gitlab/yad-checks.gitlab-ci.yml +12 -3
  52. package/skills/yad-checks/templates/gitlab/yad-hub-checks.gitlab-ci.yml +2 -2
  53. package/skills/yad-checks/templates/gitlab/yad-verified-commits.gitlab-ci.yml +1 -1
  54. package/skills/yad-checks/templates/hooks/ledger-guard.sh +1 -1
  55. package/skills/yad-commit/SKILL.md +2 -2
  56. package/skills/yad-connect-design/SKILL.md +1 -1
  57. package/skills/yad-connect-docs/SKILL.md +1 -1
  58. package/skills/yad-connect-repos/SKILL.md +32 -15
  59. package/skills/yad-connect-repos/references/code-context.md +2 -2
  60. package/skills/yad-connect-repos/references/hub-config.md +25 -11
  61. package/skills/yad-connect-repos/references/repos-registry.md +3 -3
  62. package/skills/yad-connect-testing/SKILL.md +1 -1
  63. package/skills/yad-defects/SKILL.md +1 -1
  64. package/skills/yad-discovery/SKILL.md +6 -6
  65. package/skills/yad-discovery/references/discovery-schema.md +1 -1
  66. package/skills/yad-docs/SKILL.md +3 -3
  67. package/skills/yad-docs/templates/app/package-lock.json +65 -51
  68. package/skills/yad-docs/templates/app/package.json +1 -1
  69. package/skills/yad-docs-overview/SKILL.md +3 -3
  70. package/skills/yad-docs-overview/references/pipeline-model.md +17 -11
  71. package/skills/yad-engineer-review/SKILL.md +9 -9
  72. package/skills/yad-engineer-review/references/ship-and-record.md +8 -8
  73. package/skills/yad-epic/SKILL.md +15 -15
  74. package/skills/yad-epic/references/state-schema.md +30 -30
  75. package/skills/yad-hub-bridge/SKILL.md +14 -14
  76. package/skills/yad-hub-bridge/references/bridge.md +17 -17
  77. package/skills/yad-hub-bridge/references/login-roster.md +3 -3
  78. package/skills/yad-hub-bridge/templates/checks/hub-route.sh +1 -1
  79. package/skills/yad-hub-bridge/templates/gitlab/yad-gate-sync.gitlab-ci.yml +1 -1
  80. package/skills/yad-implement/SKILL.md +3 -3
  81. package/skills/yad-open-pr/SKILL.md +4 -4
  82. package/skills/yad-pair-review/SKILL.md +12 -12
  83. package/skills/yad-pair-review/references/session-state.md +3 -3
  84. package/skills/yad-pr-template/SKILL.md +4 -4
  85. package/skills/yad-pr-template/references/risk-routing.md +1 -1
  86. package/skills/yad-pr-template/templates/checks/pr-template.sh +18 -10
  87. package/skills/yad-pr-template/templates/checks/pr-title.sh +7 -7
  88. package/skills/yad-pr-template/templates/hub/github/pull_request_template.md +1 -1
  89. package/skills/yad-pr-template/templates/hub/gitlab/merge_request_templates/Default.md +1 -1
  90. package/skills/yad-reconcile/SKILL.md +1 -1
  91. package/skills/yad-report/SKILL.md +1 -1
  92. package/skills/yad-review-companion/SKILL.md +7 -7
  93. package/skills/yad-review-gate/SKILL.md +18 -18
  94. package/skills/yad-review-gate/references/gating.md +3 -3
  95. package/skills/yad-run/SKILL.md +10 -10
  96. package/skills/yad-run/references/run-loop.md +8 -8
  97. package/skills/yad-ship/SKILL.md +4 -4
  98. package/skills/yad-spec/SKILL.md +10 -11
  99. package/skills/yad-status/SKILL.md +13 -13
  100. package/skills/yad-stories/SKILL.md +12 -12
  101. package/skills/yad-stories/references/story-schema.md +3 -3
  102. package/skills/yad-stub/SKILL.md +3 -3
  103. package/skills/yad-sync-repos/SKILL.md +1 -1
  104. package/skills/yad-test-cases/SKILL.md +12 -13
  105. package/skills/yad-test-cases/references/test-cases-schema.md +1 -1
  106. 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 **front state**: human-authored with AI assist and **never auto-advances**. It runs **once
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); front steps are locked to `human_approve`.
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 bridge's
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 bridge mode
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 build half); the
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 file-only.
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
- build half, so it never becomes `ready-for-build`).
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).
@@ -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 front state: 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".'
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
- front state.** It **never** mutates `.sdlc/state.json` `steps[]`, `approvals.json`, or
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 (front-state author that writes link artifacts without gating):
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.1",
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.1",
509
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
510
- "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
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.7",
519
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
520
- "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
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.1",
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.8",
1474
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz",
1475
- "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==",
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.10.42",
1662
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz",
1663
- "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==",
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.16",
1675
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz",
1676
- "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==",
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.5",
1686
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.5.tgz",
1687
- "integrity": "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ==",
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.10.42",
1706
- "caniuse-lite": "^1.0.30001800",
1707
- "electron-to-chromium": "^1.5.387",
1708
- "node-releases": "^2.0.50",
1709
- "update-browserslist-db": "^1.2.3"
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.30001802",
1730
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001802.tgz",
1731
- "integrity": "sha512-vmv8ub2xwTNmljSKf82mtCk5JH7hC+YgzLj3P5zotvA0tPQ9016tdNNOG8WRca1IxOnhSsivB+J0z5FeE5LOUw==",
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.388",
1872
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.388.tgz",
1873
- "integrity": "sha512-Pl/aJaqOOxYxda3vcx1IKSJimwYXHDkEnGn0F+kG2EE68dDtx2uCinaS+Vih8Z91B9t8CSAbiF/HKyWcnXjhzw==",
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.15",
2819
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz",
2820
- "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==",
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.50",
2845
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz",
2846
- "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==",
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.16",
2958
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz",
2959
- "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==",
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.12",
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.1",
3038
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.1.tgz",
3039
- "integrity": "sha512-GDLgg3i3uM0aeJO3Fm+TCS+sDQ7gu12T6x0qdTEzcwqEfleci7JwugVNIF3U//0FWKnJT7ptG+20B2jfDqnZAg==",
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.1",
3060
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.1.tgz",
3061
- "integrity": "sha512-KaZh+X/6UtEp28x51AUYZDMg9NGoz2ja3dNHa+ta/tk40vCzKhQ/RypCWBMLbmDr6//E24Vv5uPsrqXFozdkAg==",
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.1"
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.3",
3323
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
3324
- "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
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
  {
@@ -13,7 +13,7 @@
13
13
  "framer-motion": "^12.34.4",
14
14
  "react": "^19.2.0",
15
15
  "react-dom": "^19.2.0",
16
- "react-router-dom": "^7.18.1",
16
+ "react-router-dom": "^7.18.2",
17
17
  "zustand": "^5.0.11"
18
18
  },
19
19
  "devDependencies": {
@@ -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 front gates, the build half, 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 front/back steps, the **two dials** (assistance, automation),
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), `Front half`, `Build half`, `Automation`, `Change management` (feature threads).
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), Front half, Build half, Automation, Change management (feature threads). |
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 build half).
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
- ### Path: Front half (`phase: 1-front`)
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 half (`phase: 3-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 back-half loop; `build-state/<story>.json`, `trust-log.json`, kill switch |
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 front artifacts **by reference** and re-authoring only what changes, so
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 front chain; `yad-change` is
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 build-half `yad-checks` set above.
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, front-half discovery |
125
- | pm | project discovery (market/feasibility/roadmap), epic, stories; the front gates |
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 | build half: spec → implement, the per-repo loop |
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-half 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 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 "record the engineer review", "merge this task", or "wire the AI review". (To commit + open the PR/MR, use yad-ship.)'
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 (build-half Step E)
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 build-half step
11
- (build plan §E). It is a **human gate**, the same `human_approve` discipline as the front states:
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. Front-half discipline:
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 back-half ledgers just written (the `build-log/` shard, and the `trust-log/` shard /
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 front-half gate file. It is the back-half analogue of the front-half `yad gate` sync. The
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 front-half `state.json`
108
- stays as it was (`ready-for-build`). The build half is recorded in `build-log.json` + the story status.
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 the build half: AI review (advisory) → engineer review (the human gate) →
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 back-half analogue of the front half's `approvals.json` — files only, no hidden state, so a
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 back-half analogue of `yad gate` sync),
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 back-half ledgers,
67
- never a front-half gate file); `yad tidy up` folds finished shards into `build-log.json` later.
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 back-half ledger existed has no build-log ship, so
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 back-half `status:` (`in-build` or `shipped`) in
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
- back-half **bridge**, the analogue of `yad gate sync`. The signal is gameable by design ("visible, not
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.