@elevasis/sdk 1.25.0 → 1.26.0

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 (60) hide show
  1. package/dist/cli.cjs +18 -116
  2. package/dist/index.d.ts +165 -48
  3. package/dist/index.js +4 -435
  4. package/dist/node/index.d.ts +36 -36
  5. package/dist/test-utils/index.d.ts +99 -38
  6. package/dist/test-utils/index.js +27 -355
  7. package/dist/types/worker/adapters/clickup.d.ts +22 -0
  8. package/dist/types/worker/adapters/index.d.ts +1 -0
  9. package/dist/worker/index.js +32 -354
  10. package/package.json +2 -2
  11. package/reference/_navigation.md +11 -1
  12. package/reference/_reference-manifest.json +70 -0
  13. package/reference/claude-config/rules/organization-model.md +12 -1
  14. package/reference/claude-config/rules/organization-os.md +12 -1
  15. package/reference/claude-config/skills/om/SKILL.md +13 -5
  16. package/reference/claude-config/skills/om/operations/codify-level-a.md +109 -100
  17. package/reference/claude-config/skills/om/operations/customers.md +10 -6
  18. package/reference/claude-config/skills/om/operations/features.md +7 -3
  19. package/reference/claude-config/skills/om/operations/goals.md +10 -6
  20. package/reference/claude-config/skills/om/operations/identity.md +8 -5
  21. package/reference/claude-config/skills/om/operations/labels.md +17 -1
  22. package/reference/claude-config/skills/om/operations/offerings.md +11 -7
  23. package/reference/claude-config/skills/om/operations/roles.md +11 -7
  24. package/reference/claude-config/skills/om/operations/techStack.md +10 -2
  25. package/reference/claude-config/sync-notes/2026-05-20-om-define-helpers.md +32 -0
  26. package/reference/claude-config/sync-notes/2026-05-22-access-model-and-right-panel.md +43 -0
  27. package/reference/claude-config/sync-notes/2026-05-22-lead-gen-tenant-config.md +40 -0
  28. package/reference/claude-config/sync-notes/2026-05-22-org-model-multi-file-split.md +61 -0
  29. package/reference/cli-management.mdx +539 -0
  30. package/reference/cli.mdx +4 -532
  31. package/reference/concepts.mdx +134 -146
  32. package/reference/deployment/api.mdx +296 -297
  33. package/reference/deployment/command-center.mdx +208 -209
  34. package/reference/deployment/index.mdx +194 -195
  35. package/reference/deployment/provided-features.mdx +110 -107
  36. package/reference/deployment/ui-execution.mdx +249 -250
  37. package/reference/framework/index.mdx +111 -195
  38. package/reference/framework/resource-documentation.mdx +90 -0
  39. package/reference/framework/tutorial-system.mdx +135 -135
  40. package/reference/getting-started.mdx +141 -142
  41. package/reference/index.mdx +95 -106
  42. package/reference/packages/ui/src/auth/README.md +6 -6
  43. package/reference/platform-tools/adapters-integration.mdx +300 -301
  44. package/reference/platform-tools/adapters-platform.mdx +552 -553
  45. package/reference/platform-tools/index.mdx +216 -217
  46. package/reference/platform-tools/type-safety.mdx +82 -82
  47. package/reference/resources/index.mdx +348 -349
  48. package/reference/resources/patterns.mdx +446 -449
  49. package/reference/resources/types.mdx +115 -116
  50. package/reference/roadmap.mdx +164 -165
  51. package/reference/rules/organization-model.md +14 -0
  52. package/reference/runtime.mdx +172 -173
  53. package/reference/scaffold/operations/propagation-pipeline.md +1 -1
  54. package/reference/scaffold/recipes/extend-lead-gen.md +130 -77
  55. package/reference/scaffold/reference/contracts.md +376 -446
  56. package/reference/scaffold/reference/glossary.md +8 -6
  57. package/reference/scaffold/ui/feature-flags-and-gating.md +59 -46
  58. package/reference/scaffold/ui/feature-shell.mdx +11 -11
  59. package/reference/scaffold/ui/recipes.md +24 -24
  60. package/reference/troubleshooting.mdx +222 -223
