@elevasis/sdk 1.44.3 → 1.46.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 (259) hide show
  1. package/dist/cli.cjs +35026 -30226
  2. package/dist/index.d.ts +1786 -808
  3. package/dist/index.js +789 -739
  4. package/dist/node/index.d.ts +105 -181
  5. package/dist/node/index.js +2 -2
  6. package/dist/test-utils/index.d.ts +901 -359
  7. package/dist/test-utils/index.js +587 -824
  8. package/dist/worker/index.d.ts +12685 -0
  9. package/dist/worker/index.js +188 -216
  10. package/package.json +4 -7
  11. package/reference/_navigation.md +161 -22
  12. package/reference/_reference-manifest.json +228 -4
  13. package/reference/claude-config.md +8 -0
  14. package/reference/core/exports.mdx +2 -0
  15. package/reference/core/index.mdx +3 -3
  16. package/reference/examples/organization-model.ts +117 -111
  17. package/reference/index.mdx +4 -4
  18. package/reference/packages/core/src/business/README.md +4 -1
  19. package/reference/packages/core/src/content/README.md +19 -0
  20. package/reference/packages/core/src/organization-model/README.md +148 -149
  21. package/reference/packages/core/src/organization-model/readiness/README.md +42 -0
  22. package/reference/packages/ui/src/features/README.md +28 -28
  23. package/reference/rules/active-change-index.md +40 -54
  24. package/reference/rules/agent-runtime.md +81 -0
  25. package/reference/rules/agent-start-here.md +71 -163
  26. package/reference/rules/deployment.md +33 -10
  27. package/reference/rules/error-handling.md +26 -0
  28. package/reference/rules/execution.md +13 -0
  29. package/reference/rules/frontend.md +10 -3
  30. package/reference/rules/observability.md +9 -1
  31. package/reference/rules/operations.md +26 -17
  32. package/reference/rules/organization-model.md +74 -88
  33. package/reference/rules/organization-os.md +71 -88
  34. package/reference/rules/package-taxonomy.md +11 -2
  35. package/reference/rules/platform.md +13 -7
  36. package/reference/rules/shared-types.md +36 -0
  37. package/reference/rules/task-tracking.md +30 -5
  38. package/reference/rules/ui.md +145 -3
  39. package/reference/rules/vibe-intents.md +271 -0
  40. package/reference/rules/vibe.md +17 -243
  41. package/reference/scaffold/core/organization-graph.mdx +112 -99
  42. package/reference/scaffold/core/organization-model.mdx +231 -215
  43. package/reference/scaffold/operations/propagation-pipeline.md +16 -17
  44. package/reference/scaffold/operations/scaffold-maintenance.md +22 -20
  45. package/reference/scaffold/operations/workflow-recipes.md +72 -20
  46. package/reference/scaffold/recipes/add-a-feature.md +156 -146
  47. package/reference/scaffold/recipes/add-a-resource.md +123 -117
  48. package/reference/scaffold/recipes/customize-crm-actions.md +28 -13
  49. package/reference/scaffold/recipes/customize-knowledge-browser.md +52 -117
  50. package/reference/scaffold/recipes/customize-organization-model.md +161 -149
  51. package/reference/scaffold/recipes/extend-a-base-entity.md +156 -140
  52. package/reference/scaffold/recipes/extend-content.md +265 -0
  53. package/reference/scaffold/recipes/extend-crm.md +16 -11
  54. package/reference/scaffold/recipes/extend-lead-gen.md +37 -21
  55. package/reference/scaffold/recipes/gate-by-feature-or-admin.md +160 -118
  56. package/reference/scaffold/recipes/index.md +6 -3
  57. package/reference/scaffold/recipes/query-the-knowledge-graph.md +23 -23
  58. package/reference/scaffold/reference/contracts.md +30 -56
  59. package/reference/scaffold/reference/feature-registry.md +3 -0
  60. package/reference/scaffold/reference/glossary.md +4 -4
  61. package/reference/scaffold/reference/system-interface-capabilities.md +5 -4
  62. package/reference/scaffold/ui/composition-extensibility.mdx +271 -232
  63. package/reference/scaffold/ui/customization.md +2 -2
  64. package/reference/scaffold/ui/feature-flags-and-gating.md +14 -6
  65. package/reference/scaffold/ui/feature-shell.mdx +277 -62
  66. package/reference/scaffold/ui/recipes.md +229 -197
  67. package/reference/sdk/cli-management.mdx +166 -33
  68. package/reference/sdk/cli.mdx +90 -13
  69. package/reference/sdk/concepts.mdx +2 -0
  70. package/reference/sdk/define-builders.mdx +76 -0
  71. package/reference/sdk/deployment/command-center.mdx +6 -2
  72. package/reference/sdk/deployment/execution-reference.mdx +64 -186
  73. package/reference/sdk/deployment/index.mdx +2 -0
  74. package/reference/sdk/exports.mdx +4 -4
  75. package/reference/sdk/framework/agent.mdx +52 -116
  76. package/reference/sdk/framework/index.mdx +46 -65
  77. package/reference/sdk/framework/project-structure.mdx +150 -205
  78. package/reference/sdk/framework/tutorial-system.mdx +2 -2
  79. package/reference/sdk/human-in-the-loop.mdx +152 -0
  80. package/reference/sdk/index.mdx +6 -7
  81. package/reference/sdk/platform-tools/adapters-platform.mdx +3 -1
  82. package/reference/sdk/platform-tools/index.mdx +12 -0
  83. package/reference/sdk/platform-tools/type-safety.mdx +4 -0
  84. package/reference/sdk/project-deployment-spec.mdx +131 -0
  85. package/reference/sdk/resources/index.mdx +21 -7
  86. package/reference/sdk/resources/patterns.mdx +54 -24
  87. package/reference/sdk/resources/types.mdx +7 -4
  88. package/reference/sdk/templates/data-enrichment.mdx +7 -3
  89. package/reference/sdk/templates/email-sender.mdx +139 -135
  90. package/reference/sdk/templates/lead-scorer.mdx +5 -1
  91. package/reference/sdk/templates/pdf-generator.mdx +155 -151
  92. package/reference/sdk/templates/recurring-job.mdx +195 -189
  93. package/reference/sdk/templates/text-classifier.mdx +4 -0
  94. package/reference/sdk/templates/web-scraper.mdx +139 -135
  95. package/reference/spine/spine-primer.md +135 -96
  96. package/reference/ui/exports.mdx +1 -0
  97. package/reference/ui/index.mdx +14 -7
  98. package/dist/types/worker/adapters/anymailfinder.d.ts +0 -14
  99. package/dist/types/worker/adapters/apify.d.ts +0 -14
  100. package/dist/types/worker/adapters/approval.d.ts +0 -23
  101. package/dist/types/worker/adapters/attio.d.ts +0 -22
  102. package/dist/types/worker/adapters/clickup.d.ts +0 -22
  103. package/dist/types/worker/adapters/create-adapter.d.ts +0 -41
  104. package/dist/types/worker/adapters/crm.d.ts +0 -20
  105. package/dist/types/worker/adapters/dropbox.d.ts +0 -14
  106. package/dist/types/worker/adapters/email.d.ts +0 -25
  107. package/dist/types/worker/adapters/execution.d.ts +0 -22
  108. package/dist/types/worker/adapters/gmail.d.ts +0 -14
  109. package/dist/types/worker/adapters/google-sheets.d.ts +0 -14
  110. package/dist/types/worker/adapters/index.d.ts +0 -33
  111. package/dist/types/worker/adapters/instantly.d.ts +0 -14
  112. package/dist/types/worker/adapters/lead.d.ts +0 -28
  113. package/dist/types/worker/adapters/list.d.ts +0 -9
  114. package/dist/types/worker/adapters/llm.d.ts +0 -45
  115. package/dist/types/worker/adapters/millionverifier.d.ts +0 -14
  116. package/dist/types/worker/adapters/notification.d.ts +0 -28
  117. package/dist/types/worker/adapters/pdf.d.ts +0 -22
  118. package/dist/types/worker/adapters/projects.d.ts +0 -20
  119. package/dist/types/worker/adapters/resend.d.ts +0 -14
  120. package/dist/types/worker/adapters/scheduler.d.ts +0 -25
  121. package/dist/types/worker/adapters/signature-api.d.ts +0 -14
  122. package/dist/types/worker/adapters/storage.d.ts +0 -33
  123. package/dist/types/worker/adapters/stripe.d.ts +0 -14
  124. package/dist/types/worker/adapters/tomba.d.ts +0 -14
  125. package/dist/types/worker/index.d.ts +0 -60
  126. package/dist/types/worker/platform.d.ts +0 -90
  127. package/dist/types/worker/utils.d.ts +0 -9
  128. package/reference/claude-config/Overview.md +0 -230
  129. package/reference/claude-config/hooks/post-edit-validate.mjs +0 -98
  130. package/reference/claude-config/hooks/scaffold-registry-reminder.mjs +0 -187
  131. package/reference/claude-config/hooks/tool-failure-recovery.mjs +0 -73
  132. package/reference/claude-config/registries/graph-skills.json +0 -4
  133. package/reference/claude-config/registries/knowledge-flags.json +0 -154
  134. package/reference/claude-config/registries/skill-coverage.json +0 -20
  135. package/reference/claude-config/rules/active-change-index.md +0 -22
  136. package/reference/claude-config/rules/agent-start-here.md +0 -22
  137. package/reference/claude-config/rules/deployment.md +0 -22
  138. package/reference/claude-config/rules/error-handling.md +0 -22
  139. package/reference/claude-config/rules/execution.md +0 -22
  140. package/reference/claude-config/rules/frontend.md +0 -22
  141. package/reference/claude-config/rules/observability.md +0 -22
  142. package/reference/claude-config/rules/operations.md +0 -22
  143. package/reference/claude-config/rules/organization-model.md +0 -22
  144. package/reference/claude-config/rules/organization-os.md +0 -22
  145. package/reference/claude-config/rules/package-taxonomy.md +0 -22
  146. package/reference/claude-config/rules/platform.md +0 -22
  147. package/reference/claude-config/rules/shared-types.md +0 -22
  148. package/reference/claude-config/rules/task-tracking.md +0 -22
  149. package/reference/claude-config/rules/topbar-actions.md +0 -70
  150. package/reference/claude-config/rules/ui.md +0 -22
  151. package/reference/claude-config/rules/vibe.md +0 -22
  152. package/reference/claude-config/scripts/statusline-command.js +0 -18
  153. package/reference/claude-config/settings.json +0 -30
  154. package/reference/claude-config/skills/client/SKILL.md +0 -201
  155. package/reference/claude-config/skills/deploy/SKILL.md +0 -159
  156. package/reference/claude-config/skills/dsp/SKILL.md +0 -66
  157. package/reference/claude-config/skills/elevasis/SKILL.md +0 -251
  158. package/reference/claude-config/skills/explore/SKILL.md +0 -78
  159. package/reference/claude-config/skills/git-sync/SKILL.md +0 -166
  160. package/reference/claude-config/skills/om/SKILL.md +0 -475
  161. package/reference/claude-config/skills/om/operations/build.md +0 -237
  162. package/reference/claude-config/skills/om/operations/codify-level-a.md +0 -109
  163. package/reference/claude-config/skills/om/operations/codify-level-b.md +0 -159
  164. package/reference/claude-config/skills/om/operations/customers.md +0 -114
  165. package/reference/claude-config/skills/om/operations/features.md +0 -88
  166. package/reference/claude-config/skills/om/operations/goals.md +0 -123
  167. package/reference/claude-config/skills/om/operations/identity.md +0 -97
  168. package/reference/claude-config/skills/om/operations/labels.md +0 -110
  169. package/reference/claude-config/skills/om/operations/offerings.md +0 -114
  170. package/reference/claude-config/skills/om/operations/roles.md +0 -104
  171. package/reference/claude-config/skills/om/operations/scaffold.md +0 -163
  172. package/reference/claude-config/skills/om/operations/techStack.md +0 -38
  173. package/reference/claude-config/skills/project/SKILL.md +0 -1114
  174. package/reference/claude-config/skills/run-ui/SKILL.md +0 -73
  175. package/reference/claude-config/skills/save/SKILL.md +0 -183
  176. package/reference/claude-config/skills/setup/SKILL.md +0 -290
  177. package/reference/claude-config/skills/status/SKILL.md +0 -59
  178. package/reference/claude-config/skills/submit-request/SKILL.md +0 -180
  179. package/reference/claude-config/skills/sync/SKILL.md +0 -47
  180. package/reference/claude-config/skills/tutorial/SKILL.md +0 -259
  181. package/reference/claude-config/skills/tutorial/progress-template.md +0 -74
  182. package/reference/claude-config/skills/tutorial/technical.md +0 -1303
  183. package/reference/claude-config/skills/tutorial/vibe-coder.md +0 -890
  184. package/reference/claude-config/sync-notes/2026-04-22-git-sync-and-sync-notes.md +0 -27
  185. package/reference/claude-config/sync-notes/2026-04-22-lead-gen-deliverability-removal.md +0 -30
  186. package/reference/claude-config/sync-notes/2026-04-24-test-utils-and-template-tests.md +0 -73
  187. package/reference/claude-config/sync-notes/2026-04-24-ui-consolidation-and-sdk-cli-train.md +0 -86
  188. package/reference/claude-config/sync-notes/2026-04-25-auth-role-system-and-settings-roles.md +0 -55
  189. package/reference/claude-config/sync-notes/2026-04-27-crm-hitl-action-layer-cutover.md +0 -97
  190. package/reference/claude-config/sync-notes/2026-04-27-lead-gen-substrate-train.md +0 -112
  191. package/reference/claude-config/sync-notes/2026-04-29-crm-state-and-lead-gen-processing-status.md +0 -93
  192. package/reference/claude-config/sync-notes/2026-05-02-crm-ownership-next-action.md +0 -58
  193. package/reference/claude-config/sync-notes/2026-05-02-template-hardcode-workos-config.md +0 -56
  194. package/reference/claude-config/sync-notes/2026-05-04-elevasis-workspace.md +0 -71
  195. package/reference/claude-config/sync-notes/2026-05-04-knowledge-bundle.md +0 -83
  196. package/reference/claude-config/sync-notes/2026-05-04-template-skills-run-ui-and-tutorial.md +0 -59
  197. package/reference/claude-config/sync-notes/2026-05-05-list-builder.md +0 -42
  198. package/reference/claude-config/sync-notes/2026-05-06-crm-spine.md +0 -60
  199. package/reference/claude-config/sync-notes/2026-05-06-sdk-changes-release-train.md +0 -37
  200. package/reference/claude-config/sync-notes/2026-05-07-sdk-changes-release-train.md +0 -34
  201. package/reference/claude-config/sync-notes/2026-05-08-resource-governance-scaffold-guidance.md +0 -38
  202. package/reference/claude-config/sync-notes/2026-05-09-clients-domain.md +0 -32
  203. package/reference/claude-config/sync-notes/2026-05-09-command-system.md +0 -33
  204. package/reference/claude-config/sync-notes/2026-05-09-resource-governance-and-misc.md +0 -69
  205. package/reference/claude-config/sync-notes/2026-05-12-sdk-ready-release-train.md +0 -30
  206. package/reference/claude-config/sync-notes/2026-05-14-organization-model-ontology-refactor.md +0 -45
  207. package/reference/claude-config/sync-notes/2026-05-15-om-skill-rename-and-write-family.md +0 -52
  208. package/reference/claude-config/sync-notes/2026-05-17-sdk-boundary-consolidation.md +0 -33
  209. package/reference/claude-config/sync-notes/2026-05-20-om-define-helpers.md +0 -32
  210. package/reference/claude-config/sync-notes/2026-05-22-access-model-and-right-panel.md +0 -43
  211. package/reference/claude-config/sync-notes/2026-05-22-lead-gen-tenant-config.md +0 -40
  212. package/reference/claude-config/sync-notes/2026-05-22-org-model-multi-file-split.md +0 -61
  213. package/reference/claude-config/sync-notes/2026-05-23-branding-names-to-identity.md +0 -49
  214. package/reference/claude-config/sync-notes/2026-05-23-lead-gen-manage-access.md +0 -31
  215. package/reference/claude-config/sync-notes/2026-05-23-om-deployment-drift-detection.md +0 -42
  216. package/reference/claude-config/sync-notes/2026-05-23-om-full-model-deploy-contract.md +0 -33
  217. package/reference/claude-config/sync-notes/2026-05-23-ui-sdk-package-fixes.md +0 -37
  218. package/reference/claude-config/sync-notes/2026-05-24-platform-invite-router-core-baseline.md +0 -28
  219. package/reference/claude-config/sync-notes/2026-05-24-system-interface-readiness.md +0 -43
  220. package/reference/claude-config/sync-notes/2026-05-25-invitation-login-loader.md +0 -26
  221. package/reference/claude-config/sync-notes/2026-05-25-om-topbar-requests.md +0 -33
  222. package/reference/claude-config/sync-notes/2026-05-25-system-interface-profile-registry-and-substrate.md +0 -35
  223. package/reference/claude-config/sync-notes/2026-05-25-tenant-om-scaffold-cli.md +0 -49
  224. package/reference/claude-config/sync-notes/2026-05-25-vibe-operate-intent.md +0 -47
  225. package/reference/claude-config/sync-notes/2026-05-28-om-snapshot-sdk-workflow-config.md +0 -33
  226. package/reference/claude-config/sync-notes/2026-05-30-client-source-and-om-profiles.md +0 -39
  227. package/reference/claude-config/sync-notes/2026-06-02-knowledge-nested-group-routing.md +0 -27
  228. package/reference/claude-config/sync-notes/2026-06-02-nest-projects-under-platform.md +0 -45
  229. package/reference/claude-config/sync-notes/2026-06-03-skill-autogen-and-client-skill.md +0 -34
  230. package/reference/claude-config/sync-notes/2026-06-04-scaffold-registry-lane-severity.md +0 -34
  231. package/reference/claude-config/sync-notes/2026-06-05-appearance-app-mode-decouple.md +0 -29
  232. package/reference/claude-config/sync-notes/2026-06-05-ontology-endpoint-rename-and-knowledge-browser-ui.md +0 -86
  233. package/reference/claude-config/sync-notes/2026-06-06-om-build-systems-scaffold.md +0 -47
  234. package/reference/claude-config/sync-notes/2026-06-06-om-item-copy-references.md +0 -50
  235. package/reference/claude-config/sync-notes/2026-06-08-knowledge-base-page-not-found-fix.md +0 -76
  236. package/reference/claude-config/sync-notes/2026-06-09-agent-sessions-public-agent-chat-route.md +0 -75
  237. package/reference/claude-config/sync-notes/2026-06-09-sdk-cli-load-org-model-resolution.md +0 -42
  238. package/reference/claude-config/sync-notes/2026-06-12-agent-grants-visualizer-operations.md +0 -30
  239. package/reference/claude-config/sync-notes/2026-06-14-session-ux-and-project-cli-json.md +0 -33
  240. package/reference/claude-config/sync-notes/2026-06-14-shared-session-conversation-view.md +0 -26
  241. package/reference/claude-config/sync-notes/2026-06-15-session-chat-zero-wiring.md +0 -46
  242. package/reference/claude-config/sync-notes/2026-06-17-agent-session-ux-features.md +0 -34
  243. package/reference/claude-config/sync-notes/2026-06-25-shared-page-scroll-contract-guard.md +0 -52
  244. package/reference/claude-config/sync-notes/2026-06-26-leadgen-overview-om-telemetry.md +0 -47
  245. package/reference/claude-config/sync-notes/2026-07-21-agent-scaffold-hardening.md +0 -75
  246. package/reference/claude-config/sync-notes/2026-07-23-agent-session-memory.md +0 -49
  247. package/reference/claude-config/sync-notes/2026-07-23-workos-org-marker.md +0 -50
  248. package/reference/claude-config/sync-notes/2026-07-24-claude-5-models-and-session-surface-fixes.md +0 -116
  249. package/reference/claude-config/sync-notes/2026-07-27-agent-strict-output-and-turn-drift.md +0 -73
  250. package/reference/claude-config/sync-notes/2026-07-28-agent-reply-is-its-own-field.md +0 -84
  251. package/reference/claude-config/sync-notes/2026-07-30-login-screen-and-member-provisioning-state.md +0 -114
  252. package/reference/claude-config/sync-notes/2026-08-02-auth-guard-defaults-and-truncation-fix.md +0 -122
  253. package/reference/claude-config/sync-notes/2026-08-03-agent-prose-escape-normalization.md +0 -88
  254. package/reference/claude-config/sync-notes/2026-08-03-cli-gateway-errors-and-request-timeout.md +0 -120
  255. package/reference/claude-config/sync-notes/README.md +0 -43
  256. package/reference/sdk/framework/interaction-guidance.mdx +0 -182
  257. package/reference/sdk/framework/memory.mdx +0 -326
  258. package/reference/sdk/framework/resource-documentation.mdx +0 -90
  259. package/reference/sdk/roadmap.mdx +0 -164
