Yadflow (yahd-flow — from يد, Arabic for “hand”) is the AI-driven SDLC
where a human hand moves every gate. AI builds. The hand decides.
A plain-language guide to every term used in the project (npm + GitHub: yadflow),
plus the full workflow structure with diagrams — including how to run it on a brand-new (greenfield) project,
an existing (brownfield) project, and a multi-repo product.
Yadflow is a team workflow engine built on top of BMAD
(installed from npm as yadflow; the skills are still named sdlc-* and the
CLI command is yad).
It takes a feature from a raw idea all the way to shipped code, in small steps.
Every step does its work, writes its result to a plain file, and then
stops and waits at a gate until a human approves. Nothing is hidden in a
database — all state is files you can read and edit yourself.
You work with four separate git repositories, each with exactly one job:
epics/EP-<slug>/specs/<story-id>/| Dial | Values | What it answers |
|---|---|---|
| Assistance | none · review · heavy |
How much does AI help with the work of this step? |
| Automation | human_approve · machine_advance |
Who moves this step forward — a human or the machine? |
Keeping the dials separate lets you say “heavy AI help, but a human must approve” — the exact setting
for the design steps. Every step starts at human_approve. The front steps and the final
engineer review are locked there permanently.
Setup is one-time. The front half runs once per epic in the hub; the build half runs once per story per code repo; automation is opt-in and earned. The diagram below is the whole lifecycle.
npx yadflow setup — copies the 30 skills into your IDE dirsyad-checks · yad-pr-template · yad-review-comments (CI gates, PR template, comment scaffold)yad-connect-repos → repos.json + a cached code-map per repo (skip if greenfield)yad-connect-design → design.json (Figma-first, pluggable) so yad-ui can materialize the screens (optional — degrades to markdown-only)yad-connect-testing → testing.json (Playwright-first, pluggable) so yad-test-cases can implement the automation (optional — degrades to artifacts-only)yad-connect-learning → learning.json (DeepTutor-first, pluggable) so the learning layer can tutor in context (optional — degrades to harness-native)analysis.mdepic.md · assigns the EP-<slug> ID · seeds statearchitecture.md + the locked contract.md (hash-locked)ui-design.md + DESIGN.md + the screens in the connected design tool (design-links.json)stories/EP-<slug>-S0N.mdyad-test-cases opens in parallel)test-cases.md + the automation tests in the connected testing tool (test-links.json) → its own base-rule review. Never blocks ready-for-build.specs/<story-id>/in-build → shippedtrust-log.jsonyad-run action: kill → everything back to human_approve instantlyyad-status is a read-only view over all of it · yad-hub-bridge mirrors front-half reviews to real PRs/MRs.
One rule: shared thinking lives in the product hub; building lives in each code repo; a link connects them.
product-hub/
epics/EP-<slug>/
analysis.md (optional) the discovery brief
epic.md the feature, agreed
architecture.md how it will be built
contract.md the LOCKED shared surface (APIs, events, data model)
ui-design.md + DESIGN.md (+ the screens in the connected design tool)
stories/ one file per story (EP-<slug>-S01.md …)
test-cases.md the test cases (+ the automation tests when a testing tool is connected)
reviews/ reviewer comments, per artifact
.sdlc/ state.json · approvals.json · contract-lock.json
design-links.json · test-links.json · build-state/ · trust-log.json · build-log.json
each code repo/
specs/<story-id>/ spec, plan, tasks (+ link.md back to the story)
+ the real code, branches and PRs
Every review in the workflow is the same loop, run by yad-review-gate.
Commenting never advances anything. Only an explicit advance (file-only mode) or the
merge of an approved, fully-resolved review PR (platform mode) moves the step forward — and only
when the approval rule is met.
| Review | Rule | Who must approve |
|---|---|---|
| Analysis / Epic / UI | Base | owner + 1 reviewer |
| Architecture + contract | Escalated | owner + 1 reviewer + a domain owner for every repo in the epic. The contract surface is hash-locked; changing it invalidates approvals. |
| Stories | Per-repo | owner + 1 reviewer + the engineer for each repo any story touches |
| Engineer review at ship | Locked | a human engineer — always, never automated |
Type to filter. Each term is tagged by area: core files & artifacts gates & review build half automation tools people & roles
yadflow repo itself — where the 30 skills live and where you pull updates from. No real product work happens inside it.ready-for-build. Test cases is a parallel, non-blocking track that opens at the stories gate and runs alongside the build half. Permanently human-approved.none, review (AI checks human work), or heavy (AI does the drafting, human directs).human_approve (default — a person clicks/records the approval) or machine_advance (the orchestrator moves on by itself). Front steps and the engineer review can never be set to machine_advance.EP-istifta-inquiries.repos: [backend, mobile]). ID: EP-<slug>-S01.EP-<slug>-S01-T03.epic.md, contract.md). An author step writes its artifact, marks itself done, and stops at its review gate.analysis.mdfilesepic.mdfilesEP-<slug> ID and seeds the epic’s state files.architecture.mdfilescontract.mdfilescontract.md (between CONTRACT-SURFACE:BEGIN/END markers) that is hashed and locked. Changing anything in it is a “contract change”.contract-lock.jsonfilesui-design.md + DESIGN.mdfilesstories/filesEP-<slug>-S0N.md), each tagged with the repos that must implement it.approvals.json, comments.json, reviews/*.md. Platform PRs feed into the ledger; the ledger always wins.state.jsonfilescurrentStep (where the epic is right now).approvals.jsonfilesrepos.jsonfileshub.jsonfilesroles: { hub: […], <repo>: […] }). One person can be owner, reviewer and domain owner at once; one repo can have several people per role. Logins are validated against GitHub/GitLab at setup (warn-only). When a PR/MR is opened, the committer becomes the assignee and the scope’s reviewers + domain owners are auto-requested..sdlc/code-context/ so the front-half steps don’t contradict code that already exists.npx repomix), cached alongside the code-map so AI can read the codebase.yad repo refresh) — skills warn about staleness but never silently re-pack.code-context: frontmatterfilesbuild-log.jsonfilesbuild-state/<story>.jsonautomationyad-run reads to know whether to advance or stop.ready-for-buildcorein-build / shippedbuildin-build once its first task merges, shipped when the story is fully delivered.yad-review-gate)gatesopen → comment → approve → advance. Commenting never advances; advance moves forward only when the approval rule is met — otherwise it names exactly who is still missing.reviews/…--comments.md, approvals land in approvals.json, and an explicit advance moves the step. The mode everything degrades to when there is no GitHub/GitLab or no CLI.yad gate sync maps that state into the file ledger, and the step auto-advances on merge once the rule is met and every comment thread is resolved. The merge click is the human approval act.yad-hub-bridge)gatesgh/glab recipes for syncing approvals and comments back.yad gate ci automatically on every approval, change request and merge of a review PR — so the ledger updates itself without anyone running sync by hand. CI never approves and never merges; the human keeps the merge click.REVIEW_COMMENTS.md / GitLab comment templates) so reviewers leave structured, attributable feedback — each canned comment carries a **name (role)** header that maps cleanly into the file ledger.contract, auth, payments) and the PR template’s Impact & Risk block that decide who must review. High risk or a touched risky surface routes the review to the relevant domain owners (risk-route.sh prints them).yad-spec: specify → clarify → plan → analyze → checklist → tasks, writing specs/<story-id>/ in the code repo. It quotes the locked contract; it never widens it.link.mdbuildspecs/<story-id>/ that links the spec back to its story in the product hub — the thread that keeps the two repos connected.Task: trailer in its commit. No orphan changes.Contract-Change: yes and an updated, re-locked contract fails — routing the change back up to the architecture gate. This is how the contract stays honest.<type>: …, no trailing period) and its trailers must be ordered Task → Contract-Change → Co-Authored-By. Profile-aware (code|hub).review: <artifact> (EP-<slug>) title on the hub.Task: trailerbuildTask: EP-istifta-inquiries-S01-T03). What the spec-link check verifies.Contract-Change: yes trailerbuildfeat: …, fix: … (lowercase after the type). Merged feat:/fix: commits also drive automated releases of the CLI itself.Co-Authored-By AI trailerbuildyad-backfill)buildyad-run)automationmachine_advance it advances alone; on human_approve it stops; on any failure, scope overrun, or contract-surface touch it halts and pulls in a human. It always stops at the engineer review.machine_advance only after its trust record clears the threshold, and the flip is refused otherwise.trust-log.json)automationconfig.yaml).approved-unchanged (merged exactly as authored — the strongest signal), approved-with-edits (a human fixed it first), rejected (failed).yad-run action: kill — one move that forces every step system-wide back to human_approve instantly, no code change needed. unkill restores earned automation. Automation is always reversible in one move.machine_advance: all five front authoring steps, their reviews, and the engineer review. A front state advances only on a human act.yad-status prints: where every epic stands, which steps are “earned but still manual” (nudge cost), at a glance./speckit.specify, clarify, plan, analyze, checklist, tasks) produce the spec, plan and task files in each code repo. The workflow drives it when installed and authors the same files by hand when not.npx repomix) that packs a codebase into one AI-readable file, with compression and secret-scanning. Used to cache the code picture of connected repos and to read legacy features for backfill.document (read the current UI into a design file), extract (save reusable pieces), craft (make new designs that match). Used by the UI step when installed; the step authors directly otherwise.yad-epic) you invoke by name in your AI IDE. Each skill does one step’s work, writes files, and stops at its gate.yad CLItoolsyadflow) that installs, wires and reconciles the workflow (setup, check --fix, update) and runs the deterministic pieces (gate, commit, open-pr, repo).| Thing | Format | Example |
|---|---|---|
| Epic ID | EP-<slug> | EP-istifta-inquiries |
| Story ID | EP-<slug>-S0N | EP-istifta-inquiries-S01 |
| Task ID | EP-<slug>-S0N-T0N | EP-istifta-inquiries-S01-T03 |
| Branch | feat/<story-id>-<task-id>-<slug> | feat/EP-istifta-inquiries-S01-T01-create-inquiry |
| Commit trailer | Task: <story-id>-<task-id> | + Contract-Change: yes only when the locked surface is touched |
The same workflow runs for every project type — only the one-time setup differs. The design doc defines three project types; multi-repo is an orthogonal option that works with any of them.
What it means: a brand-new project with no existing code. Specs are written from the very start, so there is never undocumented behaviour to protect.
Setup differences: the lightest path — no backfill, and you simply
skip yad-connect-repos until code exists (the brain proceeds without
code-maps; the steps are explicitly “greenfield-safe”). For UI, run Impeccable’s
craft first to create the design, then extract to seed the design language.
craft → extract) → stories — all human-gated; then test cases runs in parallel with the build halfWhat it means: an existing codebase where the team already works with AI tools. The code is real and live; the risk is new work silently breaking what exists.
Setup differences: connect every repo (yad-connect-repos) so the
brain reads what is already built; add the spec-link check so every change links to
a story; and mark the “do-not-touch” zones AI must not modify. Run
yad-backfill before a new feature touches an old one. For UI, run
Impeccable’s document first (read the current UI), then extract, then
craft new designs that match.
document → extract → craft), stories anchor to real modulesyad-backfill first: Repomix-pack that one feature → AI drafts a “describe what exists” spec → DRAFT until a human approves → only then may changes touch itWhat it means: an existing codebase and a team adopting AI for the first time. Trust must be built before AI touches anything important.
Setup differences: same wiring as Type 2, but start AI on safe tasks only
— tests, docs, refactors — with every dial at human_approve. Run the backfill step
before any new feature touches old code. Let automation be earned slowly through the trust log,
exactly as the end-first rule prescribes.
human_approve · AI assistance limited to safe tasks (tests, docs, refactors)trust-log.json, flip checks first, then implement — end-first, never the frontyad-run action: kill — back to fully manual in one moveA story tagged repos: [backend, mobile] simply runs the build half in each repo
independently — but every repo builds from the same one locked contract in the hub.
The contract-check blocks a surface bypass in either repo, so the repos can never drift apart.
| Aspect | Greenfield (new, full AI) | Brownfield + AI already | Brownfield, no AI yet |
|---|---|---|---|
| Connect repos / code-maps | Skip until code exists | Yes — connect everything | Yes — connect everything |
Backfill (yad-backfill) | Never needed | Before touching unspecced features | Before any new feature touches old code |
| Spec-link check | On from day one | Add it + mark do-not-touch zones | Add with the rest of the wiring |
| Impeccable order (UI) | craft → extract | document → extract → craft | document → extract → craft |
| AI scope at start | Full (specs from the start) | Full, minus do-not-touch zones | Safe tasks only (tests, docs, refactors) |
| Automation pace | Identical for all: every dial starts human_approve; back steps earn machine_advance via the trust log; front steps + engineer review locked human forever. | ||
A skill is an agent you invoke by name in your AI IDE — you just ask in
plain words, e.g. “run yad-epic”, adding any inputs the skill needs
(repo: backend, story: EP-…-S01, action: wire, …).
Every skill writes plain files and then stops at its gate — none of them advances
the workflow on its own. The quick table is below; full “what / how / when” cards follow.
| Skill | Half | One line |
|---|---|---|
yad-connect-repos | Setup | Register a code repo with the hub + cache its code-map. |
yad-sync-repos | Setup | Switch every connected repo to its default branch + fast-forward from origin. |
yad-connect-design | Setup | Connect a design tool (Figma-first) so yad-ui can materialize the screens. |
yad-connect-testing | Setup | Connect a testing tool (Playwright-first) so yad-test-cases can implement the automation. |
yad-analysis | Front | (Optional) pressure-test an idea into analysis.md. |
yad-epic | Front | Start a feature: write epic.md, assign the ID. |
yad-architecture | Front | Author architecture.md + the locked contract.md. |
yad-ui | Front | Author ui-design.md + DESIGN.md; materialize the screens in the connected design tool. |
yad-stories | Front | Break the epic into repo-tagged stories. |
yad-test-cases | Front | With the test architect, author the test cases; implement the automation when a testing tool is connected. |
yad-review-gate | Cross-cutting | Review / comment / approve / advance any gate. |
yad-hub-bridge | Cross-cutting | Run front-half reviews over real PRs/MRs and sync them back. |
yad-review-comments | Setup | Install the structured review-comment scaffolds. |
yad-spec | Build A | Spec one ready story in one repo (Spec Kit ceremony). |
yad-implement | Build B | Implement one atomic task as a small branch. |
yad-checks | Build C | Wire / run the CI gates. |
yad-pr-template | Build D | Install the PR/MR template + risk routing. |
yad-commit | Build helper | Commit one staged atomic change by the conventions. |
yad-open-pr | Build helper | Open a code-repo task PR/MR from the committed template. |
yad-ship | Build helper | Commit and open the task PR/MR in one step. |
yad-engineer-review | Build E | AI review → engineer review → merge + record. |
yad-backfill | Build G | Spec already-built / legacy code before changing it. |
yad-run | Automation | Drive the back half on the dials; set dials; kill switch. |
yad-status | Anytime | Read-only view: where everything is and what’s blocking. |
yad-connect-reposrepos.json and caches an AI-readable picture of it (a Repomix pack + a code-map of existing endpoints, events, data models and modules). Also sets up the hub’s own platform record and reviewer roster.yad-connect-repos action: connect repo: backend path: ../backend-repo domain_owners: carol,dave
yad-connect-repos action: list # see every repo as fresh / stale
yad-connect-repos action: refresh repo: backend # re-pack after the code moved
yad-connect-repos action: disconnect repo: backend
yad-connect-repos action: detect-hub # record the hub's GitHub/GitLab platform
yad roster add alice-gh --name alice --email alice@x.com --roles "hub=owner,reviewer" # reviewer roster, any time (validated vs the hub)
yad roster grant carol backend domain-owner # per-repo role; keeps repos.json domain_owners in sync
refresh when a skill warns a repo is stale. Greenfield with no code yet? Skip it entirely — the brain proceeds without it.yad-sync-reposrepos.json to its default branch and fast-forwards it from origin (your own git credentials — no tokens stored). The default branch is the registry’s default_branch when set, otherwise it falls back to origin/HEAD and then main — so default_branch is not mandatory. A repo with no remote still switches branches (no fetch). A working-tree-only maintenance op — never a gate and it never writes the registry. A repo with uncommitted changes is skipped and reported, never overwritten; a diverged branch is left for you to resolve (fast-forward only).yad repo sync # switch every connected repo to its default branch + ff pull
yad repo sync backend # just one repo
yad repo refresh to re-pack.yad-connect-designpencil is a second provider). It records the tool + project/file references in design.json through your own authenticated MCP session — no tokens are ever stored — and degrades to markdown-only when no design-tool MCP is available.yad-connect-design action: connect tool: figma project_url: https://figma.com/files/project/…
yad-connect-design action: list # show the connection + whether the MCP is available
yad-connect-design action: refresh # re-detect the MCP (after authenticating a session)
yad-connect-design action: disconnect
yad-ui simply authors the Markdown, exactly as before.yad-connect-testingcypress and pytest are second providers). It records the tool + project/suite references in testing.json through your own authenticated MCP session — no tokens are ever stored — and degrades to artifacts-only when no testing-tool MCP is available.yad-connect-testing action: connect tool: playwright project_url: tests/playwright.config.ts
yad-connect-testing action: list # show the connection + whether the MCP is available
yad-connect-testing action: refresh # re-detect the MCP (after authenticating a session)
yad-connect-testing action: disconnect
yad-test-cases simply authors the test cases, exactly as before.yad-connect-learningnpx) — it ships no MCP — so this skill detects the deeptutor binary on PATH and optionally builds a project knowledge base from the SDLC artifacts + secret-scanned code-maps. It records the connection in learning.json — no tokens are ever stored — and degrades to harness-native tutoring when DeepTutor isn't installed.yad-connect-learning action: connect tool: deeptutor
yad-connect-learning action: list # show the connection + whether the CLI is available
yad-connect-learning action: refresh # re-detect the CLI + rebuild the knowledge base
yad-connect-learning action: disconnect
yad-learn still tutors using the harness model reading your artifacts.yad-learnyad-status rolls up the local records). Purely opt-in — it never blocks a gate and never touches epic state, approvals, or the contract lock.run yad-learn — concept: "contract versioning" epic: EP-istifta-inquiries stage: architecture-review
yad-learn action: list # your local skills-log records for this epic
yad-learn action: complete concept: "contract versioning" # mark it learned
yad-analysis (optional)analysis.md. It assigns the epic’s EP-<slug> ID and seeds the state files.run yad-analysis — idea: "let users submit religious inquiries and track answers"
yad-epicepic.md. The analyst shapes the idea, the pm writes the epic. If analysis didn’t run, this is the entry point: it assigns the EP-<slug> ID and seeds .sdlc/ state. If repos are connected, it reads their code-maps so the epic references what already exists.run yad-epic — feature: "inquiry submission and tracking"
yad-architecturearchitecture.md) and writes the locked contract (contract.md) — the one shared surface (APIs, events, data model) every repo must obey. It hash-locks the contract surface into contract-lock.json. Code-aware: it cross-checks the surface against existing endpoints before locking.run yad-architecture — epic: EP-istifta-inquiries
yad-uiui-design.md (this feature’s screens and flows) + DESIGN.md (the reusable design language). Drives Impeccable’s document / extract / craft commands when installed; writes the files directly when not (and records that). When a design tool is connected (yad-connect-design), it also materializes the screens in that tool — generating them from the spec or linking an existing design — and records the screen→frame map in design-links.json; otherwise it stays markdown-only.run yad-ui — epic: EP-istifta-inquiries
yad-storiesstories/, with stable IDs (EP-<slug>-S01…) and a repos: tag naming which code repos must implement each one. Reads epic + architecture + contract + UI as input.run yad-stories — epic: EP-istifta-inquiries
ready-for-build — the build half can start, and yad-test-cases opens in parallel.yad-test-casestest-cases.md (cases prioritised P0–P3, with story→case traceability). When a testing tool is connected (yad-connect-testing), it also implements the automation tests in that tool — generating them into the connected code repo(s) or linking an existing suite — and records the case→test map in test-links.json; otherwise it stays artifacts-only. Reads epic + architecture + contract + UI + stories as input.run yad-test-cases — epic: EP-istifta-inquiries
ready-for-build, so this runs alongside the build half, not before it. Stops at its own test-cases review gate (base rule); that review never blocks building.yad-review-gateyad-review-gate epic: EP-istifta-inquiries artifact: epic.md action: open # present it for review
yad-review-gate … action: comment # record a reviewer's notes (never advances)
yad-review-gate … action: approve # record an approval (name + role)
yad-review-gate … action: sync # pull approvals/comments from the hub review PR
yad-review-gate … action: advance # move on — only if the rule is met, else it names who's missing
open → comment → approve → advance for the file-only gate; add sync when the hub is on a platform and reviewers worked on the PR.yad-hub-bridgegh/glab recipes that pull platform approvals and comments back into the files. The file ledger always stays the source of truth.open/sync). You call it directly once, to wire the event-driven sync CI:yad-hub-bridge action: wire # hub CI runs `yad gate ci` on every approve / request-changes / merge
gh/glab? Everything degrades to the file-only gate with no error — you never need this skill.yad-review-commentsREVIEW_COMMENTS.md on GitHub / comment templates on GitLab), so reviewers leave structured, attributable feedback — each comment carries a **name (role)** header that maps cleanly into the file ledger.yad-review-comments repo: backend action: wire
yad-review-comments repo: hub action: wire
yad-spec — Build Step Aspecify → clarify → plan → analyze → checklist → tasks — writing specs/<story-id>/ inside the code repo plus a link.md back to the story. It quotes the locked contract; it never widens it. Drives /speckit.* when installed, authors the same files by hand when not.yad-spec story: EP-istifta-inquiries-S01 repo: backend
ready-for-build story — once per repo the story is tagged with. The tasks it produces feed yad-implement.yad-implement — Build Step Btasks.md as a small diff (≤3 files) on its own branch: one task = one branch = one commit = one PR. The diff must stay inside the files the task declared — if it would grow, the skill flags it and STOPS. The commit follows the convention (Conventional subject, Task: trailer, optional AI co-author, Contract-Change: yes only if the locked surface is touched).yad-implement story: EP-istifta-inquiries-S01 repo: backend task: T01
# then commit + open the PR with the CLI:
yad commit --type feat -m "create inquiry endpoint" --ai claude
yad open-pr --repo backend
T01, T02, …). It hands off to the check gates — never merges anything itself.yad-checks — Build Step Cci/chore/build/test commits are exempt), contract-check (a contract-surface diff without a re-locked contract FAILS), build/test/lint, verified-commits (signed commits from roster-known authors), and the pattern gates — commit-message (Conventional subject + trailer order), pr-title, and pr-template (the PR/MR body uses the template). The pattern gates are profile-aware (code|hub), so they run on code repos and the product hub. wire installs them into the repo’s CI (merging with any existing CI, never clobbering); run executes them right now, locally.yad-checks repo: backend action: wire # once, during setup
yad-checks repo: backend action: run # before opening each PR
yad-checks repo: hub action: wire # hub-flavored gates for the product hub
wire once per repo at setup; run after implementing, before the PR — the same gates also run automatically in CI on every PR and must pass before merge.yad-pr-template — Build Step Dhigh risk level — or a touched contract/auth/payments surface — routes the review to the domain owners. route reads a PR body and prints exactly who must review it. It also ships the pr-title.sh / pr-template.sh gate scripts that yad-checks runs.yad-pr-template repo: backend action: wire # once, during setup
yad-pr-template repo: backend action: route # who must review this PR?
yad-pr-template repo: hub action: wire # the hub's front-half review template
wire once per repo (and the hub) at setup; route whenever you’ve opened a PR and want the required reviewer list.yad-commit — Build helperTask → Contract-Change → Co-Authored-By), and a ≤3-file atomic guard. The human git author owns the commit; an assisting AI is recorded only as a Co-Authored-By footer chosen per-commit with --ai (default none, human-only).yad commit --type feat -m "add the inquiry endpoint" --ai claude
yad commit --type fix -m "handle null user" --dry-run # preview only
yad-open-pr — Build helperyad open-pr --repo backend --risk low
yad-ship — Build helperyad-commit then yad-open-pr — the PR step runs only if the commit lands (a failed commit, tripped guard, or --dry-run stops before pushing). It never merges.yad ship --type feat -m "add the inquiry endpoint" --ai claude --repo backend --risk low
yad-engineer-review — Build Step Eai-review triggers the advisory AI pass (CodeRabbit — a second set of eyes, never the authority); approve records the human engineer approval (owner + 1 reviewer, same escalation); ship merges and records the ship in build-log.json, moving the story to in-build → shipped so the epic → story → task → PR chain stays traceable.yad-engineer-review story: EP-istifta-inquiries-S01 task: T01 repo: backend action: ai-review
yad-engineer-review … action: approve # the human engineer's approval
yad-engineer-review … action: ship # merge + record in build-log.json
yad-backfill — Build Step Gyad-backfill repo: backend feature: health # globs e.g. src/health/**
yad-runmachine_advance → it proceeds alone; human_approve → it stops for you. Any failure, scope overrun, or contract-surface touch halts and pulls in a human, and it always stops at the engineer review. Every run lands in the trust log. It also flips dials (refusing without enough evidence) and owns the kill switch.yad-run story: EP-istifta-inquiries-S02 repo: backend # drive the back half on the dials
yad-run action: set-dial step: checks to: machine_advance # earn automation (needs trust evidence)
yad-run action: set-dial step: checks to: human_approve # revert — always allowed
yad-run action: kill # everything back to human, system-wide, instantly
yad-run action: unkill # restore earned automation
kill the moment anything feels wrong.yad-statusyad-status # everything, across epics (fleet view)
yad-status EP-istifta-inquiries # one epic in detail
The yad CLI is the deterministic half of the system — the skills think,
the CLI does the predictable file-and-platform work. It’s published to npm as
yadflow; run it from your product hub repo with
npx — no clone needed, nothing to install globally.
npx yadflow setupcd <product-hub-repo>
npx yadflow setup
… check / … check --fix / … updatecheck is read-only: it reports what is missing (never installed), outdated/drifted (the workflow shipped a newer version), or stale (a repo’s cached code picture is behind its code). check --fix reconciles all of it — filling gaps and applying updates while touching nothing that is already correct. update applies drift only (an alias for check --fix --scope=changed).npx yadflow check # just tell me — read-only
npx yadflow check --fix # and fix it
npx yadflow update # apply updates only
check changes nothing.… --versionnpx yadflow --versionyad gate …)yad gate open <epic> <artifact>in_review.yad gate open EP-istifta-inquiries epic.md
yad-review-gate skill file-only instead.)yad gate sync <epic> [artifact]approvals.json, comments.json, reviews/*.md) using your own gh/glab login — and auto-advances the step once three things hold: the approval rule is satisfied, every comment thread is resolved, and the PR is merged. Approvals are revoked automatically if the artifact changed since they were given.yad gate sync EP-istifta-inquiries # all open reviews of the epic
yad gate sync EP-istifta-inquiries epic.md # just this one
yad gate comments <epic> [artifact]yad gate comments EP-istifta-inquiriesin_review and you want the to-do list of open feedback.yad gate status <epic>yad gate status EP-istifta-inquiriesyad gate ci [--branch <head>] [--pr <n>]review/EP-* branch, runs the same sync, and commits only the ledger files to the hub’s default branch. With no --branch it sweeps every open review PR. CI never approves and never merges — the merge click stays human.yad-gate-sync.yml) calls it on every approve / request-changes / merge.yad commit --type <t> -m <subject>feat: …), derives the Task: trailer from your branch name, optionally appends an AI Co-Authored-By:, adds Contract-Change: yes only when you say so, and refuses a non-atomic stage (changes outside the task’s declared files).yad commit --type feat -m "create inquiry endpoint" --ai claude
yad commit --type fix -m "handle empty answer" --contract-change # only if the locked surface moved
yad commit --type feat -m "…" --dry-run # preview without committing
yad-implement. Flags: --type, -m/--message, --task, --ai claude|copilot|cursor|coderabbit|none, --contract-change, --dry-run, --force (bypass the atomic guard — use sparingly).yad open-pr [--repo <name>] [--risk <level>]yad open-pr --repo backend
yad open-pr --repo backend --risk high # routes review to the domain owners
yad open-pr --repo backend --contract-change # declares a locked-surface change
yad-checks action: run is green — one PR per atomic task.yad repo list / yad repo refresh [name]list shows every connected code repo as fresh (the cached code-map still matches the code) or stale (the repo has moved since it was packed). refresh deliberately re-packs a stale one. Staleness is a human decision — skills warn and point here; they never silently re-pack.yad repo list
yad repo refresh backend
list any time you wonder how current the brain’s picture is; refresh when a front-half step flags a stale repo before authoring against it.yad roster list | add | grant | revoke | removehub.json (platform login → SDLC name + per-scope roles) any time, not just during yad setup. add upserts a member then walks each connected repo asking for their role; grant/revoke set one directly. A domain-owner grant keeps repos.json domain_owners in sync, and list flags any drift between the two.yad roster list
yad roster add carol-gh --name carol --email carol@x.com --roles "hub=reviewer backend=domain-owner"
yad roster grant carol backend domain-owner # one per-repo role; syncs repos.json
yad roster revoke carol backend domain-owner
yad roster remove carol-gh
| Flag | Meaning |
|---|---|
--dir <path> | Target a project other than the current directory. |
--force | Re-copy unchanged files during install, or bypass the commit atomic guard. |
Yadflow sits in the spec-driven / AI-governed development market. The honest headline first: as of mid-2026, no single tool on the market offers the exact same package — a team-gated, file-driven SDLC with a hash-locked multi-repo contract and evidence-based (“earned”) automation. But many tools cover slices of it, several with far bigger communities, and one (AWS AI-DLC) shares almost the same philosophy. This section maps them honestly. (Market facts checked via web research on 2026-06-12; sources at the end.)
Yadflow is really five capabilities in one. Each competitor below is strong in one or two pillars and absent in the rest:
| Pillar | What it means | Who else has it |
|---|---|---|
| 1 · Spec-driven authoring | Write the thinking (spec/plan/tasks) before code. | Almost everyone — Spec Kit, Kiro, BMAD, OpenSpec, GSD, Tessl. |
| 2 · Team review gates | Named humans must approve each step; rules + escalation. | AI-DLC (rituals, not records) · enterprise platforms (policies). Rare elsewhere — most tools are solo. |
| 3 · Multi-repo contract | One locked cross-repo surface that CI enforces. | Essentially nobody. The clearest differentiator. |
| 4 · Brownfield support | Spec what already exists before changing it. | OpenSpec (delta specs) · Kiro (steering files) · Repomix-style packers. |
| 5 · Earned, reversible automation | Automation unlocked by recorded evidence; kill switch. | Essentially nobody — others are either always-manual or always-auto. |
specify → clarify → plan → tasks → analyze → checklist → implement slash-commands plus a project “constitution”. Free, open source.requirements.md (EARS syntax) → design.md → tasks.md, plus automated hooks and steering files. Free tier; Pro $20 / Pro+ $40 / Power $200 per month.specs/ records current behaviour, each change is a self-contained package with delta specs (“what’s changing”), through a Propose → Validate → Apply → Archive state machine.yad-backfill, and its change-isolation parallels the one-task-one-branch discipline. Reviewers in the market consistently rank it the best pure brownfield tool..tessl/, teaches any MCP-compatible agent a spec-driven workflow, and runs a Spec Registry of 10,000+ library specs to stop API hallucinations. Exploring “spec-as-source” — specs literally generating the code.| Capability | Yadflow | BMAD | Spec Kit | Kiro | AI-DLC | OpenSpec | GSD | Tessl |
|---|---|---|---|---|---|---|---|---|
| Spec-driven authoring | ✅ (drives Spec Kit) | ✅ | ✅ | ✅ | ✅ | ✅ deltas | ✅ light | ✅ |
| Full lifecycle (idea → ship) | ✅ | ✅ | ❌ spec only | ✅ in-IDE | ✅ | ❌ change only | ✅ thin | ❌ |
| Named-human team gates (rules + escalation + ledger) | ✅ | ❌ solo | ❌ | ❌ self-approve | ◐ rituals, no ledger | ❌ | ❌ | ❌ |
| Locked multi-repo contract (hash + CI enforcement) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ◐ library specs only |
| PR/MR-native reviews (GitHub and GitLab) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Brownfield (spec what exists, gate changes) | ✅ backfill, human-verified | ◐ document-project | ❌ | ◐ steering | ◐ | ✅ best-in-class deltas | ❌ | ◐ |
| Earned automation (trust log + threshold) | ✅ | ❌ | ❌ | ❌ hooks ≠ earned | ❌ always manual | ❌ | ❌ always auto | ❌ |
| One-move kill switch | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| All state = plain files in git | ✅ | ✅ | ✅ | ◐ IDE-bound | ✅ | ✅ | ✅ | ◐ platform |
| IDE/agent-agnostic | ✅ 4 harnesses | ✅ | ✅ 30+ | ❌ its own IDE | ✅ | ✅ | ❌ Claude Code | ✅ MCP |
| Cost / license | Free, on npm | Free MIT | Free MIT | Freemium → $200/mo | Free (awslabs) | Free | Free | Commercial |
| Community size (≈ stars) | tiny (new) | ~46.7k | ~93k | product (n/a) | new | growing | ~61k | startup |
✅ = has it · ◐ = partially / different form · ❌ = doesn’t have it. Star counts and versions as reported by market coverage, May–June 2026.
| Your situation | Strongest choice | Why |
|---|---|---|
| Solo dev, greenfield, speed first | GSD or bare Spec Kit | Minimum ceremony, fastest loop. Governance would be dead weight. |
| Solo dev, big brownfield codebase | OpenSpec | Delta specs are the lightest safe way to change existing code alone. |
| Want a polished commercial IDE, AWS shop | Kiro | Best UX; specs + hooks out of the box; budget required. |
| One developer driving a full lifecycle with AI roles | BMAD-METHOD | The full agent crew without the team machinery. |
| A real team (2+ engineers), multiple repos, production stakes, who must prove who approved what | Yadflow | The only file-driven tool with named-human gates, a hash-locked cross-repo contract enforced in CI, PR-native reviews on GitHub and GitLab, and automation that must earn trust and can be killed in one move. |
| Enterprise wanting a managed platform + dashboards | Augment Cosmos / Azure+GitHub agentic SDLC | Control-plane governance at platform price — the opposite trade to “plain files in git”. |
MarkTechPost — 9 Best AI Tools for Spec-Driven Development in 2026 ·
martinfowler.com — Understanding Spec-Driven Development: Kiro, spec-kit, and Tessl ·
spec-compare — research comparing 6 SDD tools ·
Augment Code — Best Spec-Driven Development Tools ·
Reenbit — BMAD vs Spec Kit vs OpenSpec ·
AWS — Open-Sourcing AI-DLC Adaptive Workflows ·
awslabs/aidlc-workflows ·
Zenn — AI-DLC: extreme decision-making via mob work ·
Hightower — GSD vs Spec Kit vs OpenSpec vs Taskmaster ·
Somnio — Spec Kit, OpenSpec and GSD compared ·
OpenSpec — concepts ·
Microsoft — an end-to-end agentic SDLC on Azure + GitHub ·
Augment Code — AI SDLC reference architecture ·
plus this repo’s own RESEARCH-NOTES.md (verified tool facts, 2026-06-04).