@@ -3,7 +3,7 @@
3
3
 
4
4
  ---
5
5
  title: Build and Extend Lead Gen
6
- description: Map the lead-gen platform primitives available to SDK projects: shared UI pages, sidebar composition, data hooks, list/member state, artifacts, workflow adapters, contracts, and org-model extension boundaries.
6
+ description: Map the lead-gen platform primitives available to SDK projects: shared UI pages, provider-injected Organization Model config, data hooks, list/member state, artifacts, workflow adapters, contracts, and tenant-owned extension boundaries.
7
7
  ---
8
8
 
9
9
  # Build and Extend Lead Gen
@@ -19,42 +19,48 @@ Good trigger phrases:
19
19
  - "Read or update lead-gen lists from a workflow."
20
20
  - "Change the lead-gen lifecycle for this business."
21
21
 
22
- Lead gen is a layered platform surface, not one component:
23
-
24
- - **Organization OS:** prospecting semantics, System access, pipeline labels, and quick access live in the organization model.
25
- - **Shared UI:** lead-gen overview, lists, list detail, companies, contacts, sidebars, and drawer components live in `@elevasis/ui`.
26
- - **Headless hooks:** lists, companies, contacts, artifacts, list members, transitions, and derived actions live under `@elevasis/ui/hooks`.
27
- - **Acquisition substrate:** `acq_lists`, `acq_companies`, `acq_contacts`, `acq_artifacts`, list members, list companies, telemetry, and stateful transition shapes are exposed through generated contracts.
28
- - **Workflow adapters:** `acqDb` and `list` from `@elevasis/sdk/worker` let workflows read and mutate lead-gen data through platform tools.
29
- - **Contracts:** generated contract docs expose the current lead-gen shapes in `node_modules/@elevasis/sdk/reference/scaffold/reference/contracts.md`.
22
+ Lead gen is a layered platform surface, not one component. Shared packages own shapes, readers, runtime mechanics, and reusable UI. Tenant projects own the values that make a list builder specific to a business.
23
+
24
+ - **Organization OS:** prospecting semantics, System access, pipeline labels, quick access, stage catalogs, build templates, workflow actions, resources, and topology live in the tenant organization model.
25
+ - **Shared UI:** lead-gen overview, lists, list detail, companies, contacts, sidebars, drawer components, `useLeadGenConfig`, and list-builder state derivation live in `@elevasis/ui`.
26
+ - **Headless hooks:** lists, companies, contacts, artifacts, list members, transitions, and derived actions live under `@elevasis/ui/hooks`.
27
+ - **Acquisition substrate:** `acq_lists`, `acq_companies`, `acq_contacts`, `acq_artifacts`, list members, list companies, telemetry, and stateful transition shapes are exposed through generated contracts.
28
+ - **Core readers:** `getLeadGenStageCatalog`, `getAllBuildTemplates`, `getProspectingBuildTemplateOptions`, and `createBuildPlanSnapshotFromTemplateId` from `@elevasis/core` read caller-supplied Organization Model/template values. They do not ship tenant catalogs or default templates.
29
+ - **Workflow adapters:** `acqDb`, `list`, and `listBuilderWorkflow` from `@elevasis/sdk/worker` let workflows read and mutate lead-gen data through platform tools.
30
+ - **Contracts:** generated contract docs expose the current lead-gen shapes in `node_modules/@elevasis/sdk/reference/scaffold/reference/contracts.md`.
30
31
 
31
32
  ## Decision Table
32
33
 
33
34
  | User wants | Start here | Notes |
34
35
  | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
