yadflow 3.15.3 → 3.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,5 @@
1
+ ## [3.15.4](https://github.com/abdelrahmannasr/yadflow/compare/v3.15.3...v3.15.4) (2026-08-12)
2
+
1
3
  ## [3.15.3](https://github.com/abdelrahmannasr/yadflow/compare/v3.15.2...v3.15.3) (2026-08-11)
2
4
 
3
5
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yadflow",
3
- "version": "3.15.3",
3
+ "version": "3.15.4",
4
4
  "description": "Yadflow — the gated, team, multi-repo SDLC: author → review → build with a PR-driven review gate and a zero-dependency `yad` CLI (setup, gate, commit, open-pr, ship, repo, thread, reconcile). A BMAD module + 38 yad-* skills.",
5
5
  "type": "module",
6
6
  "author": "AbdelRahman Nasr",
@@ -178,9 +178,22 @@ awk '/CONTRACT-SURFACE:BEGIN/{f=1;next} /CONTRACT-SURFACE:END/{f=0} f' \
178
178
  > of hash-binding.
179
179
 
180
180
  ### Step 6 — Advance the authoring step (NOT the gate)
181
- In `state.json`: set `architecture.status: "done"`, set `architecture-review.status: "in_review"`, and
182
- set `currentStep: "architecture-review"`. Write `state.json`. Do **not** touch `approvals.json` — only
183
- real reviewers approve, through the gate.
181
+ **Check the mode first the two modes have opposite instructions here.** Read `.sdlc/hub.json`:
182
+ **bridge mode** is `platform` set AND `bridge_enabled` (or legacy `bridge`) `true`.
183
+
184
+ **Bridge mode — do NOT write `state.json`.** The ledger is CI-owned: the `ledger-guard` check rejects
185
+ any non-bot commit touching `epics/*/.sdlc/{state,approvals,comments,hub-prs}.json` or
186
+ `epics/*/reviews/*.md`, `yad gate open` deliberately skips this write for the same reason, and
187
+ `yad gate ci --merged` performs the whole transition when the review PR merges. Making the edit here
188
+ fails the gate if it rides the review PR, and desynchronises the ledger CI is about to rewrite if it
189
+ is pushed around the gate. Commit the artifact set — **`architecture.md`, `contract.md`, and
190
+ `.sdlc/contract-lock.json`** (artifact-side, not ledger) — then hand off to `yad-review-gate`.
191
+
192
+ **Otherwise — file-only, or a platform with no gate-sync CI — write it.** In `state.json`: set
193
+ `architecture.status: "done"`, set `architecture-review.status: "in_review"`, and set
194
+ `currentStep: "architecture-review"`. Write `state.json`. Do **not** touch `approvals.json` — only
195
+ real reviewers approve, through the gate. On this branch `yad gate open` makes the same edit, so it
196
+ is a no-op once the gate has run.
184
197
 
185
198
  ### Step 7 — Stop at the gate (do NOT advance)
186
199
  Report: the paths to `architecture.md`, `contract.md`, and `contract-lock.json`; the contract hash;
@@ -99,6 +99,12 @@ thread off it, `promote` is what makes that anchor real — run it once the feat
99
99
  "wake" the state chain — set `currentStep: "epic"`, `epic` step `status: "in_progress"` — then run
100
100
  `yad-epic` → `yad-architecture` → … the normal way. This re-locks a contract that subsequent thread
101
101
  changes will inherit.
102
+ - **Bridge mode — promote is not wired.** The `state.json` edits above mutate an epic whose ledger is
103
+ already on the base ref, so the `#162` seed exemption does not apply and `ledger-guard` rejects the
104
+ commit; unlike the authoring steps there is no `yad backfill` CLI and no `gate ci` path that performs
105
+ the promotion instead. On a bridge hub, STOP and report this — the promotion needs the gate bot (or a
106
+ maintainer landing it out of band). Only the `epic.md` half is safe to commit. Tracked as a gap; do
107
+ **not** push the ledger edit around the guard.
102
108
  - Never auto-advances; a human confirms the promotion.
103
109
 
104
110
  ### Step 7 — Stop (no auto-advance)
@@ -169,14 +169,31 @@ Notes:
169
169
 
170
170
  ### Step 5b — Advance the authoring step — analysis-ran only
171
171
  *(Only when analysis ran — `state.json` already exists from `yad-analysis`.)*
