yadflow 3.18.1 → 4.0.0-next.1

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 (156) hide show
  1. package/CHANGELOG.md +355 -0
  2. package/README.md +79 -26
  3. package/bin/commands.mjs +41 -0
  4. package/bin/yad.mjs +437 -124
  5. package/cli/artifact-status.mjs +34 -15
  6. package/cli/checkpoint.mjs +69 -49
  7. package/cli/codeowners-command.mjs +170 -0
  8. package/cli/codeowners.mjs +397 -0
  9. package/cli/commit.mjs +13 -9
  10. package/cli/companion.mjs +2 -2
  11. package/cli/dial.mjs +183 -0
  12. package/cli/docs.mjs +88 -32
  13. package/cli/doctor.mjs +1472 -97
  14. package/cli/epic-state.mjs +3478 -232
  15. package/cli/epic.mjs +506 -0
  16. package/cli/errors.mjs +4 -1
  17. package/cli/gate.mjs +1002 -209
  18. package/cli/history.mjs +556 -0
  19. package/cli/hook.mjs +266 -55
  20. package/cli/hubcommit.mjs +6 -17
  21. package/cli/index-command.mjs +87 -0
  22. package/cli/ledger.mjs +57 -7
  23. package/cli/lib.mjs +184 -18
  24. package/cli/manifest.mjs +367 -56
  25. package/cli/migrate.mjs +726 -53
  26. package/cli/mode.mjs +170 -0
  27. package/cli/next.mjs +349 -90
  28. package/cli/openpr.mjs +191 -39
  29. package/cli/people.mjs +654 -0
  30. package/cli/plan.mjs +417 -132
  31. package/cli/platform.mjs +110 -129
  32. package/cli/product-index.mjs +287 -0
  33. package/cli/protection.mjs +706 -0
  34. package/cli/reconcile.mjs +38 -12
  35. package/cli/repo-publish.mjs +24 -26
  36. package/cli/repo.mjs +23 -14
  37. package/cli/report.mjs +21 -15
  38. package/cli/review.mjs +24 -27
  39. package/cli/riskmap-command.mjs +289 -0
  40. package/cli/riskmap.mjs +373 -0
  41. package/cli/setup.mjs +139 -287
  42. package/cli/ship.mjs +7 -6
  43. package/cli/skill.mjs +180 -0
  44. package/cli/skip.mjs +211 -30
  45. package/cli/thread.mjs +42 -17
  46. package/cli/tidy.mjs +20 -20
  47. package/cli/update-commit.mjs +22 -22
  48. package/cli/usage.mjs +115 -109
  49. package/package.json +3 -3
  50. package/skills/sdlc/config.yaml +166 -87
  51. package/skills/sdlc/module-help.csv +35 -35
  52. package/skills/yad-analysis/SKILL.md +125 -65
  53. package/skills/yad-architecture/SKILL.md +34 -23
  54. package/skills/yad-architecture/references/contract-format.md +10 -8
  55. package/skills/yad-backfill/SKILL.md +14 -8
  56. package/skills/yad-backfill/references/backfill.md +1 -1
  57. package/skills/yad-change/SKILL.md +127 -52
  58. package/skills/yad-change/references/triage.md +42 -28
  59. package/skills/yad-checks/SKILL.md +89 -45
  60. package/skills/yad-checks/references/check-gates.md +315 -92
  61. package/skills/yad-checks/templates/checks/build-test-lint.sh +25 -7
  62. package/skills/yad-checks/templates/checks/commit-message.sh +17 -3
  63. package/skills/yad-checks/templates/checks/contract-check.sh +58 -2
  64. package/skills/yad-checks/templates/checks/epic-open.sh +3 -3
  65. package/skills/yad-checks/templates/checks/install-deps.sh +46 -0
  66. package/skills/yad-checks/templates/checks/ledger-guard.sh +94 -18
  67. package/skills/yad-checks/templates/checks/lineage-check.sh +23 -9
  68. package/skills/yad-checks/templates/checks/package-manager.sh +140 -0
  69. package/skills/yad-checks/templates/checks/reconcile-debt-check.sh +4 -4
  70. package/skills/yad-checks/templates/checks/risk-map-check.sh +438 -0
  71. package/skills/yad-checks/templates/checks/verified-commits.sh +20 -46
  72. package/skills/yad-checks/templates/github/yad-checks.yml +37 -5
  73. package/skills/yad-checks/templates/github/yad-hub-checks.yml +5 -5
  74. package/skills/yad-checks/templates/github/yad-update-guard.yml +3 -4
  75. package/skills/yad-checks/templates/github/yad-verified-commits.yml +4 -4
  76. package/skills/yad-checks/templates/gitlab/.gitlab-ci.yml +7 -1
  77. package/skills/yad-checks/templates/gitlab/yad-checks.gitlab-ci.yml +22 -4
  78. package/skills/yad-checks/templates/gitlab/yad-hub-checks.gitlab-ci.yml +5 -5
  79. package/skills/yad-checks/templates/gitlab/yad-verified-commits.gitlab-ci.yml +4 -4
  80. package/skills/yad-checks/templates/hooks/ledger-guard-cursor.sh +91 -0
  81. package/skills/yad-checks/templates/hooks/ledger-guard.sh +38 -7
  82. package/skills/yad-commit/SKILL.md +6 -6
  83. package/skills/yad-connect-design/SKILL.md +6 -6
  84. package/skills/yad-connect-design/references/design-context.md +1 -1
  85. package/skills/yad-connect-design/references/design-registry.md +2 -2
  86. package/skills/yad-connect-docs/SKILL.md +12 -12
  87. package/skills/yad-connect-docs/references/docs-registry.md +1 -1
  88. package/skills/yad-connect-learning/SKILL.md +5 -5
  89. package/skills/yad-connect-learning/references/learning-registry.md +2 -2
  90. package/skills/yad-connect-repos/SKILL.md +92 -54
  91. package/skills/yad-connect-repos/references/code-context.md +6 -6
  92. package/skills/yad-connect-repos/references/hub-config.md +68 -58
  93. package/skills/yad-connect-repos/references/repos-registry.md +10 -9
  94. package/skills/yad-connect-repos/references/risk-map.md +81 -0
  95. package/skills/yad-connect-testing/SKILL.md +6 -6
  96. package/skills/yad-connect-testing/references/testing-context.md +3 -4
  97. package/skills/yad-connect-testing/references/testing-registry.md +2 -2
  98. package/skills/yad-defects/SKILL.md +8 -8
  99. package/skills/yad-discovery/SKILL.md +130 -94
  100. package/skills/yad-discovery/references/discovery-schema.md +23 -7
  101. package/skills/yad-discovery/references/foundation-schema.md +374 -0
  102. package/skills/yad-docs/SKILL.md +16 -11
  103. package/skills/yad-docs/references/data-mapping.md +9 -7
  104. package/skills/yad-docs/templates/app/package-lock.json +3 -3
  105. package/skills/yad-docs-overview/SKILL.md +32 -17
  106. package/skills/yad-docs-overview/references/pipeline-model.md +47 -28
  107. package/skills/yad-docs-sync/SKILL.md +10 -5
  108. package/skills/yad-docs-sync/references/staleness.md +8 -7
  109. package/skills/yad-engineer-review/SKILL.md +88 -24
  110. package/skills/yad-engineer-review/references/ship-and-record.md +25 -16
  111. package/skills/yad-epic/SKILL.md +178 -100
  112. package/skills/yad-epic/references/state-schema.md +626 -117
  113. package/skills/yad-hub-bridge/SKILL.md +66 -48
  114. package/skills/yad-hub-bridge/references/bridge.md +110 -83
  115. package/skills/yad-hub-bridge/references/login-roster.md +163 -70
  116. package/skills/yad-hub-bridge/templates/checks/hub-route.sh +22 -19
  117. package/skills/yad-hub-bridge/templates/github/yad-gate-sync.yml +34 -14
  118. package/skills/yad-hub-bridge/templates/gitlab/gitlab-ci.include-root.yml +2 -2
  119. package/skills/yad-hub-bridge/templates/gitlab/yad-gate-sync.gitlab-ci.yml +22 -12
  120. package/skills/yad-implement/SKILL.md +29 -15
  121. package/skills/yad-implement/references/implement-conventions.md +2 -2
  122. package/skills/yad-learn/SKILL.md +9 -9
  123. package/skills/yad-learn/references/learning-state.md +2 -2
  124. package/skills/yad-open-pr/SKILL.md +64 -29
  125. package/skills/yad-pair-review/SKILL.md +18 -16
  126. package/skills/yad-pair-review/references/session-state.md +4 -4
  127. package/skills/yad-pr-template/SKILL.md +48 -27
  128. package/skills/yad-pr-template/references/risk-routing.md +97 -24
  129. package/skills/yad-pr-template/templates/checks/pr-template.sh +37 -15
  130. package/skills/yad-pr-template/templates/checks/pr-title.sh +27 -13
  131. package/skills/yad-pr-template/templates/checks/risk-route.sh +107 -14
  132. package/skills/yad-pr-template/templates/github/pull_request_template.md +7 -5
  133. package/skills/yad-pr-template/templates/gitlab/merge_request_templates/Default.md +7 -5
  134. package/skills/yad-pr-template/templates/hub/github/pull_request_template.md +15 -14
  135. package/skills/yad-pr-template/templates/hub/gitlab/merge_request_templates/Default.md +15 -13
  136. package/skills/yad-reconcile/SKILL.md +3 -3
  137. package/skills/yad-report/SKILL.md +5 -5
  138. package/skills/yad-review-companion/SKILL.md +12 -9
  139. package/skills/yad-review-gate/SKILL.md +198 -79
  140. package/skills/yad-review-gate/references/gating.md +230 -54
  141. package/skills/yad-run/SKILL.md +86 -56
  142. package/skills/yad-run/references/run-loop.md +67 -45
  143. package/skills/yad-ship/SKILL.md +18 -14
  144. package/skills/yad-spec/SKILL.md +31 -17
  145. package/skills/yad-spec/references/spec-handoff.md +17 -5
  146. package/skills/yad-status/SKILL.md +114 -56
  147. package/skills/yad-stories/SKILL.md +42 -27
  148. package/skills/yad-stories/references/story-schema.md +10 -9
  149. package/skills/yad-stub/SKILL.md +59 -48
  150. package/skills/yad-sync-repos/SKILL.md +3 -3
  151. package/skills/yad-test-cases/SKILL.md +37 -30
  152. package/skills/yad-test-cases/references/test-cases-schema.md +8 -5
  153. package/skills/yad-timeline/SKILL.md +8 -7
  154. package/skills/yad-ui/SKILL.md +46 -25
  155. package/cli/roster.mjs +0 -164
  156. package/skills/sdlc/install.sh +0 -68
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: yad-implement
3
- description: 'Build-half Step B of the gated SDLC. With the dev lens, implement ONE atomic task from a story''s Spec Kit tasks.md as a small diff (≤3 files) on its own branch in the code repo. The diff stays inside the files the task declared — flag and STOP if it would grow beyond them. Commit per convention, ending with the task ID; add Contract-Change: yes only if the diff touches the locked contract surface (which routes back to the architecture gate). The step never advances itself; it produces a committed branch and hands off to the check gates, which the orchestrator (yad-run) may auto-run once `implement` is earned to machine_advance (Phase 4b Step D) — the merge still needs the gates and the engineer review. Use when the user says "implement task <id>" or after a story is spec''d.'
3
+ description: 'Build Step B of the gated SDLC. With the dev lens, implement ONE atomic task from a story''s Spec Kit tasks.md as a small diff (≤3 files) on its own branch in the code repo. The diff stays inside the files the task declared — flag and STOP if it would grow beyond them. Commit per convention, ending with the task ID; add Contract-Change: yes only if the diff touches the locked contract surface (which routes back to the architecture gate). The step never advances itself; it produces a committed branch and hands off to the check gates, which the orchestrator (yad-run) may auto-run once the team sets `implement` to `advance: auto` (`yad dial`) — the merge still needs the gates and the engineer review. Use when the user says "implement task <id>" or after a story is spec''d.'
4
4
  ---