35
- | Change lead-gen System availability, labels, quick access, pipeline semantics, or resource descriptors | `core/config/organization-model.ts` | Treat this as Organization OS work. Use the project's configure ceremony if available. |
36
- | Add lead-gen sidebar nav or a lead-gen route | `@elevasis/ui/features/lead-gen` and `node_modules/@elevasis/sdk/reference/scaffold/ui/customization.md` | Prefer manifest/sidebar composition. Do not fork shared source first. |
37
- | Wrap a shared lead-gen page with project chrome | `LeadGenOverviewPage`, `LeadGenListsPage`, `LeadGenListDetailPage`, `ListBuilderPage`, `LeadGenCompaniesPage`, `LeadGenContactsPage` | Keep route files thin and put project-specific behavior in local feature modules. |
38
- | Build a custom campaign/list workspace | `ListBuilderPage`, `useLists`, `useList`, `useListProgress`, `useListExecutions`, `useWorkflowExecution`, `useExecutionSSE` from `@elevasis/ui` | Use the shared builder when possible; otherwise compose hooks for platform data and workflow execution. |
39
- | Render artifacts or list-member detail | `LeadGenListDetailPage`, `useArtifacts`, `useCreateArtifact`, `useListMember` | Artifacts are a substrate primitive. Keep vertical-specific rendering local until there are repeated use cases. |
40
- | Read or mutate lead-gen data inside a workflow | `acqDb` or `list` from `@elevasis/sdk/worker` | `organizationId` is injected server-side by the platform dispatcher. Do not pass it from workflow code. |
41
- | Add a new persisted lead-gen field, artifact kind, or transition API | Platform/API migration work, not just scaffold work | Update DB, core schemas/types, API service/handlers, hooks, docs, and scaffold contracts together. |
36
+ | Change lead-gen System availability, labels, quick access, stage catalogs, build templates, workflow actions, resources, or topology | `core/config/organization-model.ts` | Treat this as Organization OS work. Tenant projects own these values. Use the project's configure ceremony if available. |
37
+ | Add lead-gen sidebar nav or a lead-gen route | `@elevasis/ui/features/lead-gen` and `node_modules/@elevasis/sdk/reference/scaffold/ui/customization.md` | Prefer manifest/sidebar composition. Do not fork shared source first. |
38
+ | Wrap a shared lead-gen page with project chrome | `LeadGenOverviewPage`, `LeadGenListsPage`, `LeadGenListDetailPage`, `ListBuilderPage`, `LeadGenCompaniesPage`, `LeadGenContactsPage` | Keep route files thin and put project-specific behavior in local feature modules. |
39
+ | Build a custom campaign/list workspace | `ListBuilderPage`, `useLists`, `useList`, `useListProgress`, `useListExecutions`, `useWorkflowExecution`, `useExecutionSSE` from `@elevasis/ui` | Use the shared builder when possible; otherwise compose hooks for platform data and workflow execution. |
40
+ | Add or change list-builder workflow buttons/forms | `ui/src/config/listActions.ts` plus `ElevasisUIProvider listActions={listActions}` / `createElevasisApp({ listActions })` | The shared UI owns the registry contract. The project owns workflow ids, action keys, Zod schemas, layouts, and default inputs. |
41
+ | Render artifacts or list-member detail | `LeadGenListDetailPage`, `useArtifacts`, `useCreateArtifact`, `useListMember` | Artifacts are a substrate primitive. Keep vertical-specific rendering local until there are repeated use cases. |
42
+ | Read or mutate lead-gen data inside a workflow | `acqDb` or `list` from `@elevasis/sdk/worker` | `organizationId` is injected server-side by the platform dispatcher. Do not pass it from workflow code. |
43
+ | Add a new persisted lead-gen field, artifact kind, or transition API | Platform/API migration work, not just scaffold work | Update DB, core schemas/types, API service/handlers, hooks, docs, and scaffold contracts together. |
42
44
 
43
45
  ## Published Lead-Gen Surfaces
44
46
 
45
47
  | Surface | Import from | Use for |
46
48
  | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
47
49
  | `leadGenManifest`, `LEAD_GEN_ITEMS`, `LeadGenSidebar`, `LeadGenSidebarTop`, `LeadGenSidebarMiddle` | `@elevasis/ui/features/lead-gen` | Feature registration and sidebar composition |