172
- In `state.json`: set `epic.status: "done"`, set `epic-review.status: "in_review"`, and set
173
- `currentStep: "epic-review"`. Write `state.json`. Do **not** re-seed and do **not** touch
174
- `approvals.json` — only real reviewers approve, through the gate.
175
-
176
- > Since 3.11 the CLI closes the authoring step itself whenever its review gate opens or advances
177
- > (`yad gate open` / `sync`), so this edit is a no-op when the gate has already run. Keep making it —
178
- > it keeps `state.json` truthful before the gate opens but it is no longer load-bearing: an epic
179
- > whose author step is left `in_progress` used to strand forever (`YAD-STATE-005`).
172
+ **Check the mode first the two modes have opposite instructions here.** Read `.sdlc/hub.json`:
173
+ **bridge mode** is `platform` set AND `bridge_enabled` (or legacy `bridge`) `true`.
174
+
175
+ **Bridge mode — do NOT write `state.json`.** The ledger is CI-owned: the `ledger-guard` check rejects
176
+ any non-bot commit touching `epics/*/.sdlc/{state,approvals,comments,hub-prs}.json` or
177
+ `epics/*/reviews/*.md`, `yad gate open` deliberately skips this write for the same reason, and
178
+ `yad gate ci --merged` performs the whole transition when the review PR merges. Making the edit here
179
+ fails the gate if it rides the review PR, and desynchronises the ledger CI is about to rewrite if it
180
+ is pushed around the gate. Commit **`epic.md` only** — nothing else under `.sdlc/` — then hand off
181
+ to `yad-review-gate`.
182
+
183
+ > **This is not the Step 5 seed exemption.** `ledger-guard` exempts a *brand-new* epic's ledger
184
+ > (creation, not mutation, #162). On this path `state.json` already exists from `yad-analysis` and
185
+ > reached the base ref through the analysis review — so the guard is absolute here.
186
+
187
+ **Otherwise — file-only, or a platform with no gate-sync CI — write it.** In `state.json`: set
188
+ `epic.status: "done"`, set `epic-review.status: "in_review"`, and set `currentStep: "epic-review"`.
189
+ Write `state.json`. Do **not** re-seed and do **not** touch `approvals.json` — only real reviewers
190
+ approve, through the gate.
191
+
192
+ > **File-only branch only.** Since 3.11 the CLI closes the authoring step itself whenever its review
193
+ > gate opens or advances (`yad gate open` / `sync`), so this edit is a no-op when the gate has already
194
+ > run. It keeps `state.json` truthful before the gate opens, but it is no longer load-bearing: an epic
195
+ > whose author step is left `in_progress` used to strand forever (`YAD-STATE-005`). In bridge mode
196
+ > `gate open` writes nothing and local `gate sync` is advisory — `gate ci` closes the step at merge.
180
197
 
181
198
  ### Step 6 — Stop at the gate (do NOT advance)
182
199
  Report: epic ID, the path to `epic.md`, and that the next action is **review** via
@@ -54,16 +54,28 @@ touched `repos` — never a forked or copied gate.
54
54
 
55
55
  ### Step 2 — Dispatch on `action`
56
56
 
57
+ > **Check the mode first — in bridge mode you write nothing to the ledger.** Read `.sdlc/hub.json`:
58
+ > **bridge mode** is `platform` set AND `bridge_enabled` (or legacy `bridge`) `true`. Under the bridge
59
+ > the ledger is CI-owned — `ledger-guard` rejects any non-bot commit touching
60
+ > `epics/*/.sdlc/{state,approvals,comments,hub-prs}.json` or `epics/*/reviews/*.md`, local `yad gate
61
+ > sync` is advisory, and `yad gate ci --merged` writes the whole transition when the review PR merges.
62
+ > So every "set / append / write" instruction below is the **file-only, or a platform with no
63
+ > gate-sync CI** path. In bridge mode do the human-facing half — present the artifact, route the
64
+ > required reviewers, help the owner address comments — and let the platform PR/MR carry the review
65
+ > state; the approvals, comments, review records and the advance all land through CI at merge.
66
+
57
67
  **`open`** — Present the artifact for review. Summarise what changed, list the required reviewers per
58
68
  the rule above, and tell reviewers how to comment/approve. Set the step `status` to `in_review` and
59
69
  `currentStep` to this step in `state.json` if not already. Do not advance.
60
70
 
61
- If `.sdlc/hub.json` has a non-null `platform`, `bridge_enabled: true`, `config.yaml` `hub.bridge: true`,
62
- and `gh`/`glab` is authenticated, **also open a review PR/MR on the hub** by invoking
63
- `yad-hub-bridge action: open` (epic + artifact). Record the PR in `epics/<epic>/.sdlc/hub-prs.json`
64
- (`{step, artifact, platform, number, url, branch, lastSyncedAt}`) and report the URL + required
65
- reviewers. Otherwise (no platform / disabled / no CLI) proceed **file-only** exactly as before no
66
- error. Opening the PR records no approvals and never advances.
71
+ If `.sdlc/hub.json` has a non-null `platform` and `bridge_enabled: true` (or legacy `bridge: true` —
72
+ `.sdlc/hub.json` is the only source the CLI reads, see `isBridge` in `cli/gate.mjs`), and `gh`/`glab`
73
+ is authenticated, **also open a review PR/MR on the hub** by invoking `yad-hub-bridge action: open`
74
+ (epic + artifact), and report the URL + required reviewers. **CI records the PR** in
75
+ `epics/<epic>/.sdlc/hub-prs.json` (`{step, artifact, platform, number, url, branch, lastSyncedAt}`) —
76
+ write that file yourself only on the file-only path. Otherwise (no platform / disabled / no CLI)
77
+ proceed **file-only** exactly as before — no error. Opening the PR records no approvals and never
78
+ advances.
67
79
 
68
80
  **`comment`** — Capture reviewer feedback. Append/create a review file
69
81
  `reviews/<artifact-base>--<YYYY-MM-DD>--comments.md` with a heading per reviewer:
@@ -101,12 +101,26 @@ As a <role>, I want <capability>, so that <outcome>.
101
101
  `repos` is the field the later build phase reads to know where to scaffold specs — set it precisely.
102
102
 
103
103
  ### Step 6 — Advance the authoring step (NOT the gate)
104
- In `state.json`: set `stories.status: "done"`, set `stories-review.status: "in_review"`, and set
104
+ **Check the mode first the two modes have opposite instructions here.** Read `.sdlc/hub.json`:
105
+ **bridge mode** is `platform` set AND `bridge_enabled` (or legacy `bridge`) `true`.
106
+
107
+ **Bridge mode — do NOT write `state.json`.** The ledger is CI-owned: the `ledger-guard` check rejects
108
+ any non-bot commit touching `epics/*/.sdlc/{state,approvals,comments,hub-prs}.json` or
109
+ `epics/*/reviews/*.md`, `yad gate open` deliberately skips this write for the same reason, and
110
+ `yad gate ci --merged` performs the whole transition when the review PR merges. Making the edit here
111
+ fails the gate if it rides the review PR, and desynchronises the ledger CI is about to rewrite if it
112
+ is pushed around the gate. Commit **the story files under `stories/` only** — nothing else
113
+ under `.sdlc/` — then hand off to `yad-review-gate`.
114
+
115
+ **Otherwise — file-only, or a platform with no gate-sync CI — write it.** In `state.json`: set
116
+ `stories.status: "done"`, set `stories-review.status: "in_review"`, and set
105
117
  `currentStep: "stories-review"`. Write `state.json`. Do **not** touch `approvals.json`.
106
118
 
107
- > Since 3.11 the CLI also closes the authoring step when its review gate opens or advances, so this
108
- > edit is a no-op once `yad gate open` has run. A `stories` step left `in_progress` behind a passed
109
- > `stories-review` used to block the parallel `test-cases` track (`YAD-STATE-005`).
119
+ > **File-only branch only.** Since 3.11 the CLI also closes the authoring step when its review gate
120
+ > opens or advances, so this edit is a no-op once `yad gate open` has run. A `stories` step left
121
+ > `in_progress` behind a passed `stories-review` used to block the parallel `test-cases` track
122
+ > (`YAD-STATE-005`). In bridge mode `gate open` writes nothing and local `gate sync` is advisory —
123
+ > `gate ci` closes the step at merge.
110
124
 
111
125
  ### Step 7 — Stop at the gate (do NOT advance)
112
126
  Report: the story IDs created, the repos each touches, and that the next action is **review** via
@@ -162,9 +162,24 @@ Keep the `## Automation (<tool>)` section of `test-cases.md` in step with this f
162
162
  degraded (`testing: none`), do **not** write `test-links.json`.
163
163
 
164
164
  ### Step 5 — Advance the authoring step (NOT the gate)
165
- In `state.json`: set `test-cases.status: "done"` and set `test-cases-review.status: "in_review"`. **Leave
166
- `currentStep` at `ready-for-build`** this is the parallel track; moving `currentStep` would pull it
167
- back from the build half. Write `state.json`. Do **not** touch `approvals.json`.
165
+ **Check the mode first the two modes have opposite instructions here.** Read `.sdlc/hub.json`:
166
+ **bridge mode** is `platform` set AND `bridge_enabled` (or legacy `bridge`) `true`.
167
+
168
+ **Bridge mode — do NOT write `state.json`.** The ledger is CI-owned: the `ledger-guard` check rejects
169
+ any non-bot commit touching `epics/*/.sdlc/{state,approvals,comments,hub-prs}.json` or
170
+ `epics/*/reviews/*.md`, `yad gate open` deliberately skips this write for the same reason, and
171
+ `yad gate ci --merged` performs the whole transition when the review PR merges. Making the edit here
172
+ fails the gate if it rides the review PR, and desynchronises the ledger CI is about to rewrite if it
173
+ is pushed around the gate. Commit the artifact set — **`test-cases.md` and, when a testing
174
+ tool was used, `.sdlc/test-links.json`** (artifact-side, not ledger; generated tests live in their
175
+ own code repo, not here) — then hand off to `yad-review-gate`.
176
+
177
+ **Otherwise — file-only, or a platform with no gate-sync CI — write it.** In `state.json`: set
178
+ `test-cases.status: "done"` and set `test-cases-review.status: "in_review"`. **Leave `currentStep` at
179
+ `ready-for-build`** — this is the parallel track; moving `currentStep` would pull it back from the
180
+ build half. Write `state.json`. Do **not** touch `approvals.json`. On this branch `yad gate open`
181
+ makes the same edit — `markInReview` leaves `currentStep` alone once it is `ready-for-build`
182
+ (`cli/epic-state.mjs`) — so it is a no-op once the gate has run.
168
183
 
169
184
  ### Step 6 — Stop at the gate (do NOT advance)
170
185
  Report: the path to `test-cases.md`, the connected testing tool and what it produced (e.g. "Playwright —
@@ -171,8 +171,22 @@ Keep the `## Design (<tool>)` section of `ui-design.md` in step with this file.
171
171
  (`design: none`), do **not** write `design-links.json`.
172
172
 
173
173
  ### Step 5 — Advance the authoring step (NOT the gate)
174
- In `state.json`: set `ui-design.status: "done"`, set `ui-design-review.status: "in_review"`, and set
175
- `currentStep: "ui-design-review"`. Write `state.json`. Do **not** touch `approvals.json`.
174
+ **Check the mode first the two modes have opposite instructions here.** Read `.sdlc/hub.json`:
175
+ **bridge mode** is `platform` set AND `bridge_enabled` (or legacy `bridge`) `true`.
176
+
177
+ **Bridge mode — do NOT write `state.json`.** The ledger is CI-owned: the `ledger-guard` check rejects
178
+ any non-bot commit touching `epics/*/.sdlc/{state,approvals,comments,hub-prs}.json` or
179
+ `epics/*/reviews/*.md`, `yad gate open` deliberately skips this write for the same reason, and
180
+ `yad gate ci --merged` performs the whole transition when the review PR merges. Making the edit here
181
+ fails the gate if it rides the review PR, and desynchronises the ledger CI is about to rewrite if it
182
+ is pushed around the gate. Commit the artifact set — **`ui-design.md`, `DESIGN.md`, and, when a
183
+ design tool was used, `.sdlc/design-links.json`** (artifact-side, not ledger) — then hand off to
184
+ `yad-review-gate`.
185
+
186
+ **Otherwise — file-only, or a platform with no gate-sync CI — write it.** In `state.json`: set
187
+ `ui-design.status: "done"`, set `ui-design-review.status: "in_review"`, and set
188
+ `currentStep: "ui-design-review"`. Write `state.json`. Do **not** touch `approvals.json`. On this
189
+ branch `yad gate open` makes the same edit, so it is a no-op once the gate has run.
176
190
 
177
191
  ### Step 6 — Stop at the gate (do NOT advance)
178
192
  Report: the paths to `ui-design.md` and `DESIGN.md`, whether Impeccable was used, the connected design