5
5
 
6
- # SDLC — Implement Task (build-half Step B)
6
+ # SDLC — Implement Task (Build Step B)
7
7
 
8
8
  **Goal:** Turn ONE atomic task from a story's `tasks.md` (produced by Step A `yad-spec`) into a small,
9
9
  reviewable diff on its own branch in the code repo. **One atomic task = one branch = one PR/MR**
@@ -14,7 +14,7 @@ This step **never auto-advances**. When the task is implemented and committed, c
14
14
  **check gates** (Step C — `yad-checks`: spec-link, contract-check, build/test/lint) and then human/AI
15
15
  review (Steps D–E, not built yet). Implementation here produces a branch + commit and stops.
16
16
 
17
- The implementing lens is **`dev`** (`bmad-agent-dev`, Amelia). The dev writes only what the task
17
+ The implementing lens is **`dev`**. The dev writes only what the task
18
18
  declares; it does not redesign, does not widen the contract, and does not pick up sibling tasks.
19
19
 
20
20
  ## Conventions
@@ -30,7 +30,7 @@ declares; it does not redesign, does not widen the contract, and does not pick u
30
30
  `Co-Authored-By:` for any AI tool that helped author the diff (the human author owns the commit;
31
31
  trailer order `Task:` → `Contract-Change:` → `Co-Authored-By:`). The skill installs a `.gitmessage`