48
- | `LeadGenOverviewPage`, `LeadGenListsPage`, `LeadGenListDetailPage`, `ListBuilderPage`, `LeadGenCompaniesPage`, `LeadGenContactsPage` | `@elevasis/ui/features/lead-gen` | Shared lead-gen pages you can route to or wrap |
49
- | `ListActionsProvider`, `useListActions`, `ListBuilderWorkflow`, `ListBuilderRegistry`, `LeadGenActionKey` | `@elevasis/ui/features/lead-gen` | List Builder workflow registry, slot-based field contracts, and project-owned action wiring |
50
- | `LeadGenRouteShell`, `LIST_TEMPLATE_OPTIONS`, `buildListConfig` | `@elevasis/ui/features/lead-gen` | Route shell helpers and list creation config helpers (contact/company detail surfaces are now `ContactDetailPage` / `CompanyDetailPage` from `@elevasis/ui/features/crm`) |
51
- | `useLists`, `useList`, `useListsTelemetry`, `useListProgress`, `useListExecutions`, `useCreateList`, `useUpdateList`, `useUpdateListConfig`, `useDeleteList` | `@elevasis/ui/hooks` | Headless list and telemetry data access |
50
+ | `LeadGenOverviewPage`, `LeadGenListsPage`, `LeadGenListDetailPage`, `ListBuilderPage`, `LeadGenCompaniesPage`, `LeadGenContactsPage` | `@elevasis/ui/features/lead-gen` | Shared lead-gen pages you can route to or wrap |
51
+ | `useLeadGenConfig`, `LeadGenBuildConfig`, build-state helpers | `@elevasis/ui/features/lead-gen` | Provider-backed derivation of stage catalog, build templates, default build steps, default template id, and export workflow id |
52
+ | `ListActionsProvider`, `useListActions`, `ListBuilderWorkflow`, `ListBuilderRegistry`, `LeadGenActionKey` | `@elevasis/ui/features/lead-gen` | List Builder workflow registry, slot-based field contracts, and project-owned action wiring |
53
+ | `LeadGenRouteShell` | `@elevasis/ui/features/lead-gen` | Route shell helper (contact/company detail surfaces are now `ContactDetailPage` / `CompanyDetailPage` from `@elevasis/ui/features/crm`) |
54
+ | `useLists`, `useList`, `useListsTelemetry`, `useListProgress`, `useListExecutions`, `useCreateList`, `useUpdateList`, `useUpdateListConfig`, `useDeleteList` | `@elevasis/ui/hooks` | Headless list and telemetry data access |
52
55
  | `useWorkflowExecution`, `useExecutionSSE`, `useAddCompaniesToList`, `useRemoveCompaniesFromList`, `useAddContactsToList` | `@elevasis/ui/hooks` | List Builder workflow triggering, live execution tailing, and list membership mutations |
53
56
  | `useCompanies`, `useCompany`, `useContacts`, `useContact` | `@elevasis/ui/hooks` | Acquisition company/contact data access |
54
57
  | `useArtifacts`, `useCreateArtifact`, `useListMembers`, `useListMember` | `@elevasis/ui/hooks` | Lead-gen substrate data access |
55
58
  | `useTransitionList`, `useTransitionListMember`, `useTransitionListCompany`, `useDeriveActions` | `@elevasis/ui/hooks` | Stateful transition mutations and contextual action derivation |
56
- | `ElevasisUIProvider`, `ElevasisCoreProvider`, `useElevasisServices` | `@elevasis/ui/provider` | Provider setup, API access, organization context, and `listActions` registry injection |
57
- | `acqDb`, `list` | `@elevasis/sdk/worker` | Workflow-side acquisition and list-scoped platform adapters |
59
+ | `ElevasisUIProvider`, `ElevasisCoreProvider`, `useElevasisServices` | `@elevasis/ui/provider` | Provider setup, API access, organization context, and `listActions` registry injection |
60
+ | `ElevasisSystemsProvider`, `ElevasisAuthenticatedShell` | `@elevasis/ui/provider`, `@elevasis/ui/app` | Organization Model injection for system-aware surfaces such as lead-gen config, sidebar projection, and Organization OS views |
61
+ | `getLeadGenStageCatalog`, `getAllBuildTemplates`, `getProspectingBuildTemplateOptions`, `createBuildPlanSnapshotFromTemplateId` | `@elevasis/core` | Generic Organization Model and template readers. Supply tenant templates/model values from the project. |
62
+ | `listBuilderWorkflow` | `@elevasis/sdk/worker` | Generic list-builder workflow runtime for tenant-owned step handlers |
63
+ | `acqDb`, `list` | `@elevasis/sdk/worker` | Workflow-side acquisition and list-scoped platform adapters |
58
64
 
