| Release vocabulary | apps/bff/src/form-releases.ts:6 supports text, multiline, date, number, currency, select, radio and checkbox. Definitions contain ordered sections and fields, optional task screens, scalar answers, required/min/max/length constraints, bilingual copy and a hash-pinned release. | Versioned stage definitions, explicit presentation conditions and bounded rule vocabulary; reject unknown references/cycles/invalid operators; pin all stages and task screens in the same release. Compound/repeated data needs a deliberately bounded contract if product stories require it. |
| Conditions | Field, compileRelease and validateAnswers have no condition property or evaluator. Every field in a definition participates in complete validation. | Reviewed declarative conditions for visibility and active-stage validation. Define treatment of answers when a prior answer hides their branch, and whether cross-field conditions belong to presentation or owner rules. No executable CMS expressions. |
| Browser | apps/web/src/Products.tsx:19 renders every section at once. Draft UI provides Save and Submit; task UI offers information/follow-up/reviewer actions. Radio currently renders as a select. FormDraft.tsx and EmployerFields.tsx have separate field renderers. | Accessible Next/Back, stage/progress labels, visible-path review, error focus, keyboard behavior and resume. Render CMS-defined stages with a consistent registry. Keep local navigation separate from Camunda task transitions. |
| Durable wizard state | apps/bff/src/products.ts uses revision-checked pinned drafts and same-case task commands. Product draft output is draftId/releaseId/revision/answers/release. No stage cursor or completed-stage checkpoints appear in product-trpc-schemas.ts or the renderer. | Persist and validate resume state against release and answers. Invalidate later completion checkpoints when controlling answers change; preserve stale-revision and idempotent command semantics. Agree whether cursor is authoritative or only a navigation hint. |
| Contracts | draft-trpc-schemas.ts makes rendererSchemaVersion literal 1, flat section/field definitions and scalar answer records. Strict TypeBox parsers check input/output without coercion or defaults and bound final payload bytes. product-trpc.ts routes the existing owner functions. | Incrementally extend reviewed input/output vocabulary and browser-safe inferred types. Specify v1 compatibility and failure behavior for unsupported releases. Do not encode product field requirements a second time in TypeBox. |
| Camunda | atlas-product-intake.bpmn version product-v2 supports one optional pre-review follow-up then review/RFI loop. atlas-product-claim-review.bpmn product-v1 starts at review and loops on RFI. product-content.ts:15 chooses these two processes for six products. | Product-specific multi-task branches, explicit outcomes and logical form references where the requested journey crosses durable workflow stages. Reuse generic processes only when task order and owner semantics really match. Version deployment and retain compatible old processes. |
| Adapter | product-engine.ts:28 start accepts only followUpRequired; findTask accepts three element IDs; complete sends only reviewDecision. products.ts correlates process/version/task/assignee/form before projection and reconciles uncertain commands. | Extend the domain adapter for approved task transitions and versioned branch variables. Preserve exact task correlation, durable acceptance and no retransmission after ambiguous writes. Private gRPC is a separate ADR 0012 migration, not a prerequisite for wizard UX. |
| Contentful seed | seed-contentful-form.ts:17 defines field/section/form models without stages or conditions. seed-product-content.ts refuses model or entry drift before publication. product-content.ts:65 produces one primary section per product and shared information/decision screens, plus life follow-up. | Reviewed model migration and richer synthetic en-US/es-US author graphs per product. Compile and preview every reachable branch before activation; preserve old immutable release pointers and old draft behavior. |
| Tests | Product content/compiler, owner, tRPC, adapter and seed scripts exist. test-product-ui.mjs has three fixture-browser tests for incomplete save, reviewer RFI display and Spanish errors. test-product-cloud-e2e.mjs contains real HTTPS/engine proof concentrated on life/Medicare/dental; it explicitly limits content to compiled synthetic published-shaped releases. Separate disability/LTC/annuity scripts cover their owner benefit/payout rules. | Red-first journeys at React + real BFF + PostgreSQL + real Camunda, with external simulated integrations. All six need explicit positive branch paths, changed-answer path invalidation, resume/back/locale preservation, task ownership and negative-path assertions. Fixture render tests remain useful but cannot certify durable sequencing. |