32
32
  template that scaffolds these (Step 2).
33
- - Speak in the configured `communication_language`; write code/comments in `document_output_language`.
33
+ - Speak in the `communication_language` set in `{project-root}/.sdlc/config.yaml`; write code/comments in `document_output_language`.
34
34
 
35
35
  ## Inputs
36
36
 
@@ -55,7 +55,7 @@ rather than forking a second one (one task = one branch).
55
55
  **On the first implement in a repo, install the commit template** (idempotent): copy this skill's
56
56
  `templates/.gitmessage` to `<repo>/.gitmessage` and run `git -C <repo> config commit.template .gitmessage`
57
57
  so every commit is pre-scaffolded with the `Task:` trailer and the commented per-commit `Co-Authored-By:`
58
- choices (`config.yaml` `build.ai_coauthor.allowed`). Do the same at the hub root for hub commits. Skip if
58
+ choices (`config.yaml` `build.ai_coauthor.allowed`). Do the same at the Product root for Product commit. Skip if
59
59
  already configured.
60
60
 
61
61
  ### Step 3 — Read the spec inputs (do NOT re-derive the contract)
@@ -77,9 +77,14 @@ declared files are wrong is a spec bug, not an implementation decision.
77
77
 
78
78
  This stop is a **scope overrun** — a halt condition that pulls in a human regardless of any automation
79
79
  dial. When this step is driven by the orchestrator (`yad-run`, Phase 4), the stop must be legible to
80
- it: mark the `implement` step `status: blocked` in `build-state/<story>.json` and surface
81
- `scope_overrun: true` so the run records a `rejected` trust entry and halts (it never advances past a
82
- boundary breach). The same applies to the Step 5 contract-surface stop (`contract_touch: true`).
80
+ it: mark the `implement` step `status: blocked` in `build-state/<story>.json` — **with a `record`**,
81
+ `{ "reason": "scope overrun: <which file>", "by": "<login or null>", "date": "<YYYY-MM-DD>" }` — and
82
+ surface `scope_overrun: true` so the run records a `rejected` trust entry and halts (it never advances
83
+ past a boundary breach). The same applies to the Step 5 contract-surface stop (`contract_touch: true`).
84
+
85
+ The record is what makes the halt legible. Since shape 7 (E38) a `blocked` step carrying nothing
86
+ reads as `todo` — "not started" — because that is what the word meant in every file written before
87
+ shape 7. The record is the only thing that separates a lane that stopped from a lane nobody began.
83
88
 
84
89
  ### Step 5 — Contract-surface check (local pre-flight for Step C)
85
90
  Determine whether the diff touches the **locked contract surface** (the API/event/data-model shapes in
@@ -89,9 +94,18 @@ A contract change means the diff alters the agreed cross-repo shape itself.
89
94
 
90
95
  - If the diff does **not** change the surface: proceed; no `Contract-Change` trailer.
91
96
  - If the task **requires** changing the surface: **flag and STOP**. The contract is owned upstream;
92
- route back to the **architecture gate** to amend and re-lock `contract.md` first. Only then return
97
+ route back to the **architecture gate** to amend and re-lock `contract.md` first — on a route that
98
+ has one; the short lanes do not, see the bullet below. Only then return
93
99
  here, and record `Contract-Change: yes` in the commit body (the Step C contract-check will require a
94
100
  matching, already-updated contract).
101
+ - **Short-lane epics have no contract and no architecture gate.** Read
102
+ `epics/<epic>/.sdlc/state.json`'s `profile` (or, on an epic seeded before file shape 6, what its
103
+ `steps[]` contains): on `chore` and `spike` there is no `contract.md`, so
104
+ there is no surface block to compare against and **no gate to route back to**. Never write
105
+ `Contract-Change: yes` on a short-lane task: there is no lock for the check to verify it against, so
106
+ the claim cannot be true of anything. Where the Product repo is reachable the gate now FAILS it
107
+ outright; where it is not, the check defers and nothing catches it. If the task needs the shared cross-repo surface to change, **STOP and escalate
108
+ to a human**: the work belongs to a new epic on `classic`.
95
109
 
96
110
  ### Step 6 — Commit on the task branch
97
111
  Stage only the declared files. Commit with the convention: a conventional subject, a short body, and a
@@ -103,19 +117,19 @@ never on the AI's own initiative. Keep all trailers in one contiguous block. Do
103
117
  ### Step 7 — Report; the advance decision belongs to the dial (Phase 4)
104
118
  Report: the branch name, the files changed, how the change satisfies the task's acceptance criterion,
105
119
  the result of any test/smoke run, and the next action — the **check gates** (Step C — `yad-checks`)
106
- then the PR and review (Steps D–E). Do **not** open a PR, merge, or hand-edit the epic's front-half
120
+ then the PR and review (Steps D–E). Do **not** open a PR, merge, or hand-edit the epic's Shape
107
121
  `state.json`. Step B ends at a committed task branch.
108
122
 
109
123
  - **Run standalone:** stop here; a human triggers the gates.
110
124
  - **Run by the orchestrator** (`yad-run`): this skill still just produces the committed branch and
111
125
  signals success (or a scope/contract halt). The orchestrator records the `implement` step's status
112
- and trust entry and, when `implement` is earned to `machine_advance` (Step D, Phase 4b), **auto-runs
126
+ and trust entry and, when `implement` is set to `advance: auto` (`yad dial`), **auto-runs
113
127
  the check gates** instead of waiting for a manual nudge. The diff still cannot merge without the
114
128
  gates passing and the engineer review — Step D removes only the "now run the gates" hand-off.
115
129
 
116
130
  ### Step 8 — Record the `tasks` trust signal on first consume (Phase 4b)
117
131
  Resolving a task from `tasks.md` (Step 1) is the moment the generated task list "survives contact" —
118
- the evidence that could later earn the `tasks` step a `machine_advance`. When driven by `yad-run`,
132
+ part of the run record `yad dial` shows beside the `tasks` dial. When driven by `yad-run`,
119
133
  finalize a `tasks` trust entry, anchored to what the human/dev actually did with the list:
120
134
  - the task is implemented with its declared `Files:`/scope **as generated** → `approved-unchanged`;
121
135
  - the task is **re-scoped** first (its `Files:`/boundary edited) → `approved-with-edits`