@@ -34,7 +34,7 @@ Lead gen is a layered platform surface, not one component. Shared packages own s
34
34
  | User wants | Start here | Notes |
35
35
  | --------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
36
36
  | Change lead-gen System availability, labels, quick access, stage catalogs, build templates, workflow actions, resources, topology, or API readiness | `core/config/organization-model.ts` | Treat this as Organization OS work. Tenant projects own these values. Mark `sales.lead-gen.apiInterface` active only when scoped resources and ontology are ready for API-backed lead-gen actions. |
37
- | Add lead-gen sidebar nav or a lead-gen route | `@elevasis/ui/features/lead-gen` and `operations/node_modules/@elevasis/sdk/reference/scaffold/ui/customization.md` | Prefer manifest/sidebar composition. Do not fork shared source first. |
37
+ | Add lead-gen sidebar nav or a lead-gen route | `@elevasis/ui/features/lead-gen` and `operations/node_modules/@elevasis/sdk/reference/scaffold/ui/customization.md` | Prefer manifest/sidebar composition. Do not fork shared source first. |
38
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
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
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. |
@@ -209,7 +209,7 @@ Available field component variants: `textinput`, `textarea`, `numberinput`, `swi
209
209
  ```tsx
210
210
  import * as z from 'zod'
211
211
  import { leadGenManifest, type ListBuilderRegistry } from '@elevasis/ui/features/lead-gen'
