/ba-develop — Du PRD au code/ba-develop — From PRD to code
Une fois qu'un PRD a passé l'audit (score GO ≥ 80), /ba-develop <APP>/<MODULE> orchestre 6 phases séquentielles pour générer le code complet d'un module. Le run est entièrement autonome : il ne s'arrête jamais et ne pose aucune question en cours de route — tout ce qui exigerait une décision humaine est consigné comme blocker et remonté uniquement dans le rapport final.
Once a PRD passes audit (GO score ≥ 80), /ba-develop <APP>/<MODULE> orchestrates 6 sequential phases to generate the full module code. The run is fully autonomous: it never halts and never asks a question mid-run — anything that would need a human decision is recorded as a blocker and surfaced only in the final report.
/ba-develop <APP>/<MODULE> # run normal (les phases dont le gate passe sont sautées)
/ba-develop <APP>/<MODULE> --force # régénération complète
/ba-develop <APP>/<MODULE> --allow-dirty
Vue d'ensemble du pipelinePipeline at a glance
Chaque phase tourne dans son propre subagent avec UNE slice du PRD. Entre les phases, des gates auto-réparants : sur un échec, le pipeline tente de corriger lui-même (max 25 tentatives par item) ; un échec non réparable est différé en blocker et le run continue jusqu'au bout. Les audits symétriques (audit-dev-api côté backend, audit-dev-frontend côté frontend) verrouillent l'alignement entre le pagespec (source de vérité métier) et le code généré.
Each phase runs in its own subagent with ONE PRD slice. Between phases, self-healing gates: on failure the pipeline tries to fix things itself (max 25 retries per item); an unhealable failure is deferred as a blocker and the run continues to the end. The symmetric audits (audit-dev-api on the backend, audit-dev-frontend on the frontend) lock the alignment between the pagespec (business source of truth) and the generated code.
Détail des 6 phasesThe 6 phases in detail
Chaque phase est un subagent isolé qui reçoit UNE slice du PRD. Un gate vérifie compilation + tests + audit dédié ; sur échec, il s'auto-répare (max 25 tentatives par item) puis diffère en blocker. Each phase runs as an isolated subagent that receives ONE PRD slice. A gate verifies compile + tests + dedicated audit; on failure it self-heals (max 25 retries per item) then defers as a blocker.
| PhasePhase | NomName | Skills mobiliséesMobilised skills | SortieOutput | GateGate |
|---|---|---|---|---|
| 0 | Core Foundation SeedCore Foundation Seed | backend-core-seed |
Navigation, rôles, permissions de l'appApp navigation, roles, permissions | build + tests |
| 1 | Entities (Domain + Data)Entities (Domain + Data) | backend-data-layer, backend-seed-data |
Entités, EF configs, migrations, seedEntities, EF configs, migrations, seed | build + tests |
| 2a | API Integration (Business + API)API Integration (Business + API) | backend-business-layer, backend-controller |
CQRS, validators, controllers RBAC, actions custom alignées sur le pagespecCQRS, validators, RBAC controllers, custom actions aligned with the pagespec | build + tests + /audit-dev-api |
| 2b | API Screen-driven — retirée du chemin canonique (les apps générées routent en [NavRoute] ; cette strate n'est plus générée pour un nouveau module)API Screen-driven — removed from the canonical path (generated apps route via [NavRoute]; this stratum is no longer generated for a new module) |
— | — | — |
| 3 | Frontend (7 sous-phases : auth, thème, layout, primitives, pages, API client, i18n)Frontend (7 sub-phases: auth, theme, layout, primitives, pages, API client, i18n) | scaffold-theme, scaffold-layout, frontend-component, frontend-api-client, frontend-auth |
Pages, routes, API client, hooks d'auth, boutons custom (kind:api → hook, kind:navigate → navigate())Pages, routes, API client, auth hooks, custom buttons (kind:api → hook, kind:navigate → navigate()) |
build + tests + /audit-dev-frontend + smoke-test |
| 4 | Acceptance TestsAcceptance Tests | scaffold-tests-from-ac, testing |
Un test [Fact] par critère d'acceptation BA (lus depuis use-case.md), corps implémentésOne [Fact] test per BA acceptance criterion (read from use-case.md), bodies implemented |
audit-dev-tests (bloquant)(blocking) |
À la sortie de la phase 4, le module est livré : compilation + tests OK, smoke-test vert, et le rapport final liste healingSummary[] (ce qui a été auto-réparé) et blockers[] (ce qui requiert votre décision).
At the end of phase 4, the module is delivered: compile + tests OK, smoke-test green, and the final report lists healingSummary[] (what was self-healed) and blockers[] (what needs your decision).
GarantiesGuarantees
- Le code appartient aux scaffolders : backend ET frontend sont générés par les CLIs déterministes (marqueur
@generated-by) — jamais écrits à la main. La personnalisation passe par le seam@customised.Scaffolders own the code: backend AND frontend are generated by the deterministic CLIs (@generated-bymarker) — never hand-written. Customisation goes through the@customisedseam. - Aucun stub : règles métier et use cases sont implémentés, pas laissés vides.No stubs: business rules and use cases are implemented, not left empty.
- FK réelles :
relations[]du PRD se traduit enHasForeignKey()+ navigation +OnDelete.Real FKs: PRDrelations[]map toHasForeignKey()+ navigation +OnDelete. - Never-halt : gates auto-réparants (max 25 tentatives/item), échec non réparable = blocker différé, aucune question en cours de run.Never-halt: self-healing gates (max 25 retries/item), unhealable failure = deferred blocker, no mid-run questions.
Propagation des actions customCustom-action propagation
Quand un pagespec déclare des actions au-delà des CRUD standard (par exemple syncFromPce kind:api ou openHistory kind:navigate), /ba-develop les propage verbatim à toutes les couches qui doivent les voir. Le champ endpoint du pagespec est l'unique source de vérité — il est compilé sans transformation dans le route attribute du Controller et dans l'URL axios du service.
When a pagespec declares actions beyond the standard CRUD (e.g. syncFromPce kind:api or openHistory kind:navigate), /ba-develop propagates them verbatim to every layer that must see them. The pagespec's endpoint field is the single source of truth — it is compiled without transformation into the Controller route attribute and into the service's axios URL.
| PhasePhase | Pour kind: apiFor kind: api |
Pour kind: navigateFor kind: navigate |
|---|---|---|
| 2 (Business) | Recette canonique ou stub NotImplementedException avec // TODO[UC-…]Canonical recipe or NotImplementedException stub with // TODO[UC-…] |
— |
| 2 (Controller) | [HttpVerb("<endpoint>")] + [RequirePermission("…")] |
— |
| 3 (Service.ts) | apiClient.<verb>('/api/.../<endpoint>') + hook React QueryReact Query hook |
— |
| 3 (Bouton) | Importe le hook + appelle .mutate() au clicImports the hook + calls .mutate() on click |
Importe useNavigate + appelle navigate(targetRoute). Aucun hook, aucun appel axios.Imports useNavigate + calls navigate(targetRoute). No hook, no axios call. |
| Gate Phase 2Phase 2 gate | Cross-check : chaque kind:api du pagespec doit avoir un [HttpVerb("<endpoint>")] matching côté Controller, sinon la phase échoue.Cross-check: every pagespec kind:api action must have a matching [HttpVerb("<endpoint>")] on the Controller, otherwise the phase fails. |
Les audits dev symétriques verrouillent l'alignement après génération : The symmetric dev audits lock the alignment after generation:
| PhasePhase | Audit exécuté automatiquementAudit invoked automatically | Règles bloquantesBlocking rules |
|---|---|---|
| 2 (Backend) | audit-dev-api --mode audit |
DEV-API-010 (pagespec → controller), DEV-API-011 (warn) |
| 3 (Frontend) | audit-dev-frontend --mode audit |
DEV-UI-019 / DEV-UI-020 / DEV-UI-021 |
Garantie de fin de pipeline — un drift entre pagespec et Controller (cas classique : POST /sync-from-pce côté frontend, [HttpPost("sync-from-proconcept")] côté backend → 405 garanti) est détecté au gate avant Phase 3 et auto-réparé ; s'il n'est pas réparable, il est consigné en blocker avec un message précis (« Controller manquant pour action <endpoint> du pagespec <file> »). Aucune interaction n'est requise pendant /ba-develop — à la fin du run, le rapport final vous dit exactement ce qui a été réparé et ce qui attend votre décision.
End-of-pipeline guarantee — any drift between pagespec and Controller (classic case: POST /sync-from-pce on the frontend, [HttpPost("sync-from-proconcept")] on the backend → guaranteed 405) is detected at the gate before Phase 3 and self-healed; if unhealable, it is recorded as a blocker with a precise message ("Controller missing for action <endpoint> from pagespec <file>"). No interaction is required during /ba-develop — at the end of the run, the final report tells you exactly what was healed and what awaits your decision.
Trois niveaux d'orchestrationThree orchestration levels
Selon la portée du travail, trois entrées sont disponibles. Elles partagent toutes le même moteur (les 6 phases ci-dessus) mais varient en cardinalité. Depending on the scope of work, three entry points are available. They all share the same engine (the 6 phases above) but vary in cardinality.
| PortéeScope | SkillSkill | LitReads | EffetEffect |
|---|---|---|---|
| 1 modulemodule | /ba-develop <APP>/<MODULE> |
prd.md + slices + pagespecs/*.md |
6 phases séquentielles sur ce module6 sequential phases on that module |
| 1+ applicationsapplications | /ba-create-plan-development <APP1> [APP2]… |
entité.md des appsof the apps |
Construit le graphe FK cross-module + tri topologique → dev-plan.mdBuilds cross-module FK graph + topological sort → dev-plan.md |
| Exécution du planPlan execution | /ba-develop-plan [--waves 1,2] |
dev-plan.json |
Lance une vague à la fois ; dans chaque vague, un /ba-develop par module en parallèle ; gate entre vaguesRuns one wave at a time; within a wave, one /ba-develop per module in parallel; gate between waves |
Cycle multi-module — comment ça marcheMulti-module cycle — how it works
Le multi-module fonctionne en deux temps : Multi-module works in two steps:
- Génération du plan :
/ba-create-plan-development APP_A APP_Blit chaqueentité.md, détecte les FK cross-module, trie les modules par dépendance en vagues parallélisables, et écritdev-plan.json.Plan generation:/ba-create-plan-development APP_A APP_Breads everyentité.md, detects cross-module FKs, sorts modules by dependency into parallelisable waves, and writesdev-plan.json. - Exécution du plan :
/ba-develop-plantraite une vague à la fois. Dans chaque vague, il lance un subagent/ba-developpar module en parallèle ; une fois les N modules terminés, un gate compile + tests sur l'ensemble doit passer avant la vague suivante.Plan execution:/ba-develop-planprocesses one wave at a time. Within each wave it launches one/ba-developsubagent per module in parallel; once the N modules complete, a compile + tests gate over the whole set must pass before the next wave starts.
Exemple : un plan à 3 vagues sur 2 applications. Example: a 3-wave plan over 2 applications.
| VagueWave | Modules développés en parallèleModules developed in parallel | Gate de sortieExit gate |
|---|---|---|
| 1 | APP_A/Module_A1, APP_A/Module_A2, APP_B/Module_B1 |
compile + tests des 3 modulescompile + tests of the 3 modules |
| 2 | APP_A/Module_A3, APP_B/Module_B2 |
compile + tests des 2 modulescompile + tests of the 2 modules |
| 3 | APP_B/Module_B3 |
smoke-test finalfinal smoke-test |
Pourquoi des vagues ? Un module qui possède une entité référencée comme FK par un autre module doit être livré avant ses dépendants. Les vagues encodent cet ordre tout en autorisant le maximum de parallélisme. Why waves? A module whose entity is referenced as an FK by another module must ship before its dependents. Waves encode that ordering while allowing maximum parallelism.
Outil de remédiation — projets legacyRemediation tool — legacy projects
Pour les projets qui ont été développés avant la propagation typée des actions (custom actions en texte libre dans screen.md, drifts pagespec / Controller / service.ts accumulés), un CLI standalone cartographie les désalignements sans rien modifier par défaut :
For projects developed before typed action propagation existed (free-text custom actions in screen.md, accumulated pagespec / Controller / service.ts drifts), a standalone CLI maps the misalignments without modifying anything by default:
npx tsx templates/skills/development/audit-dev-frontend/cli/audit-dev-actions-alignment/index.ts `
--project-path "<chemin>/web/<app>-web" `
--backend-path "<chemin>" `
--module-path "<chemin>/.smartstack/ba/<APP>/<MODULE>" `
--mode report-only
Sortie : _audit/actions-alignment.md listant les drifts par catégorie (ACTION-DRIFT-001..005) avec, pour chaque drift, le pagespec / Controller / service concerné et la commande de correction. Le mode --mode apply existe (opt-in) avec --source-of-truth pagespec|controller pour choisir qui gagne — toujours à utiliser avec un commit propre derrière.
Output: _audit/actions-alignment.md listing drifts per category (ACTION-DRIFT-001..005) with, for each, the affected pagespec / Controller / service and the fix command. The --mode apply mode exists (opt-in) with --source-of-truth pagespec|controller to choose who wins — always use it with a clean commit behind.
Quand l'utiliser : on hérite d'un projet ancien ; on observe un bug HTTP 405 / 404 sur un bouton ; on veut auditer un module avant de le migrer au format custom actions typé. When to use it: inheriting an old project; observing a 405 / 404 HTTP bug on a button; auditing a module before migrating it to typed custom actions.
Dans quel cas ?Which situation, which command?
| Je suis dans ce cas…I am in this situation… | …alors je fais…then I do |
|---|---|
| Le PRD d'un module vient de passer GO ≥ 80A module's PRD just passed GO ≥ 80 | /ba-develop <APP>/<MODULE> |
| Un run précédent s'est interrompu (coupure, session)A previous run was interrupted (crash, session) | relancer /ba-develop <APP>/<MODULE> — les phases dont le gate passe sont sautéesre-run /ba-develop <APP>/<MODULE> — phases with a passing gate are skipped |
| Le PRD a changé, je veux tout régénérerThe PRD changed, I want a full regeneration | /ba-develop <APP>/<MODULE> --force |
| Plusieurs modules interdépendantsSeveral interdependent modules | /ba-create-plan-development puis /ba-develop-plan (vagues parallèles)/ba-create-plan-development then /ba-develop-plan (parallel waves) |
| Le rapport final liste des blockersThe final report lists blockers | traiter chaque blocker (corriger le doc BA, arbitrer, régénérer la slice) puis relancer le runaddress each blocker (fix the BA doc, adjudicate, regenerate the slice) then re-run |
| Un bouton renvoie 404/405 sur un vieux projetA button returns 404/405 on an old project | le CLI de remédiation audit-dev-actions-alignment (section ci-dessus)the audit-dev-actions-alignment remediation CLI (section above) |
| Je veux vérifier une fonctionnalité livrée de bout en boutI want to verify a delivered feature end-to-end | /validate-feature |
Skills orchestréesOrchestrated skills
La table ci-dessous liste toutes les skills mobilisées (planification, backend, frontend, audits, tests) : The table below lists every mobilised skill (planning, backend, frontend, audits, tests):
Skills orchestrées par /ba-develop
Skills orchestrated by /ba-develop
business-analyse (1)
/ba-create-plan-development
business-analyse
Generates a phased development plan ordering modules by their cross-module data-model dependencies. Reads entité.md across selected applications, builds a dependency graph, topological-sorts into parallel development waves, and writes dev-plan.md. Invoke between the BA audit phase and /ba-develop.
<APP1> [APP2] …devApi (3)
/audit-dev-api
devApi
Audit code generated by the API phase against the PRD slice — controllers, routes, HTTP actions, RBAC attributes, DTOs, integration tests
/audit-dev-external-api
devApi
Audit the PUBLIC (third-party, machine-to-machine) API surface of a generated client extension — whitelisted route prefix, seeded catalogue row, catalogue-permission ↔ compiled-constant parity, mandatory tenantId binding, server paging caps, the platform export envelope, business-layer reuse, BA declaration parity, published-contract freshness, seed-provider DI registration, grant grain and the class-level guard block (DEV-XAPI-001..014)
/audit-dev-wire
devApi
Static parity gate between the generated frontend service URLs and the generated backend controller routes. Catches the "frontend calls a URL the backend never serves" class of bugs (the 404 the user sees in the browser) BEFORE runtime. Phase 3e gate of `/ba-develop`.
devCore (1)
/audit-dev-core
devCore
Audit code generated by Phase 0 (Core Foundation Seed) — every PRD module must have nav + roles + permissions in the 6 Core providers, DI registration must be in place, the providers must be deterministic (no hand-edits), and the seeded role→permission grants must match the BA rbac.md matrices in BOTH directions (DEV-CORE-011 via derive-rbac-grants --mode check).
devData (1)
/audit-dev-data
devData
Audit the generated persistence layer against the BA data model — deterministic CLI (DEV-DAT-001/002/003/007/008/009/010 — every entity has its migration, table naming, no duplicate CreateTable, migration filenames, every declared relationship a REAL FK constraint in the Configuration AND the migration with the declared cascade, every declared **Index** — non-unique included — present in a migration, the business test dataset `jeu-de-test.md` reached its guarded `{Module}TestDataSeedDataProvider`). After-Phase-1 (Entities) gate of /ba-develop. DEV-DAT-004/005/006 stay conversational (twins: DEV-CORE-011, DEV-UI-046)
devDomain (1)
/audit-dev-domain
devDomain
Audit code generated by the Domain phase against the PRD slice — entity files, FK pairing, naming, traceability, drift detection
development/audit (3)
/audit
development/audit
Audit of generated code against SmartStack conventions (i18n, React, structure, dynamic routing, RBAC, security)
/audit-dev-customised
development/audit
Detects @customised page drift from the regenerated service/hook contract (DRIFT-001/002). A page marked `@customised` is preserved across regeneration, so it can silently drift when the generated contract changes. Runs in /ba-develop Phase 3e (especially after a `--force` regeneration).
/audit-routing-dynamic
development/audit
READ-ONLY audit of the SmartStack development skills to verify their conformance to the DB-driven dynamic routing architecture (PageRegistry + componentRegistry + DynamicRouter). Produces a textual report without modifying any skill.
development/backend (7)
/backend-business-layer
development/backend
Generates full CQRS stack — Commands, Queries, Handlers, DTOs, Validators, Service interface + implementation — on SmartStack NuGet abstractions (ICoreDbContext, MediatR, FluentValidation).
/backend-controller
development/backend
Generates the **integration-strata** API controller (generic CRUD served at /api/{module}/{section} from its [NavRoute], Swagger group "integration") with RequirePermission, auto-mapped DTO → Command conversions, and module-scoped permission classes. Consumes NuGet packages (SmartStack.Core, SmartStack.Api, MediatR). The companion **screen-driven strata** lives in /api/screens/... and is generated by `scaffold-screen-controller`.
/backend-core-seed
development/backend
Phase 0 of /ba-develop — generates one Core Foundation Seed bundle per declared application (6 IClientSeedDataProvider classes per app covering navigation + tenant↔app links + roles + permissions + role-permission mappings + dev test users) by invoking the deterministic `scaffold-core-seed` CLI. Zero creative work for the agent: the spec is built by the Studio backend (`prepareCoreSeedContext`) from the BA menu / actors / permissions and dropped to a temp file before this skill runs.
/backend-data-layer
development/backend
Generates Domain entities on the project-local ExtensionBaseEntity shim (soft-delete + domain events over SmartStack.Domain.Common.BaseEntity), domain events, EF Core configurations with schema targeting, and migrations.
/backend-screen-controller
development/backend
Generates the **screen-driven** API stratum: one controller per section exposing one endpoint per screen, payload shaped from the pagespec. Routes under /api/screens/{plural}/{action} with Swagger group "screens". Companion of `scaffold-controller` (integration stratum). Both call the SAME Business layer — rules never duplicate.
/backend-seed-data
development/backend
Generates module-scoped IClientSeedDataProvider implementations for reference data (lookup tables, enum codes — the SETUP tier, every environment), the guarded business TEST DATASET provider (jeu-de-test.md → testData[] — dev, test and qual on demand, never prod) and per-module overrides. Cross-app navigation, roles, permissions, and role-permission mappings are NOT this skill's job — they live in scaffold-core-seed (Phase 0). Output goes under Persistence/Seeding/Applications/{AppPascal}/Modules/{ModuleCode}/ to mirror the per-application module layout.
/dotnet-structure
development/backend
.NET Clean Architecture 4-layer SmartStack
development/debug (6)
/audit-bug
development/debug
Refine a user-reported bug — rephrase, classify, and cross-reference the code in the current worktree.
/debug
development/debug
Diagnose and auto-fix SmartStack dev-runner issues (backend + frontend)
/debug-backend
development/debug
Diagnose and auto-fix SmartStack .NET backend failures
/debug-frontend
development/debug
Diagnose and auto-fix SmartStack React+Vite frontend failures
/discuss-bug
development/debug
Conversational triage on a tracked bug — answer the user, decide whether to reopen the fix or re-audit, never modify code directly.
/fix-bug
development/debug
Implement a fix for a user-reported bug — edit code, verify, commit atomically with a traceable message.
development/frontend (9)
/dashboard
development/frontend
Transverse dashboard reference + scaffolder, consumed DURING development so every dashboard uses the right components, the right UI, and correct theming. It scaffolds editable, theme-compliant dashboard primitives (KpiCard, ChartCard, ListWidget, DashboardGrid, WidgetRenderer) into src/components/dashboard/ — because the package's own dashboard components are internal/not exported — and it defines the typed-widget config + the per-dashboard data contract that scaffold-component renders. Theme tokens come from scaffold-theme (--dataviz-*, --chart-*, --kpi-*).
[scaffold the dashboard primitives, or ask for the dashboard conventions]/frontend-api-client
development/frontend
Generates TypeScript service clients + React hooks (useState/useEffect) using the `api` HTTP client from @atlashub/smartstack (pre-configured, returns unwrapped data) on the canonical API strata (integration: the NavRoute-resolved /api/{module}/{section}, or screens: /api/screens/{plural}).
/frontend-auth
development/frontend
Scaffold the per-project useAuth adapter + PermissionGuard
/frontend-component
development/frontend
Generates React page components (list, detail, form) consuming @atlashub/smartstack npm package: PermissionGuard, Slot, SmartStackProvider. i18n catalogues are module-level (one JSON per module, one root key per entity); the CLI emits the already-merged full file (floor < existing < PRD) and writes it atomically.
/frontend-extension-config
development/frontend
Generates ExtensionConfig (@atlashub/smartstack) with slot definitions that mirror the <Slot name="..."> calls emitted by frontend/component.
/frontend-pwa
development/frontend
Turns a generated CLIENT SmartStack app (an @atlashub/smartstack consumer) into an installable, offline-capable PWA: faithful socle service worker (tenant/language-isolated API cache), VitePWA injectManifest wiring, web manifest + meta tags, placeholder icons, the registerSW → package update channel bridge, initOutbox() and the offline-write outbox aggregation. Fail-closed on non-client web roots and on packages without the PWA channel.
/frontend-routes
development/frontend
Generates PageRegistry registrations for SmartStack's DB-driven routing (DynamicRouter). Validates componentKey format before emission and fails loud on bad specs rather than producing silent-spinner registries.
/frontend-structure
development/frontend
React + Vite + Tailwind + SmartStack frontend structure (npm consumer of @atlashub/smartstack)
/ui-polish
development/frontend
Audits and auto-fixes React pages in a generated SmartStack frontend against the customisation-ui design system standards (CSS variable tokens, PageTemplate wrapper, DataTable/EntityCard components, lucide-react icons, semantic badges, permission keys, i18n namespaces). Produces a violation report (audit mode) or applies mechanical fixes (apply mode) based on tokens.json. Invoked after Phase 4 of ba-develop to guarantee visual consistency with the reference app.
development/run (3)
/run
development/run
Kill orphans + launch backend + frontend, auto-retry on failure
/run-backend
development/run
Kill stale .Api processes, launch dotnet run, verify /health — retry loop
/run-frontend
development/run
Kill stale Vite, npm run dev, verify /, retry loop
development/smoke-test (1)
/smoke-test
development/smoke-test
Runtime smoke-test for a freshly-generated SmartStack.app project. Starts the backend (`dotnet run`) and the frontend (`npm run dev`) in the background, waits for both to become reachable, then probes every page route and every API endpoint scaffolded by the pipeline. Fails the run if ANY endpoint returns a 4xx/5xx status code or if any page is missing from disk. Designed to be the final gate of `ba-develop` so cross-stack drift surfaces in CI rather than at the user's first manual `npm run dev`.
development/testing (3)
/development-testing-fix-build
development/testing
Auto-correct a SINGLE compilation error surfaced by the Studio's Dev Runner (dotnet CS####, tsc TS####, vite resolve). The caller provides one `BuildError` with file/line/column/code/message. Your job is to apply the MINIMUM patch to make that specific error go away, without refactoring surrounding code. Invoked by `build-fix-runner.ts` in a retry loop (max 15 iterations, convergence guard, rebuild-and-reparse after each attempt).
/development-testing-ui-test
development/testing
Phase 5 UI tests — drives dev-browser to navigate every scaffolded page, submit forms with role-based seeded users, and auto-correct failures via the existing fix-bug skill loop (max 50 iterations per test). Runs after the frontend scaffolders complete (routes + component + api-client + extension-config) and verifies the full backend ↔ frontend round-trip.
/smoke-http
development/testing
HTTP smoke prober for generated SmartStack applications. Given a list of URLs (frontend routes + backend API endpoints), fetches each one, follows redirects, applies retry-on-startup, and returns a JSON report of 200/non-200 results. Invoked after Phase 4 of ba-develop to detect broken routes and missing API endpoints before the user ever sees a 404 in the browser.
devFrontend (5)
/audit-dev-frontend
devFrontend
Audit code generated by the Frontend phase against the PRD slice — page coverage, registry wiring, lazy-import integrity, i18n namespaces, drift detection
/audit-dev-pwa
devFrontend
Audit the PWA / offline surface of a generated client app — tenant-isolated service worker markers, manifest icon chain, per-page mobile metadata, offline READ degradation, offline WRITE outbox wiring, the end-to-end IVersionedEntity rowversion chain, the registry-layout fail-closed gate and the precache cap vs built chunks (DEV-PWA-001..012)
/scaffold-layout
devFrontend
Scaffold the page wrapper (PageTemplate) of the generated client app. The app chrome — desktop header/sidebar AND the mobile shell — is rendered by @atlashub/smartstack and is never scaffolded locally.
/scaffold-theme
devFrontend
Bootstrap src/index.css with Tailwind v4 + Shoelace token overrides + design tokens from the PRD theme slice (or SmartStack defaults). Idempotent overwrite.
/scaffold-ui-primitives
devFrontend
Scaffold theme-compliant UI primitives into the client project (EntityLookup combobox, DateInput inline calendar, EnumSelect + MultiSelect dropdowns, SegmentedControl, Textarea, Switch, TruncatedText + the owned base DataTable and its ResponsiveDataTable wrapper for responsive list tables with truncation tooltips, TabStrip scrollable tab bar with arrow nudges, SectionCard titled category card with the read-first per-section edit toggle, plus the modern kit Skeleton, EmptyState, Badge, StatCard, and the URL list-state layer useListState + SavedViewsMenu). Idempotent, honors @customised marker.
infrastructure (2)
/ba-develop
infrastructure
Consumes a module's PRD on disk (`prd.md` + 3 phase slices + `pagespecs/*.md` under `.smartstack/ba/<APP>/<MODULE>/`) and drives development through 6 sequential phases (Core → Entities → API Integration → API Screen-driven → Frontend → Acceptance Tests). Fully autonomous: gates between phases auto-heal on failure (max 25 retries per item); an unhealable failure is deferred as a blocker and the run continues — it never halts and never asks the user mid-run, surfacing all blockers in the final report. Invoked after `/ba-create-prd` + `/ba-audit-prd` (dev-ready GO, score ≥ 80).
<APP>/<MODULE> [--force] [--allow-dirty]/ba-develop-plan
infrastructure
Orchestrates multi-module development across applications by executing the phased plan from /ba-create-plan-development. Reads dev-plan.json, runs a preflight check, then drives wave-by-wave execution: for each wave, launches one /ba-develop subagent per module (parallel within a wave), runs compile/test checks between waves, and reports unified results. Fully autonomous like /ba-develop: it never halts — unhealable issues (preflight not-ready, wave blockers, inter-wave compile failure) are recorded as blockers and the run continues to the end, aggregating every module's blockers in the final report.
[--waves 1,2]