@@ -124,8 +138,8 @@ finalize a `tasks` trust entry, anchored to what the human/dev actually did with
124
138
  Write the entry to its own shard `epics/<epic>/.sdlc/trust-log/<story>-<repo>-tasks-<uid>.json` (a fresh
125
139
  `uid` per run, so concurrent writers never conflict; readers union the folded `trust-log.json` + the
126
140
  loose shards, skipping any shard whose full `(story, repo, step, uid)` already appears folded — a
127
- half-applied `yad tidy up` — so entries are never double-counted). Schema: `../yad-epic/references/state-schema.md`. `tasks` stays `human_approve` until its slice clears
128
- the threshold — this only *gathers* evidence. (The `implement` step's own verdict is finalized later,
141
+ half-applied `yad tidy up` — so entries are never double-counted). Schema: `../yad-epic/references/state-schema.md`. The record is advice: the `tasks` dial
142
+ is whatever the team sets with `yad dial`. (The `implement` step's own verdict is finalized later,
129
143
  at the engineer review in `yad-engineer-review`: merged as authored → `approved-unchanged`; edited first →
130
144
  `approved-with-edits`; scope/contract/checks halt → `rejected`.)
131
145
 
@@ -136,7 +150,7 @@ at the engineer review in `yad-engineer-review`: merged as authored → `approve
136
150
  - **Never widen the contract here.** Surface changes go back to the architecture gate (Step 5).
137
151
  - **The step never advances itself.** A scope overrun or contract touch always halts. The
138
152
  `implement → checks` hand-off advances only when the orchestrator's `implement` dial is
139
- `machine_advance` (earned, Step D) — and never past the engineer review, which is always human.
153
+ `advance: auto` (`yad dial`) — and never past the engineer review, which is always human.
140
154
  Standalone, the step stops at a committed branch.
141
155
 
142
156
  ## Reference
@@ -89,8 +89,8 @@ The **locked contract surface** is the cross-repo agreement in `epics/<epic>/con
89
89
  change; no trailer.
90
90
  - **Changing the contract** (exceptional) — altering the agreed shape itself (new field crossing repos,
91
91
  changed status enum, new shared endpoint). This is **not** an implementation decision. Stop, go back
92
- to the **architecture gate**, amend and re-lock `contract.md` (which re-escalates that review per the
93
- contract `risk_tags`), and only then implement — recording `Contract-Change: yes` so the §C
92
+ to the **architecture gate**, amend and re-lock `contract.md` (which sends that review round again; its contract `risk_tags`
93
+ raise the full approver count, which is advisory — E72 reports it capped at the active people less one), and only then implement — recording `Contract-Change: yes` so the §C
94
94
  contract-check finds the matching, already-updated contract.
95
95
 
96
96
  This keeps the contract singular and owned upstream: a code repo can never widen the shared surface
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: yad-learn
3
- description: 'The cross-cutting learning layer: at ANY SDLC stage, a team member can ask to learn a concept and be tutored in the context of what the team is building. Routes the request to the connected learning tool (.sdlc/learning.json, DeepTutor-first) grounded in the project knowledge base, or degrades to harness-native tutoring (the harness model reading the artifacts) when no tool is connected. Renders a tutorial artifact and appends to a per-member learning ledger that is kept LOCAL-ONLY — gitignored, never committed or pushed to the product hub or any code repo — so it stays a private, personal skills log (yad-status rolls up the local records). Purely opt-in — it NEVER blocks a gate and never touches epic state, approvals, or the contract lock. Use when the user says "teach me <concept>", "learn about <concept>", or "yad-learn".'
3
+ description: 'The cross-cutting learning layer: at ANY SDLC stage, a team member can ask to learn a concept and be tutored in the context of what the team is building. Routes the request to the connected learning tool (.sdlc/learning.json, DeepTutor-first) grounded in the project knowledge base, or degrades to harness-native tutoring (the harness model reading the artifacts) when no tool is connected. Renders a tutorial artifact and appends to a per-member learning ledger that is kept LOCAL-ONLY — gitignored, never committed or pushed to the Product or any code repo — so it stays a private, personal skills log (yad-status rolls up the local records). Purely opt-in — it NEVER blocks a gate and never touches epic state, approvals, or the contract lock. Use when the user says "teach me <concept>", "learn about <concept>", or "yad-learn".'
4
4
  ---
5
5
 
6
6
  # SDLC — Learn (the cross-cutting tutor)
@@ -13,8 +13,8 @@ therefore their **control over what is being built** — explicit, without ever
13
13
  to the team.
14
14
 
15
15
  **Learning output is LOCAL-ONLY.** The records ledger and the rendered tutorials are personal artifacts:
16
- they are **gitignored and must never be committed or pushed** — not to the product hub and not to any
17
- code repo. The skill ensures the product hub's `.gitignore` lists these paths before it writes them. The
16
+ they are **gitignored and must never be committed or pushed** — not to the Product and not to any
17
+ code repo. The skill ensures the Product's `.gitignore` lists these paths before it writes them. The
18
18
  only committed, shared learning file is the connection registry `.sdlc/learning.json` (no secrets, no
19
19
  personal data) — written by `yad-connect-learning`, not here.
20
20
 
@@ -24,7 +24,7 @@ approvals ledger, or the contract lock. It writes only the local learning ledger
24
24
 
25
25
  ## Conventions
26
26
 
27
- - `{project-root}` resolves from the project working directory (the **product hub**).
27
+ - `{project-root}` resolves from the project working directory (the **Product**).
28
28
  - The tutor is reached via the project's learning connection (`.sdlc/learning.json`, written by
29
29
  `yad-connect-learning`). **DeepTutor-first** (a CLI subprocess); when no tool is connected (or the
30
30
  `deeptutor` binary is absent) it degrades to **harness-native** tutoring — the harness model reads the
@@ -35,7 +35,7 @@ approvals ledger, or the contract lock. It writes only the local learning ledger
35
35
  - When no epic is scoped, records go to `.sdlc/learning-records.json` and tutorials to `.sdlc/learning/`
36
36
  (cross-project learning).
37
37
  - **Local-only, never committed.** All of the above paths are personal output. Before writing any of
38
- them, ensure the **product hub's** `.gitignore` ignores learning output (idempotent — append only if
38
+ them, ensure the **Product's** `.gitignore` ignores learning output (idempotent — append only if
39
39
  the lines are absent):
40
40
  ```
41
41
  # yadflow learning layer — personal, local-only (never commit or push)
@@ -44,10 +44,10 @@ approvals ledger, or the contract lock. It writes only the local learning ledger
44
44
  epics/*/.sdlc/learning-records.json
45
45
  epics/*/learning/
46
46
  ```
47
- Never write learning output into a connected **code repo** — it lives only in the product hub, and only
47
+ Never write learning output into a connected **code repo** — it lives only in the Product, and only
48
48
  on the local machine. `.sdlc/learning.json` (the connection registry) is the sole committed learning
49
49
  file and is NOT ignored.
50
- - Speak in the configured `communication_language`; write tutorials in `document_output_language`.
50
+ - Speak in the `communication_language` set in `{project-root}/.sdlc/config.yaml`; write tutorials in `document_output_language`.
51
51
 
52
52
  ## Inputs
53
53
 
@@ -84,7 +84,7 @@ Keep the tutorial focused (usually < 600 words): explain the concept, then tie i
84
84
  example from this project** (an artifact line, a contract field, a story).