59
65
  Read the generated contracts before changing typed boundaries:
60
66
 
@@ -137,7 +143,7 @@ function ListDetailRoute() {
137
143
 
138
144
  Use the same wrapping pattern for `LeadGenOverviewPage`, `LeadGenCompaniesPage`, and `LeadGenContactsPage`.
139
145
 
140
- For the real-time List Builder workspace, add a thin route that passes the route param into `ListBuilderPage`:
146
+ For the real-time List Builder workspace, add a thin route that passes the route param into `ListBuilderPage`:
141
147
 
142
148
  ```tsx
143
149
  import { createFileRoute } from '@tanstack/react-router'
@@ -153,26 +159,65 @@ function ListBuilderRoute() {
153
159
  }
154
160
  ```
155
161
 
156
- Register project workflow actions at the provider boundary. The shared UI owns the contract; each project owns workflow ids, action keys, default inputs, and field components.
162
+ Register project workflow actions at the provider boundary. The shared UI owns the contract; each project owns workflow ids, action keys, default inputs, and field components.
163
+
164
+ The shared pages call `useLeadGenConfig()` internally. That hook reads the provider-injected `organizationModel` and derives:
165
+
166
+ - `stageCatalog` from `getLeadGenStageCatalog(organizationModel)`
167
+ - `buildTemplates` and `defaultBuildSteps` from `getAllBuildTemplates(organizationModel)`
168
+ - `defaultBuildTemplateId` from the `sales.lead-gen` system config or first available template
169
+ - `exportWorkflowId` from the lead-gen workflow resource whose action matches export semantics
170
+
171
+ If the provider has no Organization Model, shared UI renders with empty config instead of falling back to Elevasis-owned defaults. A tenant that wants list creation and the build runner to be useful must provide lead-gen catalogs/templates/actions/resources/topology in `core/config/organization-model.ts`.
172
+
173
+ In external projects, pass the local list-action registry through the app factory and the tenant Organization Model through the authenticated shell:
174
+
175
+ ```tsx
176
+ // ui/src/main.tsx
177
+ import { createElevasisApp } from '@elevasis/ui/app'
178
+ import { listActions } from '@/config/listActions'
179
+
180
+ const App = createElevasisApp({
181
+ listActions,
182
+ // other app config...
183
+ })
184
+ ```
185
+
186
+ ```tsx
187
+ // ui/src/routes/__root.tsx
188
+ import { ElevasisAuthenticatedShell } from '@elevasis/ui/app'
189
+ import { canonicalOrganizationModel } from '@core/config/organization-model'
190
+
191
+ export function RootLayout() {
192
+ return (
193
+ <ElevasisAuthenticatedShell
194
+ systems={SYSTEM_MANIFESTS}
195
+ organizationModel={canonicalOrganizationModel}
196
+ // other shell config...
197
+ />
198
+ )
199
+ }
200
+ ```
201
+
202
+ Data sourcing mode is list-wide. Read `list.pipelineConfig.dataMode` or the workflow-side `list.getConfig()` result when a workflow must choose mock versus live sourcing. Do not add per-action `mock` / `live` controls for Apollo, crawl, enrichment, or scoring steps. Export mode is separate: `preview` versus `export` controls whether a destination write happens.
157
203
 
158
- Each registry entry declares a Zod `schema` and a `layout` of declarative field hints (`StepConfigLayout<Input>`). The shared `StepConfigForm` renders the layout, validates against the schema, and wires `value`/`onChange` for you — no per-action React components. The List Builder right column renders the form as `Configuration | Advanced | Runs` tabs with a sticky action footer; `RunWorkflowModal` renders the same form inline. Omit the `advanced:` section when a step has none.
204
+ Each registry entry declares a Zod `schema` and a `layout` of declarative field hints (`StepConfigLayout<Input>`). The shared `StepConfigForm` renders the layout, validates against the schema, and wires `value`/`onChange` for you — no per-action React components. The List Builder right column renders the form as `Configuration | Advanced | Runs` tabs with a sticky action footer. Omit the `advanced:` section when a step has none.
159
205
 
160
206
  Available field component variants: `textinput`, `textarea`, `numberinput`, `switch`, `segmented`, `select`, `multiselect`, `tags`, `json`. Field hints support `label`, `description`, `placeholder`, `min`/`max`/`step` (numbers), `options` (selects), and `when: (values) => boolean` for conditional visibility.
161
207
 
162
208
  ```tsx
163
- import * as z from 'zod'
164
- import { type ListBuilderRegistry } from '@elevasis/ui/features/lead-gen'
165
- import type { StepConfigLayout } from '@elevasis/ui/components/forms'
166
- import { ElevasisUIProvider } from '@elevasis/ui/provider'
167
- import { resourceDescriptors } from '@core/config/organization-model'
168
-
169
- const companyCleanupInputSchema = z.object({
170
- listId: z.string().uuid(),
171
- targetDescription: z.string(),
172
- dryRun: z.boolean().default(true),
173
- batchSize: z.number().int().min(1).default(20),
174
- mode: z.enum(['mock', 'live']).default('live')
175
- })
209
+ import * as z from 'zod'
210
+ import { leadGenManifest, type ListBuilderRegistry } from '@elevasis/ui/features/lead-gen'
211
+ import type { StepConfigLayout } from '@elevasis/ui/components/forms'
212
+ import { ElevasisSystemsProvider, ElevasisUIProvider } from '@elevasis/ui/provider'
213
+ import { organizationModel, resourceDescriptors } from '@core/config/organization-model'
214
+
215
+ const companyCleanupInputSchema = z.object({
216
+ listId: z.string().uuid(),
217
+ targetDescription: z.string(),
218
+ dryRun: z.boolean().default(true),
219
+ batchSize: z.number().int().min(1).default(20)
220
+ })
176
221
 
177
222
  type CompanyCleanupInput = z.infer<typeof companyCleanupInputSchema>
178
223
  const companyCleanupResource = resourceDescriptors.companyCleanup
@@ -192,24 +237,13 @@ const companyCleanupLayout: StepConfigLayout<CompanyCleanupInput> = {
192
237
  ]
193
238
  }
194
239
  ],
195
- advanced: {
196
- id: 'advanced',
197
- fields: [
198
- { path: 'batchSize', component: 'numberinput', label: 'Batch size', min: 1 },
199
- {
200
- path: 'mode',
201
- component: 'segmented',
202
- options: [
203
- { value: 'mock', label: 'Mock' },
204
- { value: 'live', label: 'Live' }
205
- ],
206
- when: () => import.meta.env.DEV
207
- }
208
- ]
209
- }
210
- }
240
+ advanced: {
241
+ id: 'advanced',
242
+ fields: [{ path: 'batchSize', component: 'numberinput', label: 'Batch size', min: 1 }]
243
+ }
244
+ }
211
245
 
212
- const listActions: ListBuilderRegistry = [
246
+ const listActions: ListBuilderRegistry = [
213
247
  {
214
248
  resourceId: companyCleanupResource.id,
215
249
  workflowId: companyCleanupResource.id,
@@ -226,24 +260,33 @@ const listActions: ListBuilderRegistry = [
226
260
  dryRun: true,
227
261
  batchSize: 20
228
262
  })
229
- }
230
- ]
231
-
232
- export function App() {
233
- return (
234
- <ElevasisUIProvider listActions={listActions} {...providerProps}>
235
- {children}
236
- </ElevasisUIProvider>
237
- )
238
- }
239
- ```
240
-
241
- Author the `schema` in a browser-safe sibling file (no Node-only imports) so it can be reused by the workflow runtime AND the UI form. See `apollo-import-schema.ts` in the platform for the canonical split pattern.
263
+ }
264
+ ]
265
+
266
+ const SYSTEM_MANIFESTS = [
267
+ leadGenManifest,
268
+ // Add any other shared/local system manifests here.
269
+ ]
270
+
271
+ export function App() {
272
+ return (
273
+ <ElevasisUIProvider listActions={listActions} {...providerProps}>
274
+ <ElevasisSystemsProvider systems={SYSTEM_MANIFESTS} organizationModel={organizationModel}>
275
+ {children}
276
+ </ElevasisSystemsProvider>
277
+ </ElevasisUIProvider>
278
+ )
279
+ }
280
+ ```
281
+
282
+ Author the `schema` in a browser-safe sibling file (no Node-only imports) so it can be reused by the workflow runtime AND the UI form. See `apollo-import-schema.ts` in the platform for the canonical split pattern.
283
+
284
+ Keep the registry in the external project, usually `ui/src/config/listActions.ts`. Do not add client workflow ids, client action keys, or client default inputs to `@elevasis/ui`.
242
285
 
243
286
  Per-section split rule (operator-grade vs power-user):
244
287
 
245
- - **Configuration:** target/limit, dry-run toggle, mode (preview/finalize), and any field an operator changes between runs.
246
- - **Advanced:** concurrency, batch size, timeouts, credential names, workflow chaining, dev-only mode toggles. Omit the `advanced:` key entirely when a step has none.
288
+ - **Configuration:** target/limit, dry-run toggle, export mode (`preview` / `export`) when the action writes to an external destination, and any field an operator changes between runs.
289
+ - **Advanced:** concurrency, batch size, timeouts, credential names, and workflow chaining. Do not put mock/live controls here; data sourcing mode is list-wide. Omit the `advanced:` key entirely when a step has none.
247
290
  - **`defaultInput`:** seeds the form before the user touches anything; must include `listId: list.id`.
248
291
 
249
292
  ## 3. Build a Custom Campaign Workspace
@@ -367,13 +410,23 @@ Keep these boundaries straight:
367
410
  - `organizationId` is injected by the platform dispatcher. Do not pass it from workflow code.
368
411
  - Persisted API shapes are owned by core/API contracts, not route-local TypeScript.
369
412
 
370
- ## 5. Customize Lead-Gen Semantics
371
-
372
- The lead-gen shell module key is `lead-gen`, the Organization OS System id is `sales.lead-gen`, and the action currently used by the shared manifest is `leadgen.lists.manage`.
373
-
374
- For feature toggles, labels, lifecycle semantics, or resource descriptors, update the project model:
375
-
376
- `core/config/organization-model.ts`
413
+ ## 5. Customize Lead-Gen Semantics
414
+
415
+ The lead-gen shell module key is `lead-gen`, the Organization OS System id is `sales.lead-gen`, and the action currently used by the shared manifest is `leadgen.lists.manage`.
416
+
417
+ For feature toggles, labels, lifecycle semantics, stage catalogs, build templates, actions, resource descriptors, or runtime topology, update the project model:
418
+
419
+ `core/config/organization-model.ts`
420
+
421
+ Tenant-owned list-builder values belong in the main Organization Model:
422
+
423
+ - stage vocabulary in lead-gen ontology catalogs
424
+ - build templates and template-step catalogs in lead-gen ontology catalogs
425
+ - action ids in the tenant action layer
426
+ - workflow resources in the tenant resources map with ontology bindings and `primaryAction`
427
+ - topology relationships in the tenant topology map
428
+
429
+ Use `core/config/extensions/*` for entity schema variants, not for list-builder stage catalogs or workflow bindings.
377
430
 
378
431
  The platform-side lead-gen stateful vocabulary is defined for:
379
432