212
- import type { StepConfigLayout } from '@elevasis/ui/components/forms'
212
+ import type { StepConfigLayout } from '@elevasis/ui/components'
213
213
  import { ElevasisSystemsProvider, ElevasisUIProvider } from '@elevasis/ui/provider'
214
214
  import { organizationModel, resourceDescriptors } from '@core/config/organization-model'
215
215
 
@@ -349,21 +349,26 @@ Use `useArtifacts({ ownerKind, ownerId })` for durable JSON artifacts like audit
349
349
 
350
350
  Inside deployed workflows, use worker adapters instead of browser hooks or direct database access:
351
351
 
352
- External projects should define workflow input/output schemas in `@shared/types`; the example below assumes those shared schemas already exist.
352
+ External projects should define reusable workflow input/output schemas in `@core/types` (the `@core/*` tsconfig path resolves to the project's own `core/` directory); the example below assumes those shared schemas already exist. There is no `@shared/*` alias in a template-family project — do not write one.
353
+
354
+ **Do not hand-bind the OM Resource descriptor on each workflow.** `projectDeploymentSpec` in `operations/src/index.ts` takes a `getWorkflowResourceDescriptor` resolver and binds `config.resource`, `config.resourceId`, and `config.type` for every workflow centrally. It looks the descriptor up by the `config.resourceId` you author and then **overwrites `resource` and `type` unconditionally** — so setting them per workflow is dead code that reads as a contract and drifts from the model without any error. Author `resourceId` and let the spec bind the rest.
355
+
356
+ <!-- doc-snippet:skip: illustrative excerpt -- `@core/types` resolves to the project's own `core/types/` module via the `@core/*` tsconfig path, `resourceDescriptors` names the project's own resource-descriptors export, and `z` (zod) is shown unimported -->
353
357
 
354
358
  ```ts
355
359
  // operations/src/sales/qualify-list.ts
356
360
  import type { WorkflowDefinition } from '@elevasis/sdk'
357
361
  import { acqDb, list } from '@elevasis/sdk/worker'
358
- import { qualifyListInputSchema, qualifyListOutputSchema } from '@shared/types'
362
+ import { qualifyListInputSchema, qualifyListOutputSchema } from '@core/types'
359
363
  import { resourceDescriptors } from '@core/config/organization-model'
360
364
 
361
365
  export const qualifyListWorkflow: WorkflowDefinition = {
362
366
  config: {
363
- resource: resourceDescriptors.qualifyList,
367
+ // `resourceId` is the only descriptor field you author -- it is the lookup key
368
+ // `projectDeploymentSpec` resolves against your OM. See the note below.
364
369
  resourceId: resourceDescriptors.qualifyList.id,
365
370
  name: 'Qualify List',
366
- type: resourceDescriptors.qualifyList.kind,
371
+ description: 'Marks list contacts as verified based on qualification checks.',
367
372
  version: '1.0.0',
368
373
  status: 'dev',
369
374
  },
@@ -372,10 +377,12 @@ export const qualifyListWorkflow: WorkflowDefinition = {
372
377
  qualify: {
373
378
  id: 'qualify',
374
379
  name: 'Qualify',
380
+ description: 'Fetches list contacts and marks each verified.',
375
381
  inputSchema: qualifyListInputSchema,
376
382
  outputSchema: qualifyListOutputSchema,
377
383
  next: null,
378
- handler: async (input, context) => {
384
+ handler: async (rawInput, context) => {
385
+ const input = rawInput as z.infer<typeof qualifyListInputSchema>
379
386
  const config = await list.getConfig({ listId: input.listId })
380
387
  const contacts = await acqDb.listContacts({ listId: input.listId, limit: 100, offset: 0 })
381
388
 
@@ -453,14 +460,10 @@ Practical consequence: you can rename systems, restructure ontology, swap export
453
460
 
454
461
  ### Declaring an OM Readiness Contract
455
462
 
456
- When you define a custom `readinessProfile` id (any string that is not one of the built-in presets `sales.lead-gen.api`, `sales.crm.api`, `sales.lead-gen.crm-handoff`), you must also provide a `readinessContract` on the `apiInterface` so the platform can validate structural readiness without hardcoded constants.
463
+ When you define a custom `readinessProfile` id (any string that is not one of the built-in presets `sales.lead-gen.api`, `sales.crm.api`, `sales.lead-gen.crm-handoff`), you must also provide a `readinessContract` on the `apiInterface` so the platform can validate structural readiness without hardcoded constants. This is mandatory — there is no `registerReadinessProfile` call that lets a custom system skip declaring a `readinessContract`. `registerReadinessProfile` (below) only records that an id has been chosen; it registers no validation logic and does not change how `computeInterfaceReadiness` treats the system, so it is optional and has no effect on whether the contract is required.
457
464
 
458
465
  ```ts
459
466
  // core/config/organization-model.ts
460
- import { registerReadinessProfile } from '@elevasis/sdk'
461
-
462
- // Register the profile id at startup so the platform recognizes it
463
- registerReadinessProfile('acme.prospecting.api')
464
467
 
465
468
  export const organizationModel = {
466
469
  // ...
@@ -490,28 +493,32 @@ export const organizationModel = {
490
493
  }
491
494
  ```
492
495
 
493
- `readinessContract.requiredObjects` and `requiredCatalogs` are arrays of ontology IDs owned by this system. The platform validates that each declared object type exists in the OM and that each declared catalog type has at least one entry. The `requiredKinds` field is reserved for future profile extensions; omit it today.
496
+ `readinessContract.requiredObjects` and `requiredCatalogs` are arrays of ontology IDs owned by this system. The platform validates that each declared object type exists in the OM and that each declared catalog type has at least one entry. `requiredCatalogs` must declare at least one entry an empty contract asserts nothing and is rejected.
494
497
 
495
- Built-in profile ids (`sales.lead-gen.api`, etc.) derive their requirements from platform code. If you use a built-in profile on a custom system, you do not need a `readinessContract`.
498
+ Built-in profile ids (`sales.lead-gen.api`, etc.) derive their requirements from platform code. **A `readinessContract` declared alongside a built-in profile is ignored outright — not merely unnecessary.** The readiness engine branches on the profile: a registered built-in runs its own validator, and the authored contract is read only on the `else` branch, so anything you declare next to a built-in profile validates nothing and silently drifts from what the platform actually enforces. Real projects have shipped full contracts this way believing they were enforced.
496
499
 
497
- The `lookupReadinessProfile`, `registerReadinessProfile`, and `isBuiltInReadinessProfile` functions are exported from `@elevasis/sdk` alongside the `SystemApiInterfaceReadinessContract`, `ReadinessProfileKind`, and `ReadinessProfileEntry` types.
500
+ Note that the determinant is the **profile**, not the system. A custom system using a built-in profile still gets the built-in's requirements and still ignores an authored contract; a custom profile id is what makes `readinessContract` required (and it is required — a custom profile without one fails readiness with `missing-readiness-contract`).
501
+
502
+ The `lookupReadinessProfile`, `registerReadinessProfile`, and `isBuiltInReadinessProfile` functions are exported from `@elevasis/sdk` alongside the `SystemApiInterfaceReadinessContract`, `ReadinessProfileKind`, and `ReadinessProfileEntry` types. `registerReadinessProfile(profileId)` only acknowledges a custom id for introspection (`lookupReadinessProfile` then resolves it as `kind: 'custom'` instead of `undefined`) — it cannot make `isBuiltInReadinessProfile` return `true` and it is never a substitute for a `readinessContract`. The actual extension point for platform-code-driven readiness (no `readinessContract` needed) is `registerBuiltInReadinessProfile`, exported from `@elevasis/core/organization-model/readiness` — it takes real structural validation logic, not just an id.
498
503
 
499
504
  ### Export Channel as Tenant Business Config
500
505
 
501
506
  The export channel — ClickUp, CSV/XLSX file, platform push, or a custom destination — is an action + credential choice declared in your tenant OM. The platform owns the list-builder workflow primitive and the file storage adapters; you own which workflow id handles export and which credential it uses.
502
507
 
508
+ <!-- doc-snippet:skip: illustrative excerpt -- `@core/types` resolves to the project's own `core/types/` module via the `@core/*` tsconfig path, and `buildCsvFromContacts` is a tenant-authored helper this recipe does not define -->
509
+
503
510
  ```ts
504
511
  // operations/src/sales/prospecting/export-list.ts
505
512
  import type { WorkflowDefinition } from '@elevasis/sdk'
506
- import { list, storage } from '@elevasis/sdk/worker'
507
- import { exportListInputSchema, exportListOutputSchema } from '@shared/types'
513
+ import { acqDb, list, storage } from '@elevasis/sdk/worker'
514
+ import { exportListInputSchema, exportListOutputSchema } from '@core/types'
515
+ import { resourceDescriptors } from '@core/config/organization-model'
508
516
 
509
517
  export const exportListWorkflow: WorkflowDefinition = {
510
518
  config: {
511
- resource: resourceDescriptors.exportList,
512
519
  resourceId: resourceDescriptors.exportList.id,
513
520
  name: 'Export List',
514
- type: 'workflow',
521
+ description: 'Exports list contacts to a CSV file in project storage.',
515
522
  version: '1.0.0',
516
523
  status: 'prod'
517
524
  },
@@ -520,10 +527,13 @@ export const exportListWorkflow: WorkflowDefinition = {
520
527
  export: {
521
528
  id: 'export',
522
529
  name: 'Export',
530
+ description: 'Fetches list contacts, builds a CSV, and uploads it to storage.',
523
531
  inputSchema: exportListInputSchema,
524
532
  outputSchema: exportListOutputSchema,
525
533
  next: null,
526
- handler: async (input, context) => {
534
+ handler: async (rawInput, context) => {
535
+ const input = rawInput as z.infer<typeof exportListInputSchema>
536
+
527
537
  // Fetch contacts from the acquisition substrate
528
538
  const contacts = await acqDb.listContacts({ listId: input.listId, limit: 5000, offset: 0 })
529
539
 
@@ -560,6 +570,8 @@ The `ListTelemetry.stageCounts` field is now a `Record<string, number>` — one
560
570
 
561
571
  To define custom stages, author them in the `catalogTypes` scope of your lead-gen system:
562
572
 
573
+ <!-- doc-snippet:skip: illustrative excerpt, not a standalone compilable file -->
574
+
563
575
  ```ts
564
576
  ontology: {
565
577
  catalogTypes: {
@@ -582,6 +594,8 @@ ontology: {
582
594
 
583
595
  **`readinessTarget` — declaring the pipeline objective.** To tell the platform which stage is the "ready / next-focus" milestone for your pipeline, mark exactly one catalog entry with `readinessTarget: true`:
584
596
 
597
+ <!-- doc-snippet:skip: illustrative excerpt, not a standalone compilable file -->
598
+
585
599
  ```ts
586
600
  entries: {
587
601
  'sourced': { label: 'Sourced', order: 10 },
@@ -597,6 +611,8 @@ The `LeadGenOverviewPage` uses this field to derive a "contacts ready for \<stag
597
611
 
598
612
  Point the `listBuilderWorkflow` factory at your tenant resource and step handlers. The factory validates `stageKey` inputs against your catalog at construction time, not at runtime:
599
613
 
614
+ <!-- doc-snippet:skip: illustrative excerpt -- `resourceDescriptors` names the project's own resource-descriptors export, and `sourceCompaniesStep`/`enrichCompaniesStep`/`qualifyCompaniesStep` are the reader's own step handlers, not defined in this excerpt -->
615
+
600
616
  ```ts
601
617
  // operations/src/sales/prospecting/list-builder.ts
602
618
  import { listBuilderWorkflow } from '@elevasis/sdk/worker'
@@ -619,7 +635,7 @@ Register this workflow in `DeploymentSpec.workflows` alongside the export workfl
619
635
  Run the checks for the surfaces you touched:
620
636
 
621
637
  ```bash
622
- pnpm -C ui run check
638
+ pnpm -C ui run check-types
623
639
  pnpm -C operations run check
624
640
  pnpm -C operations exec elevasis-sdk check
625
641
  ```
@@ -1,121 +1,163 @@
1
- ---
2
- title: Gate by System or Admin
3
- description: Decision table and recipes for gating routes, sidebar entries, and UI elements by Organization Model system ID or admin role.
4
- ---
1
+ ---
2
+ title: Gate by System or Admin
3
+ description: Decision table and recipes for gating routes, sidebar entries, and UI elements with AccessGuard and the unified Access Model.
4
+ ---
5
5
  <!-- @generated by packages/sdk/scripts/copy-reference-docs.mjs -- DO NOT EDIT -->
6
6
  <!-- Regenerate: pnpm scaffold:sync -->
7
7
 
8
-
9
- # Gate by System or Admin
10
-
11
- System visibility starts in `core/config/organization-model.ts`. Routes still enforce access with guards.
12
-
13
- ## Decide the gate
14
-
15
- | Scenario | Gate to use |
16
- | --- | --- |
17
- | Surface can be enabled or disabled per organization/member | `SystemGuard` with the system ID |
18
- | Surface is always available to members but restricted to admins | `AdminGuard` plus `requiresAdmin: true` on the system node |
19
- | Surface is both system-gated and admin-only | Both guards, plus `requiresAdmin: true` on the system node |
20
-
21
- ## System gate in the org model
22
-
23
- Add or update the system in the id-keyed `systems` map.
24
-
25
- ```ts
26
- systems: {
27
- analytics: {
28
- id: 'analytics',
29
- order: 10,
30
- label: 'Analytics',
31
- enabled: false,
32
- path: '/analytics',
33
- icon: 'custom.analytics',
34
- uiPosition: 'sidebar-primary'
35
- }
36
- }
37
- ```
38
-
39
- Set `enabled: true` to enable it for all members by default. Dotted IDs such as `analytics.reports` inherit system state and shell placement from their ancestors unless they declare their own value.
40
-
41
- ## Route-level system gate
42
-
43
- ```tsx
44
- import { ProtectedRoute } from '@/features/auth'
45
- import { SystemGuard } from '@elevasis/ui/features/auth'
46
- import { createFileRoute, Outlet } from '@tanstack/react-router'
47
-
48
- export const Route = createFileRoute('/analytics')({ component: AnalyticsLayout })
49
-
50
- function AnalyticsLayout() {
51
- return (
52
- <ProtectedRoute>
53
- <SystemGuard systemKey="analytics">
54
- <Outlet />
55
- </SystemGuard>
56
- </ProtectedRoute>
57
- )
58
- }
59
- ```
60
-
61
- The sidebar is derived from `OrganizationModel.systems`; hiding a node there is display behavior only. Keep route guards in place for direct URL access.
62
-
63
- ## Admin-only route
64
-
65
- ```tsx
66
- import { ProtectedRoute } from '@/features/auth'
67
- import { AdminGuard } from '@elevasis/ui/auth'
68
- import { createFileRoute, Outlet } from '@tanstack/react-router'
69
-
70
- export const Route = createFileRoute('/admin')({ component: AdminLayout })
71
-
72
- function AdminLayout() {
73
- return (
74
- <ProtectedRoute>
75
- <AdminGuard>
76
- <Outlet />
77
- </AdminGuard>
78
- </ProtectedRoute>
79
- )
80
- }
81
- ```
82
-
83
- Pair the route guard with the system node:
84
-
85
- ```ts
86
- systems: {
87
- admin: {
88
- id: 'admin',
89
- order: 10,
90
- label: 'Admin',
91
- enabled: true,
92
- path: '/admin',
93
- uiPosition: 'sidebar-bottom',
94
- requiresAdmin: true
95
- }
96
- }
97
- ```
98
-
99
- ## Per-member override
100
-
101
- Membership config overrides enabled state per member.
102
-
103
- ```ts
104
- {
105
- systems: { analytics: false }
106
- }
107
- ```
108
-
109
- Settings and admin-only pages should use admin checks, not per-member system flags.
110
-
111
- ## Verify
112
-
113
- Check the state matrix:
114
-
115
- | Org system enabled | Member override | Admin | Expected result |
116
- | --- | --- | --- | --- |
117
- | true | absent | any | Route accessible, sidebar visible |
118
- | true | false | any | Route redirects, sidebar hidden |
119
- | false | absent | any | Route redirects, sidebar hidden |
120
- | true | absent | non-admin | Admin route redirects, admin sidebar hidden |
121
- | true | absent | admin | Admin route accessible, admin sidebar visible |
8
+
9
+ # Gate by System or Admin
10
+
11
+ There is one gating surface: `AccessGuard` from `@elevasis/ui/auth`. It resolves an access key against the Access Model, which composes Organization Model System lifecycle, role permissions, organization membership scope, diagnostic allowlists, and platform-admin bypass.
12
+
13
+ `SystemGuard` and `AdminGuard` are retired. They are not exported by `@elevasis/ui`, so code importing them does not compile. Use `AccessGuard` with the right access key instead.
14
+
15
+ ## Decide the access key
16
+
17
+ | Scenario | `accessKey` to pass |
18
+ | --------------------------------------------------------------- | ------------------------------------------------------- |
19
+ | Surface is an OM System that an organization can turn on or off | the System path, e.g. `"analytics"` |
20
+ | Surface performs writes only some roles may do | `{ systemPath: 'analytics', action: 'manage' }` |
21
+ | Surface is platform-admin only | `AccessKeys.platformAdmin` |
22
+ | Surface is backed by an existing role permission | the matching constant, e.g. `AccessKeys.operationsRead` |
23
+
24
+ A string key is shorthand for `{ systemPath: <string>, action: 'view' }`. `AccessKeys` is exported from `@elevasis/ui/auth`, `@elevasis/ui/hooks`, and `@elevasis/core/auth`.
25
+
26
+ ## System gate in the org model
27
+
28
+ Add or update the system in the id-keyed `systems` map in `core/config/organization-model.ts`.
29
+
30
+ <!-- doc-snippet:skip: illustrative excerpt, not a standalone compilable file -->
31
+
32
+ ```ts
33
+ systems: {
34
+ analytics: {
35
+ id: 'analytics',
36
+ order: 10,
37
+ label: 'Analytics',
38
+ lifecycle: 'active',
39
+ path: '/analytics',
40
+ uiPosition: 'sidebar-primary'
41
+ }
42
+ }
43
+ ```
44
+
45
+ `lifecycle` is the gate:
46
+
47
+ - `'active'` allows access.
48
+ - `'beta'` allows access only when the runtime enables beta access or runs in development mode.
49
+ - `'draft'`, `'deprecated'`, and `'archived'` deny.
50
+
51
+ Dotted IDs such as `analytics.reports` inherit lifecycle and shell placement from their ancestors unless they declare their own value.
52
+
53
+ ## Route-level system gate
54
+
55
+ ```tsx
56
+ import { AccessGuard, ProtectedRoute } from '@elevasis/ui/auth'
57
+ import { createFileRoute, Outlet } from '@tanstack/react-router'
58
+
59
+ export const Route = createFileRoute('/analytics')({ component: AnalyticsLayout })
60
+
61
+ function AnalyticsLayout() {
62
+ return (
63
+ <ProtectedRoute>
64
+ <AccessGuard accessKey="analytics">
65
+ <Outlet />
66
+ </AccessGuard>
67
+ </ProtectedRoute>
68
+ )
69
+ }
70
+ ```
71
+
72
+ The sidebar is derived from `OrganizationModel.systems`; hiding a node there is display behavior only. Keep route guards in place for direct URL access.
73
+
74
+ ## Admin-only route
75
+
76
+ ```tsx
77
+ import { AccessGuard, AccessKeys, ProtectedRoute } from '@elevasis/ui/auth'
78
+ import { createFileRoute, Outlet } from '@tanstack/react-router'
79
+
80
+ export const Route = createFileRoute('/admin')({ component: AdminLayout })
81
+
82
+ function AdminLayout() {
83
+ return (
84
+ <ProtectedRoute>
85
+ <AccessGuard accessKey={AccessKeys.platformAdmin}>
86
+ <Outlet />
87
+ </AccessGuard>
88
+ </ProtectedRoute>
89
+ )
90
+ }
91
+ ```
92
+
93
+ `AccessKeys.platformAdmin` is satisfied only by a platform admin; no role permission grants it. Pair the route guard with the system node:
94
+
95
+ <!-- doc-snippet:skip: illustrative excerpt, not a standalone compilable file -->
96
+
97
+ ```ts
98
+ systems: {
99
+ admin: {
100
+ id: 'admin',
101
+ order: 20,
102
+ label: 'Admin',
103
+ lifecycle: 'active',
104
+ path: '/admin',
105
+ uiPosition: 'sidebar-bottom',
106
+ requiresAdmin: true
107
+ }
108
+ }
109
+ ```
110
+
111
+ `requiresAdmin` hides the sidebar entry from non-admins. It is display state projected onto the shell, not enforcement, so the route guard is still required.
112
+
113
+ ## Gate a single element
114
+
115
+ Use `useAccess` when the decision changes one control rather than a whole route.
116
+
117
+ ```tsx
118
+ import { AccessKeys, useAccess } from '@elevasis/ui/hooks'
119
+
120
+ function CreateListButton() {
121
+ const canManage = useAccess(AccessKeys.leadGenManage)
122
+
123
+ return <Button disabled={!canManage.allowed}>New list</Button>
124
+ }
125
+ ```
126
+
127
+ `useAccess` returns the access answer plus `isReady`, `isPlatformAdmin`, and the resolved `permissions` array. Check `isReady` before treating `allowed: false` as a denial — it is also false while membership and permissions are still loading.
128
+
129
+ ## Fallbacks and redirects
130
+
131
+ `AccessGuard` accepts `fallback`, `loadingFallback`, and `redirectTo` alongside `accessKey`. `fallback` may be a node or a function receiving the access answer, so a denial can explain itself.
132
+
133
+ ```tsx
134
+ <AccessGuard
135
+ accessKey="analytics"
136
+ loadingFallback={<Loader />}
137
+ fallback={(answer) => <NoAccess reason={answer.reason} />}
138
+ redirectTo="/"
139
+ >
140
+ <AnalyticsPage />
141
+ </AccessGuard>
142
+ ```
143
+
144
+ ## Per-member overrides are retired
145
+
146
+ Per-member system toggles stored on membership config no longer exist. Narrow access two ways instead:
147
+
148
+ - turn the System off for the whole organization with `lifecycle`, or
149
+ - require a role permission by gating on a `manage` action or an `AccessKeys` constant, so only members whose assigned roles grant that permission pass.
150
+
151
+ ## Verify
152
+
153
+ Check the state matrix:
154
+
155
+ | System lifecycle | Role permission | Platform admin | Expected result |
156
+ | ---------------- | --------------------- | ----------------------------- | ---------------------------------------------- |
157
+ | `active` | not required | any | Route accessible, sidebar visible |
158
+ | `beta` | not required | non-admin, production runtime | Route denied, sidebar hidden |
159
+ | `draft` | not required | non-admin | Route denied, sidebar hidden |
160
+ | `active` | required, not granted | non-admin | Manage action denied, view still allowed |
161
+ | any | any | admin | Allowed with `reason: 'platform-admin-bypass'` |
162
+
163
+ If a route denies unexpectedly, read `answer.restrictedBy` and `answer.reason` from `useAccess` — they name the layer that denied, so you can tell a lifecycle problem from a missing role permission.
@@ -17,13 +17,13 @@ Before starting, read [glossary.md](../reference/glossary.md) to disambiguate ov
17
17
  ## Recipes
18
18
 
19
19
  **[Add an OM-Backed System](add-a-feature.md)**
20
- You want a new system with cohesive Organization Model semantics, executable resources, and optional UI. Covers Systems, System-owned ontology and config, Resource descriptors with `title`, `description`, `resource.ontology.actions`, `primaryAction`, `codeRefs`, OM topology, runtime assembly, manifests, routes, guards, tests, and compatibility notes for old `System.content` consumers.
20
+ You want a new system with cohesive Organization Model semantics, executable resources, and optional UI. Covers Systems, System-owned ontology and config, Resource descriptors with `title`, `description`, `resource.ontology.actions`, `primaryAction`, `codeRefs`, OM topology, runtime assembly, manifests, routes, guards, tests, and the migration off retired `System.content`.
21
21
 
22
22
  **[Add a Resource](add-a-resource.md)**
23
23
  You want a new workflow or agent deployed to the platform. Covers OM Resource descriptor authoring, descriptor-backed `WorkflowDefinition` binding, `DeploymentSpec` assembly, relationship declarations, and CLI verification.
24
24
 
25
25
  **[Gate by System or Admin](gate-by-feature-or-admin.md)**
26
- You want to restrict a route, nav item, or UI element by system flag or admin role. Covers the decision table, `SystemGuard`, `AdminGuard`, nav-entry visibility fields, per-member system overrides, and the settings-asymmetry gotcha.
26
+ You want to restrict a route, nav item, or UI element by System or by role. Covers the access-key decision table, the single `AccessGuard` surface and `useAccess` hook, System `lifecycle` as the org-level gate, `AccessKeys.platformAdmin` for admin-only routes, guard fallbacks and redirects, and why the retired `SystemGuard` / `AdminGuard` pair must not be reintroduced.
27
27
 
28
28
  **[Build and Extend CRM](extend-crm.md)**
29
29
  You want to build on the shared CRM without forking it: add CRM routes, compose sidebars/pages, use deal/company/contact hooks, mutate CRM data from workflows, or understand which contracts and adapters form the extension surface.
@@ -31,6 +31,9 @@ You want to build on the shared CRM without forking it: add CRM routes, compose
31
31
  **[Build and Extend Lead Gen](extend-lead-gen.md)**
32
32
  You want to build on the shared lead-gen system without forking it: add lead-gen routes, compose sidebars/pages, use list/company/contact/artifact hooks, mutate list data from workflows, or understand which contracts and adapters form the extension surface.
33
33
 
34
+ **[Build and Extend Content](extend-content.md)**
35
+ You want to build on the shared content system without forking it: add a pipeline, produce a step from a workflow, customize the review screen, store rules documents, or track distributions. Covers the catalog-driven pipeline model (a pipeline is data, not code), the `content:catalog/{pipeline}-steps` binding, attempt authoring with `stepKey`, artifacts as versioned governing documents with their two silent write constraints, review-page slots and primitives, and the `apiInterface` readiness rules.
36
+
34
37
  **[Customize CRM Actions](customize-crm-actions.md)**
35
38
  You want to add, hide, or replace CRM deal action buttons, configure the shared `crmActions` provider path, or call a project-owned workflow from custom UI when server-side action dispatch constraints require it. Covers `ActionDef`, the caller-supplied `crmActions` catalog, provider wiring, and the current v1 boundary for custom action dispatch.
36
39
 
@@ -45,6 +48,6 @@ You want to browse, inspect, or traverse the OrganizationModel knowledge graph f
45
48
  ## Reference docs these recipes link into
46
49
 
47
50
  - [glossary.md](../reference/glossary.md) -- term disambiguation for System, Resource, systemId, Topology, Settings asymmetry
48
- - [contracts.md](../reference/contracts.md) -- TypeScript shapes: `SystemModule`, `OrganizationModel`, CRM deal types, lead-gen list/member/artifact types, `CrmToolMap`, `LeadToolMap`, `ListToolMap`, `ActionDef`
51
+ - [contracts.md](../reference/contracts.md) -- TypeScript shapes: `SystemModule`, `OrganizationModel`, CRM deal types, lead-gen list/member/artifact types, content item/attempt/distribution types, `CrmToolMap`, `LeadToolMap`, `ListToolMap`, `ContentToolMap`, `ActionDef`
49
52
  - [feature-flags-and-gating.md](../ui/feature-flags-and-gating.md) -- full three-concept gating model
50
53
  - [workflow-recipes.md](../operations/workflow-recipes.md) -- workflow anatomy, adapters, trigger patterns