85
85
 
86
86
  ### Step 2 — Render the tutorial artifact (local-only)
87
- First ensure the product hub's `.gitignore` lists the learning-output paths (see Conventions — append the
87
+ First ensure the Product's `.gitignore` lists the learning-output paths (see Conventions — append the
88
88
  block only if absent, so the artifacts can never be committed or pushed). Then write the tutorial to
89
89
  `epics/EP-<slug>/learning/<member>--<concept-slug>.md` (or `.sdlc/learning/` when no epic is scoped).
90
90
  Front-matter the file with `member`, `concept`, `stage`, `tool`, and `requestedAt`.
@@ -130,7 +130,7 @@ there is no approval and no gate. The learner runs `action: complete` (below) wh
130
130
  - **Read-only except the learning ledger.** It writes only `learning-records.json` + tutorial artifacts;
131
131
  it never touches `state.json`, `approvals.json`, `comments.json`, or the contract lock.
132
132
  - **Local-only output.** The records ledger and tutorials are gitignored personal artifacts — never
133
- commit or push them, and never write them into a code repo. Ensure the hub `.gitignore` covers them
133
+ commit or push them, and never write them into a code repo. Ensure the Product `.gitignore` covers them
134
134
  before writing (see Conventions).
135
135
  - **Always works.** No DeepTutor / no connection → tutor harness-native. Never fail because a tool is
136
136
  absent.
@@ -12,7 +12,7 @@ evidence base for the **local skills-log roll-up** in `yad-status`.
12
12
  (`config.yaml` `learning.records` and `learning.artifacts`.)
13
13
 
14
14
  **Local-only.** Every path above is personal output and is **gitignored — never committed or pushed**, to
15
- the product hub or any code repo. `yad-learn` ensures the hub `.gitignore` lists them before writing. The
15
+ the Product or any code repo. `yad-learn` ensures the Product `.gitignore` lists them before writing. The
16
16
  only committed learning file is the connection registry `.sdlc/learning.json`.
17
17
 
18
18
  ## Record schema
@@ -42,7 +42,7 @@ only committed learning file is the connection registry `.sdlc/learning.json`.
42
42
  - **No secrets.** Records hold concept text + references only — never keys or raw tool output beyond the
43
43
  rendered tutorial.
44
44
  - **Never commit the ledger or tutorials.** They are personal, local-only artifacts: gitignored, never
45
- committed or pushed (to the hub or a code repo). Only `.sdlc/learning.json` is committed.
45
+ committed or pushed (to the Product or a code repo). Only `.sdlc/learning.json` is committed.
46
46
 
47
47
  ## Mode → DeepTutor capability
48
48
 
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  name: yad-open-pr
3
- description: 'Build-half helper of the gated SDLC. Open a code-repo task PR/MR from the committed platform template — detect GitHub/GitLab, push the current task branch, and create the PR/MR with the template body prefilled (Summary / Story-task / Impact & Risk) and the title defaulting to the commit subject. Auto-assigns from the hub roster: assignee = the committer, reviewers = the repo''s reviewers + domain-owners. High risk / contract surface routes to domain owners (risk-route.sh). Drives the `yad open-pr` CLI; never merges. Use when the user says "open the PR", "open the MR", or "raise the merge request".'
3
+ description: 'Build helper of the gated SDLC. Open a code-repo task PR/MR from the committed platform template — detect GitHub/GitLab, push the current task branch, and create the PR/MR with the template body prefilled (Summary / Story-task / Impact & Risk) and the title defaulting to the commit subject. Assigns the PR/MR to the logged-in gh/glab login and requests no reviewers (ask them on the PR itself); prints a reviewer suggestion from recent history and CODEOWNERS, a hint and never a request. High risk / contract surface raises the approver count (risk-route.sh prints it). Drives the `yad open-pr` CLI; never merges. Use when the user says "open the PR", "open the MR", or "raise the merge request".'
4
4
  ---
5
5
 
6
- # SDLC — Open Task PR/MR (build-half helper)
6
+ # SDLC — Open Task PR/MR (Build helper)
7
7
 
8
8
  **Goal:** Open the PR/MR for the current task branch from the repo's committed PR/MR template
9
- (installed by `yad-pr-template`, Step D), with the body prefilled and the right reviewers requested.
9
+ (installed by `yad-pr-template`, Step D), with the body prefilled and the assignee set.
10
10
  This is the standalone open-PR step; it **never merges** — the engineer review (`yad-engineer-review`,
11
- Step E) owns the merge. Distinct from `yad gate open`, which opens a front-half artifact-review PR on
12
- the product hub.
11
+ Step E) owns the merge. Distinct from `yad gate open`, which opens a Shape artifact-review PR on
12
+ the Product.
13
13
 
14
14
  ## Conventions
15
15
 
@@ -19,19 +19,20 @@ the product hub.
19
19
  - **Title** — defaults to the last commit subject (one atomic task = one branch = one PR/MR), so it
20
20
  follows the same Conventional-Commits style and passes the `pr-title` gate. Override with `--title`.
21
21
  - **Body** — the committed template (`.github/pull_request_template.md` /
22
- `.gitlab/merge_request_templates/Default.md`) with `Task:`, `Risk level:`, `Contract surface
23
- touched:`, and `Domains` prefilled; the rest is left for the author. This satisfies the `pr-template`
22
+ `.gitlab/merge_request_templates/Default.md`) with the Summary (from the commit), the story/task id and
23
+ its `specs/` path, `Risk level:`, `Contract surface touched:`, and `Domains` (the repo name when
24
+ `--repo` is passed) prefilled; the rest is left for the author. This satisfies the `pr-template`
24
25
  gate.
25
- - **Stage-aware on the product hub** — `open-pr` mirrors the `--head` split the hub gates apply:
26
- - a **`review/EP-*/<artifact>`** branch is a front-half artifact-review PR → it **delegates to
27
- `yad gate open`** (artifact-review title `review: <artifact> (EP-<slug>)`, the hub artifact-review
26
+ - **Stage-aware on the Product** — `open-pr` mirrors the `--head` split the Product gates apply:
27
+ - a **`review/EP-*/<artifact>`** branch is a Shape artifact-review PR → it **delegates to
28
+ `yad gate open`** (artifact-review title `review: <artifact> (EP-<slug>)`, the Product artifact-review
28
29
  body, and the gate ledger bookkeeping all in one place). Any `--title`/`-m` is ignored here.
29
- - any **other hub branch** is a tooling/CI change → it uses the bundled **code-task** template
30
- (`## Summary` / `Risk level:` / `## Checklist`) instead of the hub's artifact-review
31
- `pull_request_template.md`, so the hub `pr-template` gate passes.
30
+ - any **other Product branch** is a tooling/CI change → it uses the bundled **code-task** template
31
+ (`## Summary` / `Risk level:` / `## Checklist`) instead of the Product's artifact-review
32
+ `pull_request_template.md`, so the Product `pr-template` gate passes.
32
33
  In a code repo nothing changes — it reads the repo's own committed code-task template.
33
34
  - **Base branch** — **resolved, never assumed.** In order: `--base` → the repo's `default_branch` in
34
- `.sdlc/repos.json` → (for a PR against the hub itself) `hub.json`'s `default_branch` → what the
35
+ `.sdlc/repos.json` → (for a PR against the Product itself) `hub.json`'s `default_branch` → what the
35
36
  platform reports (`gh repo view --json defaultBranchRef` / `glab api projects/:id`) → local
36
37
  `origin/HEAD` → `main`. The same **configuration-outranks-the-remote** order `yad repo sync` and the
37
38
  contract-check gate already use (they stop at `origin/HEAD`; only this chain also asks the platform).
@@ -41,18 +42,28 @@ the product hub.
41
42
  auto-review eligibility from the base at PR-**open** time, and retargeting afterwards does not undo
42
43
  the skip. Hardcoding `main` here is the same bug the check gates already refuse to make (see
43
44
  `../yad-checks/references/check-gates.md`).
44
- - **Auto-assign** — from the hub roster scoped to this repo: assignee = the committer (resolved from
45
- the local git identity), reviewers = the repo's `reviewer`/`domain-owner` logins minus the committer.
46
- Degrades cleanly when there is no roster.
47
- - **Routing** — `low`/`medium` → base rule (owner + 1 reviewer); `high` (or a touched
48
- contract/auth/payments surface) → plus one domain-owner per touched domain. `bash
49
- checks/risk-route.sh <body>` prints the required reviewers.
45
+ - **Assignee** — the person opening it: `@me` on GitHub (`gh` resolves it on the repo's own host), and
46
+ on GitLab the login `glab` reports (no assignee is passed when that lookup fails). **No reviewers are
47
+ requested** (E62): yadflow keeps no list of people. The CLI prints `no
48
+ reviewers were requested — ask them on the PR itself`. For a `high` directory the CLI names the people
49
+ who have worked there lately (E67, Step 3). For every code-repo change it also prints a reviewer **suggestion**
50
+ (E68, Step 3a): who has committed in the touched folders lately, and what CODEOWNERS lists — a hint
51
+ only, never a request.
52
+ - **Routing** — the merge needs 1 approval from someone other than the author (the base). `high` risk
53
+ adds 1, a touched contract surface adds 2, and a change touching a `high` directory on the base
54
+ branch's risk map adds 1 (E66) — the larger, never the sum. That risk step is advisory: branch
55
+ protection holds the merge, never this count. The CLI prints the count once the PR is open — capped by
56
+ the active people (E72) when run from the Product — for example `this PR asks for 3 approvers = base 1
57
+ + contract risk 2, capped to 1 for 2 active people — base enforced, risk step advisory; …` — and prints the count of people on its
58
+ own line (`active people: not counted — no cap applies; …` when it cannot count them).
59
+ `bash checks/risk-route.sh <body>` prints the same count from the PR body, without the cap: a code
60
+ repo's CI has no Product to count people from.
50
61
 
51
62
  ## Inputs
52
63
 
53
64
  - `repo` — target a registered repo by name (optional; else the current dir).
54
65
  - `risk` — `low|medium|high` (default `low`); prefilled into the body.
55
- - `contractChange` — flag; marks the contract surface touched and triggers escalation.
66
+ - `contractChange` — flag; marks the contract surface touched and raises the approver count.
56
67
  - `base` — override the PR/MR base (optional; defaults to the repo's own default branch —
57
68
  see **Base branch** above). Only pass it deliberately: a non-default base loses the AI first pass.
58
69
  - `platform` / `title` — optional overrides.
@@ -69,8 +80,8 @@ Run from the repo root:
69
80
  yad open-pr [--repo <name>] [--risk <level>] [--contract-change] [--title "<subject>"]
70
81
  ```
71
82
  The CLI pushes the branch (sets upstream, the user's own auth), fills the template, and creates the
72
- PR/MR with the auto-assigned assignee + reviewers. It prints the base it resolved and where that came
73
- from.
83
+ PR/MR with the assignee set and no reviewers requested. It prints the base it resolved and where that
84
+ came from.
74
85
 
75
86
  The non-default-base warning is **advisory — it does not block, and the PR/MR is already open by the
76
87
  time you read it.** If the base was intended (a stacked PR, a release branch), carry on. If it was
@@ -78,9 +89,33 @@ not, do **not** just retarget the open PR — that leaves the AI first pass skip
78
89
  cause (the repo's `default_branch`, or drop the wrong `--base`), and re-run `yad open-pr` so the PR
79
90
  is *created* against the right base.
80
91
 
81
- ### Step 3 — Route the review (if escalated)
82
- On `high` risk or a contract touch, run `bash checks/risk-route.sh <pr-body>` to print the required
83
- domain-owner reviewers — the same escalation `yad-engineer-review` enforces.
92
+ ### Step 3 — Route the review (if the count is raised)
93
+ Once the PR is open, the CLI prints how many approvers it asks for — the same count the engineer review
94
+ (`yad-engineer-review`) uses. It joins the body's level (`--risk`, `--contract-change`) with the code
95
+ repo's risk map on `origin/<base>`: a change touching a `high` directory adds 1 even when the body says
96
+ `low`, and the CLI warns that the two disagree. It also names who has **committed in those directories
97
+ in the last 30 days** (E67) — the people who can meet that ask — or says plainly that nobody has, or
98
+ that the history could not be read. It only prints; the body keeps the author's level. If
99
+ the level in the body is wrong, fix the body on the PR. When the map cannot be read (no `origin/<base>`
100
+ fetched, a newer map), it says so and counts the body alone. `bash checks/risk-route.sh "<pr body>"`
101
+ also lists the touched domains as a hint for whom to ask; request those reviewers on the PR/MR yourself.
102
+
103
+ ### Step 3a — Relay the reviewer suggestion (E68)
104
+ The CLI then prints two hints about whom to ask, on separate lines: the people who have **committed in
105
+ the folders this change touches in the last 30 days** (base branch; the change's own authors and robots
106
+ left out; ranked by commits, five shown), and what **CODEOWNERS on the base branch** lists for the changed
107
+ files. Relay both as they are. It is a **suggestion only**:
108
+
109
+ - Never request those people as reviewers on the PR/MR yourself, and never call them owners or required
110
+ approvers. A name is a hint about who **may** know the code. The author decides whom to ask.
111
+ - CODEOWNERS is a hint: these files go stale. A `CODEOWNERS line N not read — …` line is a line yadflow
112
+ could not match safely (the first three get a reason, the rest a count, and the list then says it
113
+ `may be wrong`); mention it, do not guess what it meant.
114
+ If the author asks whether CODEOWNERS is out of date, run `yad codeowners check <repo>` (E69) and relay
115
+ it. Never edit CODEOWNERS for them: a name written there becomes an owner the platform can enforce.
116
+ - The same person can appear in both lists under two names (a git name, a platform login). Do not join
117
+ them unless the output says `also in the 30-day history` (only a `noreply` login of the same platform counts, and only on github.com or gitlab.com).
118
+ - `not read` (a shallow clone, a missing base) is never "nobody". Say it as the CLI says it.
84
119
 
85
120
  ### Step 3b — Post the review trailer (optional, recommended)
86
121
  Make the reviewer's job easy: generate the 60-sec briefing and post it to the new PR/MR so it greets
@@ -93,8 +128,8 @@ The full fun-review flow (cards + grounded chat + engagement) is driven by the
93
128
  design — companion comments carry `<!-- yad:noblock -->`.
94
129
 
95
130
  ### Step 4 — Stop (no merge)
96
- Report the PR/MR URL and the requested reviewers. The PR now runs the check gates (Step C); the human
97
- engineer review and merge happen in `yad-engineer-review` (Step E).
131
+ Report the PR/MR URL and that no reviewers were requested. The PR now runs the check gates (Step C);
132
+ the human engineer review and merge happen in `yad-engineer-review` (Step E).
98
133
 
99
134
  ## Hard rules
100
135
 
@@ -102,7 +137,7 @@ engineer review and merge happen in `yad-engineer-review` (Step E).
102
137
  - **The base is the repo's default branch** unless you deliberately chose otherwise with `--base`.
103
138
  Never hardcode `main`, and never ignore the non-default-base warning silently.
104
139
  - **Title follows the commit subject** — Conventional-Commits style, so the `pr-title` gate passes.
105
- - **High risk routes to domain owners** — the same escalation as the gate; never a separate rule.
140
+ - **High risk raises the approver count** — the same count as the gate; never a separate rule.
106
141
  - **Opening a PR never merges.** The human owns the merge in Step E.
107
142
 
108
143
  ## Reference
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: yad-pair-review
3
- description: 'The guided, two-way, teaching pair-review walkthrough for the SDLC review gates — the AI-driven companion face. The human opens a PR/MR with an AI session and the AI walks them through the change ONE STOP AT A TIME (highest-risk first), giving comprehensive context per change, then asking the human a Socratic question about it; the human answers and asks back, and both keep going until BOTH declare satisfied. The session doubles as a learning session: it demonstrates a transferable review method, scores the engineer against it, and records their review-skill growth in the local-only yad-learn ledger (rolled up by yad status). Works on the back-half code PR/MR (yad review) and the front-half artifact-review PR/MR (yad gate). Soft and additive — it NEVER blocks a merge or gate; it rides the existing engagement signal and surfaces genuine concerns as normal blocking comments. Use when the user says "pair review this", "walk me through the PR/MR", "review with me", "co-review", or "teach me to review".'
3
+ description: 'The guided, two-way, teaching pair-review walkthrough for the SDLC review gates — the AI-driven companion face. The human opens a PR/MR with an AI session and the AI walks them through the change ONE STOP AT A TIME (highest-risk first), giving comprehensive context per change, then asking the human a Socratic question about it; the human answers and asks back, and both keep going until BOTH declare satisfied. The session doubles as a learning session: it demonstrates a transferable review method, scores the engineer against it, and records their review-skill growth in the local-only yad-learn ledger (rolled up by yad status). Works on the Build code PR/MR (yad review) and the Shape artifact-review PR/MR (yad gate). Soft and additive — it NEVER blocks a merge or gate; it rides the existing engagement signal and surfaces genuine concerns as normal blocking comments. Use when the user says "pair review this", "walk me through the PR/MR", "review with me", "co-review", or "teach me to review".'
4
4
  ---
5
5
 
6
6
  # SDLC — Pair Review (the guided, two-way, teaching walkthrough)
@@ -26,19 +26,19 @@ platform.**
26
26
 
27
27
  ## Conventions
28
28
 
29
- - `{project-root}` resolves from the project working directory — the **product hub**.
30
- - Back half (code PR/MR): grounded by `yad review walkthrough --repo <r> --pr <n>`.
31
- - Front half (artifact-review PR/MR): grounded by `yad gate walkthrough <epic> [artifact]`.
29
+ - `{project-root}` resolves from the project working directory — the **Product**.
30
+ - Build (code PR/MR): grounded by `yad review walkthrough --repo <r> --pr <n>`.
31
+ - Shape (artifact-review PR/MR): grounded by `yad gate walkthrough <epic> [artifact]`.
32
32
  - The transferable review method + scorecard live in `references/review-rubric.md`.
33
33
  - The session-record comment shape, the dual sign-off, and the learning record this writes live in
34
34
  `references/session-state.md` (it reuses [`yad-learn`](../yad-learn/SKILL.md)'s ledger + gitignore
35
35
  discipline **verbatim** — the learning output is **local-only, never committed or pushed**).
36
- - Speak in the configured `communication_language`; write any rendered tutorial in
36
+ - Speak in the `communication_language` set in `{project-root}/.sdlc/config.yaml`; write any rendered tutorial in
37
37
  `document_output_language`.
38
38
 
39
39
  ## Inputs
40
40
 
41
- - Back half: `repo` + `pr`. Front half: `epic` + `artifact`.
41
+ - Build: `repo` + `pr`. Shape: `epic` + `artifact`.
42
42
  - `member` — the learner being paired with (default: the invoking user). Used for the learning record.
43
43
  - `action` — `walkthrough` (the full session, default) | `record` (just write the session comment +
44
44
  learning record from an already-finished session) | `rubric` (print the review method and stop).
@@ -47,9 +47,11 @@ platform.**
47
47
 
48
48
  ### Step 1 — Get the ordered stops (the grounding)
49
49
  Run the walkthrough grounding for the half you're on:
50
- - Back half: `yad review walkthrough --repo <r> --pr <n>` → prints the grounding bundle **plus an ordered
50
+ - Build: `yad review walkthrough --repo <r> --pr <n>` → prints the grounding bundle **plus an ordered
51
51
  `stops[]`** (the code diff parsed into hunk-anchored, risk-tagged review stops, highest-risk first).
52
- - Front half: `yad gate walkthrough <epic> [artifact]` → the same, over the artifact's review diff.
52
+ - Shape: `yad gate walkthrough <epic> [artifact]` → the same, over the artifact's review diff. Its
53
+ `step.gateRule` carries the step's full approver count (`needed` distinct people, and the `risk`
54
+ tier that set it), and `step.cap` — an object `{ active, limit, to, capped }`: `to` is the count capped by the active people (E72), `capped` is true when the cap lowered it, and the whole field is `null` when the people were not counted — useful context for how hard a step is being reviewed, never a pass/fail input.
53
55
 
54
56
  **Read the real material yourself** — run the bundle's `diffCmd`, and read the named `codeMap` / `pack` /
55
57
  `contract` / `artifactPath` / `specs/<story>/` files. Never invent content. If a stop's material isn't
@@ -87,8 +89,8 @@ After the last stop:
87
89
  concern remains*.
88
90
  - **Human sign-off.** The human decides: **approve** or **request changes**. When they approve through
89
91
  this session, submit the approval carrying the engagement marker so the gate records
90
- `engagement: verified` — back half: `gh pr review <n> --approve --body "<note>\n\n<!-- yad:engagement verified -->"`
91
- (GitLab: `glab mr approve <n>` then a note with the marker); front half: the human approves via
92
+ `engagement: verified` — Build: `gh pr review <n> --approve --body "<note>\n\n<!-- yad:engagement verified -->"`
93
+ (GitLab: `glab mr approve <n>` then a note with the marker); Shape: the human approves via
92
94
  [`yad-review-gate`](../yad-review-gate/SKILL.md) the normal way.
93
95
 
94
96
  "**Both satisfied**" = the human approved **and** your verdict holds no unresolved blocking concern. If
@@ -101,11 +103,11 @@ addresses them) — nothing advances on a half-finished session.
101
103
  never holds the gate): the transcript summary, the **review-skill scorecard**, your AI verdict, and
102
104
  both sign-offs. Post it with the platform CLI (`gh pr comment` / `glab mr note`).
103
105
  2. **Learning record (local-only).** Append a `yad-learn` record for the `member`: `concept` =
104
- `review <repo> PR #<n> — <title>` (front half: `review <artifact> (<epic>)`), `stage` =
106
+ `review <repo> PR #<n> — <title>` (Shape: `review <artifact> (<epic>)`), `stage` =
105
107
  `engineer-review` (back) / `<artifact>-review` (front), `mode` = `deep` (or `quiz` when you scored
106
108
  comprehension), `comprehension` = the scorecard roll-up, `tutorial` = a rendered
107
109
  `learning/<member>--review-<pr>.md` capturing the method as applied to this PR + the engineer's gaps.
108
- **First ensure the hub `.gitignore` covers the learning paths** (reuse yad-learn's guard), then write —
110
+ **First ensure the Product `.gitignore` covers the learning paths** (reuse yad-learn's guard), then write —
109
111
  these are personal, gitignored, **never committed or pushed**. The growth rolls up under `yad status`
110
112
  "My skills".
111
113
 
@@ -125,9 +127,9 @@ addresses them) — nothing advances on a half-finished session.
125
127
  or push the records/tutorials, and never write them into a code repo.
126
128
  - **You never approve for the human and never merge.** You pair and teach; the human acts.
127
129
 
128
- ## File-only mode (no platform)
130
+ ## local mode (no platform)
129
131
 
130
- With no hub platform there is no PR to post to: write the session record to
132
+ With no Product platform there is no PR to post to: write the session record to
131
133
  `reviews/<base>--<date>--pair-session.md` alongside the existing `reviews/*.md`, and the human records
132
134
  approval the manual way via [`yad-review-gate`](../yad-review-gate/SKILL.md). The learning record is
133
135
  written exactly the same (it is local-only regardless of platform). The session logic is unchanged; only
@@ -138,7 +140,7 @@ the posting surface differs.
138
140
  - The transferable review method + scorecard schema: `references/review-rubric.md`.
139
141
  - The session comment shape, dual sign-off, and learning record: `references/session-state.md`.
140
142
  - The four skim faces this complements: [`yad-review-companion`](../yad-review-companion/SKILL.md).
141
- - The back-half merge gate it enriches: [`yad-engineer-review`](../yad-engineer-review/SKILL.md).
142
- - The front-half gate it enriches: [`yad-review-gate`](../yad-review-gate/SKILL.md).
143
+ - The Build merge gate it enriches: [`yad-engineer-review`](../yad-engineer-review/SKILL.md).
144
+ - The Shape gate it enriches: [`yad-review-gate`](../yad-review-gate/SKILL.md).
143
145
  - The learning layer it records into: [`yad-learn`](../yad-learn/SKILL.md) and its
144
146
  `references/learning-state.md`.
@@ -22,7 +22,7 @@ Sections (you generate the prose; the helper composes them):
22
22
  - **humanSignoff / aiSignoff** — the two satisfaction statements ("both satisfied").
23
23
 
24
24
  Post it with the platform CLI (`gh pr comment <n> -b "<body>"` / `glab mr note <n> -m "<body>"`). In
25
- file-only mode write it to `reviews/<base>--<date>--pair-session.md` instead.
25
+ local mode write it to `reviews/<base>--<date>--pair-session.md` instead.
26
26
 
27
27
  ## 2. The learning record (local-only, reuses yad-learn)
28
28
 
@@ -30,7 +30,7 @@ This is the "review **is** the lesson" half. It reuses [`yad-learn`](../../yad-l
30
30
  schema and gitignore discipline **verbatim** — see `yad-learn/references/learning-state.md`. Do not
31
31
  invent a new store.
32
32
 
33
- **Before writing anything**, ensure the **product hub's** `.gitignore` covers the learning paths
33
+ **Before writing anything**, ensure the **Product's** `.gitignore` covers the learning paths
34
34
  (idempotent — append only if absent), the same block yad-learn uses:
35
35
 
36
36
  ```
@@ -62,7 +62,7 @@ cross-project), using yad-learn's exact field shape:
62
62
  ```
63
63
 
64
64
  Field notes:
65
- - `stage` = `engineer-review` (back half) or `<artifact>-review` (front half, e.g. `architecture-review`).
65
+ - `stage` = `engineer-review` (Build) or `<artifact>-review` (Shape, e.g. `architecture-review`).
66
66
  - `mode` = `deep` for a walkthrough that didn't score, `quiz` when you captured a comprehension roll-up.
67
67
  - `comprehension` = the scorecard roll-up string (null when `mode: deep`).
68
68
  - `tool` = `harness-native` (or `deeptutor` if a DeepTutor session backed the tutoring).
@@ -74,7 +74,7 @@ engineer's specific gaps and how to close them. Both files are **local-only, git
74
74
  or pushed, and never written into a code repo** — they are a private personal skills log. `yad status`
75
75
  rolls them up by stage (e.g. "engineer-review: 3").
76
76
 
77
- ## Optional: stamp the build-log (back half)
77
+ ## Optional: stamp the build-log (Build)
78
78
 
79
79
  When the task later ships, [`yad-engineer-review`](../../yad-engineer-review/SKILL.md) may record on the
80
80
  ship record's `companion` block that a pair session ran: `"companion": { "trailer": true, "cards": false,