@elevasis/sdk 1.44.3 → 1.45.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 (246) hide show
  1. package/dist/cli.cjs +991 -650
  2. package/dist/index.d.ts +1045 -509
  3. package/dist/index.js +738 -688
  4. package/dist/node/index.d.ts +105 -97
  5. package/dist/test-utils/index.d.ts +42 -28
  6. package/dist/test-utils/index.js +514 -783
  7. package/dist/worker/index.d.ts +12112 -0
  8. package/dist/worker/index.js +121 -182
  9. package/package.json +6 -9
  10. package/reference/_navigation.md +151 -21
  11. package/reference/_reference-manifest.json +186 -4
  12. package/reference/claude-config.md +8 -0
  13. package/reference/core/index.mdx +3 -3
  14. package/reference/examples/organization-model.ts +117 -111
  15. package/reference/index.mdx +4 -4
  16. package/reference/rules/active-change-index.md +40 -54
  17. package/reference/rules/agent-runtime.md +81 -0
  18. package/reference/rules/agent-start-here.md +71 -163
  19. package/reference/rules/deployment.md +33 -10
  20. package/reference/rules/error-handling.md +26 -0
  21. package/reference/rules/execution.md +13 -0
  22. package/reference/rules/frontend.md +10 -3
  23. package/reference/rules/observability.md +9 -1
  24. package/reference/rules/operations.md +26 -17
  25. package/reference/rules/organization-model.md +74 -88
  26. package/reference/rules/organization-os.md +71 -88
  27. package/reference/rules/package-taxonomy.md +11 -2
  28. package/reference/rules/platform.md +13 -7
  29. package/reference/rules/shared-types.md +15 -0
  30. package/reference/rules/task-tracking.md +30 -5
  31. package/reference/rules/ui.md +145 -3
  32. package/reference/rules/vibe-intents.md +271 -0
  33. package/reference/rules/vibe.md +17 -243
  34. package/reference/scaffold/core/organization-graph.mdx +111 -97
  35. package/reference/scaffold/core/organization-model.mdx +234 -214
  36. package/reference/scaffold/operations/propagation-pipeline.md +1 -1
  37. package/reference/scaffold/operations/scaffold-maintenance.md +19 -18
  38. package/reference/scaffold/operations/workflow-recipes.md +71 -19
  39. package/reference/scaffold/recipes/add-a-feature.md +156 -146
  40. package/reference/scaffold/recipes/add-a-resource.md +123 -117
  41. package/reference/scaffold/recipes/customize-crm-actions.md +25 -10
  42. package/reference/scaffold/recipes/customize-knowledge-browser.md +52 -117
  43. package/reference/scaffold/recipes/customize-organization-model.md +161 -149
  44. package/reference/scaffold/recipes/extend-a-base-entity.md +156 -140
  45. package/reference/scaffold/recipes/extend-crm.md +16 -11
  46. package/reference/scaffold/recipes/extend-lead-gen.md +25 -7
  47. package/reference/scaffold/recipes/gate-by-feature-or-admin.md +160 -118
  48. package/reference/scaffold/recipes/index.md +2 -2
  49. package/reference/scaffold/recipes/query-the-knowledge-graph.md +23 -23
  50. package/reference/scaffold/reference/contracts.md +12 -1
  51. package/reference/scaffold/reference/glossary.md +3 -3
  52. package/reference/scaffold/reference/system-interface-capabilities.md +5 -4
  53. package/reference/scaffold/ui/composition-extensibility.mdx +271 -232
  54. package/reference/scaffold/ui/feature-flags-and-gating.md +14 -6
  55. package/reference/scaffold/ui/feature-shell.mdx +279 -62
  56. package/reference/scaffold/ui/recipes.md +229 -197
  57. package/reference/sdk/cli-management.mdx +77 -29
  58. package/reference/sdk/concepts.mdx +2 -0
  59. package/reference/sdk/define-builders.mdx +76 -0
  60. package/reference/sdk/deployment/command-center.mdx +6 -2
  61. package/reference/sdk/deployment/execution-reference.mdx +64 -186
  62. package/reference/sdk/deployment/index.mdx +2 -0
  63. package/reference/sdk/exports.mdx +4 -4
  64. package/reference/sdk/framework/agent.mdx +49 -119
  65. package/reference/sdk/framework/index.mdx +46 -65
  66. package/reference/sdk/framework/project-structure.mdx +150 -205
  67. package/reference/sdk/framework/tutorial-system.mdx +2 -2
  68. package/reference/sdk/human-in-the-loop.mdx +152 -0
  69. package/reference/sdk/index.mdx +6 -7
  70. package/reference/sdk/platform-tools/index.mdx +12 -0
  71. package/reference/sdk/platform-tools/type-safety.mdx +4 -0
  72. package/reference/sdk/project-deployment-spec.mdx +131 -0
  73. package/reference/sdk/resources/index.mdx +21 -7
  74. package/reference/sdk/resources/patterns.mdx +54 -24
  75. package/reference/sdk/resources/types.mdx +7 -4
  76. package/reference/sdk/templates/data-enrichment.mdx +7 -3
  77. package/reference/sdk/templates/email-sender.mdx +139 -135
  78. package/reference/sdk/templates/lead-scorer.mdx +5 -1
  79. package/reference/sdk/templates/pdf-generator.mdx +155 -151
  80. package/reference/sdk/templates/recurring-job.mdx +195 -189
  81. package/reference/sdk/templates/text-classifier.mdx +4 -0
  82. package/reference/sdk/templates/web-scraper.mdx +139 -135
  83. package/reference/spine/spine-primer.md +135 -96
  84. package/reference/ui/index.mdx +14 -7
  85. package/dist/types/worker/adapters/anymailfinder.d.ts +0 -14
  86. package/dist/types/worker/adapters/apify.d.ts +0 -14
  87. package/dist/types/worker/adapters/approval.d.ts +0 -23
  88. package/dist/types/worker/adapters/attio.d.ts +0 -22
  89. package/dist/types/worker/adapters/clickup.d.ts +0 -22
  90. package/dist/types/worker/adapters/create-adapter.d.ts +0 -41
  91. package/dist/types/worker/adapters/crm.d.ts +0 -20
  92. package/dist/types/worker/adapters/dropbox.d.ts +0 -14
  93. package/dist/types/worker/adapters/email.d.ts +0 -25
  94. package/dist/types/worker/adapters/execution.d.ts +0 -22
  95. package/dist/types/worker/adapters/gmail.d.ts +0 -14
  96. package/dist/types/worker/adapters/google-sheets.d.ts +0 -14
  97. package/dist/types/worker/adapters/index.d.ts +0 -33
  98. package/dist/types/worker/adapters/instantly.d.ts +0 -14
  99. package/dist/types/worker/adapters/lead.d.ts +0 -28
  100. package/dist/types/worker/adapters/list.d.ts +0 -9
  101. package/dist/types/worker/adapters/llm.d.ts +0 -45
  102. package/dist/types/worker/adapters/millionverifier.d.ts +0 -14
  103. package/dist/types/worker/adapters/notification.d.ts +0 -28
  104. package/dist/types/worker/adapters/pdf.d.ts +0 -22
  105. package/dist/types/worker/adapters/projects.d.ts +0 -20
  106. package/dist/types/worker/adapters/resend.d.ts +0 -14
  107. package/dist/types/worker/adapters/scheduler.d.ts +0 -25
  108. package/dist/types/worker/adapters/signature-api.d.ts +0 -14
  109. package/dist/types/worker/adapters/storage.d.ts +0 -33
  110. package/dist/types/worker/adapters/stripe.d.ts +0 -14
  111. package/dist/types/worker/adapters/tomba.d.ts +0 -14
  112. package/dist/types/worker/index.d.ts +0 -60
  113. package/dist/types/worker/platform.d.ts +0 -90
  114. package/dist/types/worker/utils.d.ts +0 -9
  115. package/reference/claude-config/Overview.md +0 -230
  116. package/reference/claude-config/hooks/post-edit-validate.mjs +0 -98
  117. package/reference/claude-config/hooks/scaffold-registry-reminder.mjs +0 -187
  118. package/reference/claude-config/hooks/tool-failure-recovery.mjs +0 -73
  119. package/reference/claude-config/registries/graph-skills.json +0 -4
  120. package/reference/claude-config/registries/knowledge-flags.json +0 -154
  121. package/reference/claude-config/registries/skill-coverage.json +0 -20
  122. package/reference/claude-config/rules/active-change-index.md +0 -22
  123. package/reference/claude-config/rules/agent-start-here.md +0 -22
  124. package/reference/claude-config/rules/deployment.md +0 -22
  125. package/reference/claude-config/rules/error-handling.md +0 -22
  126. package/reference/claude-config/rules/execution.md +0 -22
  127. package/reference/claude-config/rules/frontend.md +0 -22
  128. package/reference/claude-config/rules/observability.md +0 -22
  129. package/reference/claude-config/rules/operations.md +0 -22
  130. package/reference/claude-config/rules/organization-model.md +0 -22
  131. package/reference/claude-config/rules/organization-os.md +0 -22
  132. package/reference/claude-config/rules/package-taxonomy.md +0 -22
  133. package/reference/claude-config/rules/platform.md +0 -22
  134. package/reference/claude-config/rules/shared-types.md +0 -22
  135. package/reference/claude-config/rules/task-tracking.md +0 -22
  136. package/reference/claude-config/rules/topbar-actions.md +0 -70
  137. package/reference/claude-config/rules/ui.md +0 -22
  138. package/reference/claude-config/rules/vibe.md +0 -22
  139. package/reference/claude-config/scripts/statusline-command.js +0 -18
  140. package/reference/claude-config/settings.json +0 -30
  141. package/reference/claude-config/skills/client/SKILL.md +0 -201
  142. package/reference/claude-config/skills/deploy/SKILL.md +0 -159
  143. package/reference/claude-config/skills/dsp/SKILL.md +0 -66
  144. package/reference/claude-config/skills/elevasis/SKILL.md +0 -251
  145. package/reference/claude-config/skills/explore/SKILL.md +0 -78
  146. package/reference/claude-config/skills/git-sync/SKILL.md +0 -166
  147. package/reference/claude-config/skills/om/SKILL.md +0 -475
  148. package/reference/claude-config/skills/om/operations/build.md +0 -237
  149. package/reference/claude-config/skills/om/operations/codify-level-a.md +0 -109
  150. package/reference/claude-config/skills/om/operations/codify-level-b.md +0 -159
  151. package/reference/claude-config/skills/om/operations/customers.md +0 -114
  152. package/reference/claude-config/skills/om/operations/features.md +0 -88
  153. package/reference/claude-config/skills/om/operations/goals.md +0 -123
  154. package/reference/claude-config/skills/om/operations/identity.md +0 -97
  155. package/reference/claude-config/skills/om/operations/labels.md +0 -110
  156. package/reference/claude-config/skills/om/operations/offerings.md +0 -114
  157. package/reference/claude-config/skills/om/operations/roles.md +0 -104
  158. package/reference/claude-config/skills/om/operations/scaffold.md +0 -163
  159. package/reference/claude-config/skills/om/operations/techStack.md +0 -38
  160. package/reference/claude-config/skills/project/SKILL.md +0 -1114
  161. package/reference/claude-config/skills/run-ui/SKILL.md +0 -73
  162. package/reference/claude-config/skills/save/SKILL.md +0 -183
  163. package/reference/claude-config/skills/setup/SKILL.md +0 -290
  164. package/reference/claude-config/skills/status/SKILL.md +0 -59
  165. package/reference/claude-config/skills/submit-request/SKILL.md +0 -180
  166. package/reference/claude-config/skills/sync/SKILL.md +0 -47
  167. package/reference/claude-config/skills/tutorial/SKILL.md +0 -259
  168. package/reference/claude-config/skills/tutorial/progress-template.md +0 -74
  169. package/reference/claude-config/skills/tutorial/technical.md +0 -1303
  170. package/reference/claude-config/skills/tutorial/vibe-coder.md +0 -890
  171. package/reference/claude-config/sync-notes/2026-04-22-git-sync-and-sync-notes.md +0 -27
  172. package/reference/claude-config/sync-notes/2026-04-22-lead-gen-deliverability-removal.md +0 -30
  173. package/reference/claude-config/sync-notes/2026-04-24-test-utils-and-template-tests.md +0 -73
  174. package/reference/claude-config/sync-notes/2026-04-24-ui-consolidation-and-sdk-cli-train.md +0 -86
  175. package/reference/claude-config/sync-notes/2026-04-25-auth-role-system-and-settings-roles.md +0 -55
  176. package/reference/claude-config/sync-notes/2026-04-27-crm-hitl-action-layer-cutover.md +0 -97
  177. package/reference/claude-config/sync-notes/2026-04-27-lead-gen-substrate-train.md +0 -112
  178. package/reference/claude-config/sync-notes/2026-04-29-crm-state-and-lead-gen-processing-status.md +0 -93
  179. package/reference/claude-config/sync-notes/2026-05-02-crm-ownership-next-action.md +0 -58
  180. package/reference/claude-config/sync-notes/2026-05-02-template-hardcode-workos-config.md +0 -56
  181. package/reference/claude-config/sync-notes/2026-05-04-elevasis-workspace.md +0 -71
  182. package/reference/claude-config/sync-notes/2026-05-04-knowledge-bundle.md +0 -83
  183. package/reference/claude-config/sync-notes/2026-05-04-template-skills-run-ui-and-tutorial.md +0 -59
  184. package/reference/claude-config/sync-notes/2026-05-05-list-builder.md +0 -42
  185. package/reference/claude-config/sync-notes/2026-05-06-crm-spine.md +0 -60
  186. package/reference/claude-config/sync-notes/2026-05-06-sdk-changes-release-train.md +0 -37
  187. package/reference/claude-config/sync-notes/2026-05-07-sdk-changes-release-train.md +0 -34
  188. package/reference/claude-config/sync-notes/2026-05-08-resource-governance-scaffold-guidance.md +0 -38
  189. package/reference/claude-config/sync-notes/2026-05-09-clients-domain.md +0 -32
  190. package/reference/claude-config/sync-notes/2026-05-09-command-system.md +0 -33
  191. package/reference/claude-config/sync-notes/2026-05-09-resource-governance-and-misc.md +0 -69
  192. package/reference/claude-config/sync-notes/2026-05-12-sdk-ready-release-train.md +0 -30
  193. package/reference/claude-config/sync-notes/2026-05-14-organization-model-ontology-refactor.md +0 -45
  194. package/reference/claude-config/sync-notes/2026-05-15-om-skill-rename-and-write-family.md +0 -52
  195. package/reference/claude-config/sync-notes/2026-05-17-sdk-boundary-consolidation.md +0 -33
  196. package/reference/claude-config/sync-notes/2026-05-20-om-define-helpers.md +0 -32
  197. package/reference/claude-config/sync-notes/2026-05-22-access-model-and-right-panel.md +0 -43
  198. package/reference/claude-config/sync-notes/2026-05-22-lead-gen-tenant-config.md +0 -40
  199. package/reference/claude-config/sync-notes/2026-05-22-org-model-multi-file-split.md +0 -61
  200. package/reference/claude-config/sync-notes/2026-05-23-branding-names-to-identity.md +0 -49
  201. package/reference/claude-config/sync-notes/2026-05-23-lead-gen-manage-access.md +0 -31
  202. package/reference/claude-config/sync-notes/2026-05-23-om-deployment-drift-detection.md +0 -42
  203. package/reference/claude-config/sync-notes/2026-05-23-om-full-model-deploy-contract.md +0 -33
  204. package/reference/claude-config/sync-notes/2026-05-23-ui-sdk-package-fixes.md +0 -37
  205. package/reference/claude-config/sync-notes/2026-05-24-platform-invite-router-core-baseline.md +0 -28
  206. package/reference/claude-config/sync-notes/2026-05-24-system-interface-readiness.md +0 -43
  207. package/reference/claude-config/sync-notes/2026-05-25-invitation-login-loader.md +0 -26
  208. package/reference/claude-config/sync-notes/2026-05-25-om-topbar-requests.md +0 -33
  209. package/reference/claude-config/sync-notes/2026-05-25-system-interface-profile-registry-and-substrate.md +0 -35
  210. package/reference/claude-config/sync-notes/2026-05-25-tenant-om-scaffold-cli.md +0 -49
  211. package/reference/claude-config/sync-notes/2026-05-25-vibe-operate-intent.md +0 -47
  212. package/reference/claude-config/sync-notes/2026-05-28-om-snapshot-sdk-workflow-config.md +0 -33
  213. package/reference/claude-config/sync-notes/2026-05-30-client-source-and-om-profiles.md +0 -39
  214. package/reference/claude-config/sync-notes/2026-06-02-knowledge-nested-group-routing.md +0 -27
  215. package/reference/claude-config/sync-notes/2026-06-02-nest-projects-under-platform.md +0 -45
  216. package/reference/claude-config/sync-notes/2026-06-03-skill-autogen-and-client-skill.md +0 -34
  217. package/reference/claude-config/sync-notes/2026-06-04-scaffold-registry-lane-severity.md +0 -34
  218. package/reference/claude-config/sync-notes/2026-06-05-appearance-app-mode-decouple.md +0 -29
  219. package/reference/claude-config/sync-notes/2026-06-05-ontology-endpoint-rename-and-knowledge-browser-ui.md +0 -86
  220. package/reference/claude-config/sync-notes/2026-06-06-om-build-systems-scaffold.md +0 -47
  221. package/reference/claude-config/sync-notes/2026-06-06-om-item-copy-references.md +0 -50
  222. package/reference/claude-config/sync-notes/2026-06-08-knowledge-base-page-not-found-fix.md +0 -76
  223. package/reference/claude-config/sync-notes/2026-06-09-agent-sessions-public-agent-chat-route.md +0 -75
  224. package/reference/claude-config/sync-notes/2026-06-09-sdk-cli-load-org-model-resolution.md +0 -42
  225. package/reference/claude-config/sync-notes/2026-06-12-agent-grants-visualizer-operations.md +0 -30
  226. package/reference/claude-config/sync-notes/2026-06-14-session-ux-and-project-cli-json.md +0 -33
  227. package/reference/claude-config/sync-notes/2026-06-14-shared-session-conversation-view.md +0 -26
  228. package/reference/claude-config/sync-notes/2026-06-15-session-chat-zero-wiring.md +0 -46
  229. package/reference/claude-config/sync-notes/2026-06-17-agent-session-ux-features.md +0 -34
  230. package/reference/claude-config/sync-notes/2026-06-25-shared-page-scroll-contract-guard.md +0 -52
  231. package/reference/claude-config/sync-notes/2026-06-26-leadgen-overview-om-telemetry.md +0 -47
  232. package/reference/claude-config/sync-notes/2026-07-21-agent-scaffold-hardening.md +0 -75
  233. package/reference/claude-config/sync-notes/2026-07-23-agent-session-memory.md +0 -49
  234. package/reference/claude-config/sync-notes/2026-07-23-workos-org-marker.md +0 -50
  235. package/reference/claude-config/sync-notes/2026-07-24-claude-5-models-and-session-surface-fixes.md +0 -116
  236. package/reference/claude-config/sync-notes/2026-07-27-agent-strict-output-and-turn-drift.md +0 -73
  237. package/reference/claude-config/sync-notes/2026-07-28-agent-reply-is-its-own-field.md +0 -84
  238. package/reference/claude-config/sync-notes/2026-07-30-login-screen-and-member-provisioning-state.md +0 -114
  239. package/reference/claude-config/sync-notes/2026-08-02-auth-guard-defaults-and-truncation-fix.md +0 -122
  240. package/reference/claude-config/sync-notes/2026-08-03-agent-prose-escape-normalization.md +0 -88
  241. package/reference/claude-config/sync-notes/2026-08-03-cli-gateway-errors-and-request-timeout.md +0 -120
  242. package/reference/claude-config/sync-notes/README.md +0 -43
  243. package/reference/sdk/framework/interaction-guidance.mdx +0 -182
  244. package/reference/sdk/framework/memory.mdx +0 -326
  245. package/reference/sdk/framework/resource-documentation.mdx +0 -90
  246. package/reference/sdk/roadmap.mdx +0 -164
@@ -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.
@@ -20,7 +20,7 @@ Both CLIs share the same query layer (`@repo/core/knowledge/queries`). The only
20
20
  The `knowledge:*` commands require `elevasis-sdk >= 1.4.0`. Check with:
21
21
 
22
22
  ```bash
23
- pnpm exec elevasis-sdk --version
23
+ pnpm elevasis-sdk --version
24
24
  ```
25
25
 
26
26
  If you are running on Windows, **use PowerShell** for all `knowledge:*` commands. MSYS Bash rewrites the leading `/by-system/...` path argument to a Windows filesystem path, mangling the query. PowerShell passes the argument through verbatim.
@@ -58,10 +58,10 @@ List all knowledge nodes that govern the `sales.crm` system:
58
58
 
59
59
  ```bash
60
60
  # External project (from inside external/<project>/)
61
- pnpm exec elevasis-sdk knowledge:ls /by-system/sales.crm/
61
+ pnpm elevasis-sdk knowledge:ls /by-system/sales.crm/
62
62
 
63
63
  # Monorepo (from monorepo root)
64
- pnpm exec elevasis knowledge:ls /by-system/sales.crm/
64
+ pnpm elevasis-sdk knowledge:ls /by-system/sales.crm/
65
65
  ```
66
66
 
67
67
  Nested system ids use dots, not slashes: `sales.crm`, `sales.lead-gen`, `projects`.
@@ -72,10 +72,10 @@ List all knowledge nodes that govern the CRM deal ontology record:
72
72
 
73
73
  ```bash
74
74
  # External project
75
- pnpm exec elevasis-sdk knowledge:ls /by-ontology/sales.crm:object/deal
75
+ pnpm elevasis-sdk knowledge:ls /by-ontology/sales.crm:object/deal
76
76
 
77
77
  # Monorepo
78
- pnpm exec elevasis knowledge:ls /by-ontology/sales.crm:object/deal
78
+ pnpm elevasis-sdk knowledge:ls /by-ontology/sales.crm:object/deal
79
79
  ```
80
80
 
81
81
  Ontology IDs use `system.path:kind/local-id` or `global:kind/local-id`. Slash-containing ontology IDs are part of the query path; use PowerShell on Windows so the leading `/by-ontology/...` path is not rewritten by MSYS Bash.
@@ -86,10 +86,10 @@ List all nodes of kind `playbook`:
86
86
 
87
87
  ```bash
88
88
  # External project
89
- pnpm exec elevasis-sdk knowledge:ls /by-kind/playbook
89
+ pnpm elevasis-sdk knowledge:ls /by-kind/playbook
90
90
 
91
91
  # Monorepo
92
- pnpm exec elevasis knowledge:ls /by-kind/playbook
92
+ pnpm elevasis-sdk knowledge:ls /by-kind/playbook
93
93
  ```
94
94
 
95
95
  Common kinds: `playbook`, `strategy`, and `reference`. The available kinds are defined on `OrgKnowledgeNode.kind` in `@elevasis/core/knowledge`.
@@ -97,7 +97,7 @@ Common kinds: `playbook`, `strategy`, and `reference`. The available kinds are d
97
97
  Machine-readable output for piping:
98
98
 
99
99
  ```bash
100
- pnpm exec elevasis knowledge:ls /by-kind/playbook --ids-only
100
+ pnpm elevasis-sdk knowledge:ls /by-kind/playbook --ids-only
101
101
  ```
102
102
 
103
103
  ### 4. List by owner (`/by-owner/<id>/`)
@@ -106,10 +106,10 @@ List all knowledge nodes owned by a specific member or team:
106
106
 
107
107
  ```bash
108
108
  # External project
109
- pnpm exec elevasis-sdk knowledge:ls /by-owner/operations-team
109
+ pnpm elevasis-sdk knowledge:ls /by-owner/operations-team
110
110
 
111
111
  # Monorepo
112
- pnpm exec elevasis knowledge:ls /by-owner/operations-team
112
+ pnpm elevasis-sdk knowledge:ls /by-owner/operations-team
113
113
  ```
114
114
 
115
115
  The `<id>` matches against `node.ownerIds`. Owner IDs are declared on each knowledge node in the OrganizationModel.
@@ -120,10 +120,10 @@ List what a specific node governs (outgoing `governs` edges):
120
120
 
121
121
  ```bash
122
122
  # External project
123
- pnpm exec elevasis-sdk knowledge:ls /graph/knowledge.new-vertical-launch-playbook/governs/
123
+ pnpm elevasis-sdk knowledge:ls /graph/knowledge.new-vertical-launch-playbook/governs/
124
124
 
125
125
  # Monorepo
126
- pnpm exec elevasis knowledge:ls /graph/knowledge.new-vertical-launch-playbook/governs/
126
+ pnpm elevasis-sdk knowledge:ls /graph/knowledge.new-vertical-launch-playbook/governs/
127
127
  ```
128
128
 
129
129
  Knowledge node IDs use the `knowledge.<slug>` source id. Graph node IDs may be kind-prefixed,
@@ -141,10 +141,10 @@ List what governs a specific node (incoming `governs` edges):
141
141
 
142
142
  ```bash
143
143
  # External project
144
- pnpm exec elevasis-sdk knowledge:ls /graph/knowledge.new-vertical-launch-playbook/governed-by/
144
+ pnpm elevasis-sdk knowledge:ls /graph/knowledge.new-vertical-launch-playbook/governed-by/
145
145
 
146
146
  # Monorepo
147
- pnpm exec elevasis knowledge:ls /graph/knowledge.new-vertical-launch-playbook/governed-by/
147
+ pnpm elevasis-sdk knowledge:ls /graph/knowledge.new-vertical-launch-playbook/governed-by/
148
148
  ```
149
149
 
150
150
  ## Read a Node Body
@@ -153,16 +153,16 @@ pnpm exec elevasis knowledge:ls /graph/knowledge.new-vertical-launch-playbook/go
153
153
 
154
154
  ```bash
155
155
  # External project
156
- pnpm exec elevasis-sdk knowledge:cat knowledge.new-vertical-launch-playbook
156
+ pnpm elevasis-sdk knowledge:cat knowledge.new-vertical-launch-playbook
157
157
 
158
158
  # Monorepo
159
- pnpm exec elevasis knowledge:cat knowledge.new-vertical-launch-playbook
159
+ pnpm elevasis-sdk knowledge:cat knowledge.new-vertical-launch-playbook
160
160
  ```
161
161
 
162
162
  Pipe to a pager for long bodies:
163
163
 
164
164
  ```bash
165
- pnpm exec elevasis knowledge:cat knowledge.platform-composition-patterns | less
165
+ pnpm elevasis-sdk knowledge:cat knowledge.platform-composition-patterns | less
166
166
  ```
167
167
 
168
168
  ## Inspect a Node's Edges
@@ -171,10 +171,10 @@ pnpm exec elevasis knowledge:cat knowledge.platform-composition-patterns | less
171
171
 
172
172
  ```bash
173
173
  # External project
174
- pnpm exec elevasis-sdk knowledge:graph knowledge.new-vertical-launch-playbook
174
+ pnpm elevasis-sdk knowledge:graph knowledge.new-vertical-launch-playbook
175
175
 
176
176
  # Monorepo
177
- pnpm exec elevasis knowledge:graph knowledge.new-vertical-launch-playbook
177
+ pnpm elevasis-sdk knowledge:graph knowledge.new-vertical-launch-playbook
178
178
  ```
179
179
 
180
180
  This combines the `governs` and `governed-by` views in one output, useful for understanding a node's full graph position.
@@ -207,7 +207,7 @@ This is the format consumed by the `/knowledge` agent skill. Use it when scripti
207
207
  ```
208
208
 
209
209
  ```bash
210
- pnpm exec elevasis knowledge:ls /by-kind/playbook --json | jq '.results[].id'
210
+ pnpm elevasis-sdk knowledge:ls /by-kind/playbook --json | jq '.results[].id'
211
211
  ```
212
212
 
213
213
  ## Windows Note
@@ -216,10 +216,10 @@ On Windows, MSYS Bash rewrites path arguments starting with `/` to Windows files
216
216
 
217
217
  ```powershell
218
218
  # Correct on Windows -- PowerShell leaves the path arg intact
219
- pnpm exec elevasis knowledge:ls /by-kind/playbook
219
+ pnpm elevasis-sdk knowledge:ls /by-kind/playbook
220
220
 
221
221
  # Wrong on Windows -- MSYS Bash mangles to C:\by-kind\playbook or similar
222
- bash -c "pnpm exec elevasis knowledge:ls /by-kind/playbook"
222
+ bash -c "pnpm elevasis-sdk knowledge:ls /by-kind/playbook"
223
223
  ```
224
224
 
225
225
  All other `elevasis` and `elevasis-sdk` commands are unaffected; this gotcha is specific to path arguments that start with `/`.
@@ -228,4 +228,4 @@ All other `elevasis` and `elevasis-sdk` commands are unaffected; this gotcha is
228
228
 
229
229
  - [Query functions API](../reference/contracts.md) -- `bySystem`, `byOntology`, `byKind`, `byOwner`, `governs`, `governedBy` TypeScript signatures
230
230
  - [Glossary](../reference/glossary.md) -- `systemId`, `nodeId`, `kind`, `ownerIds`
231
- - [Knowledge Browser](../../../../apps/docs/content/docs/in-progress/active-development/sdk-changes/knowledge/index.mdx) -- task doc for the full Knowledge Map bundle
231
+ - [Knowledge Browser](../../../../apps/docs/content/docs/in-progress/active-development/_pipeline/knowledge/index.mdx) -- task doc for the full Knowledge Map bundle
@@ -1626,7 +1626,18 @@ export interface AcqContact {
1626
1626
  ### `DealStage`
1627
1627
 
1628
1628
  ```typescript
1629
- export type DealStage = 'interested' | 'proposal' | 'closing' | 'closed_won' | 'closed_lost' | 'nurturing'
1629
+ /**
1630
+ * Deal stage key. Intentionally an open string, not a closed union — stage
1631
+ * vocabulary is tenant-owned content (see the `CrmStageKeySchema` comment in
1632
+ * api-schemas.ts: "CRM stage/state catalogs are model-owned... The published
1633
+ * core schema validates only the transport shape; closed-catalog membership
1634
+ * is enforced by the caller/API layer via model-injected validators"). A
1635
+ * closed union here would bake Elevasis's specific pipeline
1636
+ * (`interested`/`proposal`/`closing`/`closed_won`/`closed_lost`/`nurturing`)
1637
+ * into every tenant's type surface. `DealStageSchema` in api-schemas.ts is
1638
+ * already `z.string()` for the same reason; this type now matches it.
1639
+ */
1640
+ export type DealStage = string
1630
1641
  ```
1631
1642
 
1632
1643
  ### `DealPriorityBucketKey`
@@ -42,9 +42,9 @@ description: Terminology disambiguation for Organization OS concepts used in the
42
42
 
43
43
  **MembershipFeatureConfig** -- retired per-member feature override config. The migration is complete: access is resolved through the unified Access Model using Organization Model System lifecycle, role permissions, diagnostic allowlists, membership scope, and platform-admin bypass.
44
44
 
45
- **OrganizationModel** -- top-level semantic contract for an organization. Current primary fields include `version`, `domainMetadata`, `branding`, `navigation`, `ontology`, `systems`, `resources`, `topology`, `identity`, `customers`, `offerings`, `roles`, `goals`, `policies`, `statuses`, and `knowledge`. Legacy domain keys such as `sales`, `prospecting`, `projects`, `actions`, and `entities` remain compatibility inputs while projects migrate to System-owned ontology/config/resource contracts.
45
+ **OrganizationModel** -- top-level semantic contract for an organization. Current primary fields include `version`, `snapshotHash`, `domainMetadata`, `branding`, `navigation`, `ontology`, `systems`, `resources`, `topology`, `identity`, `clients`, `customers`, `offerings`, `roles`, `goals`, `policies`, and `knowledge`. `sales`, `prospecting`, `projects`, and `statuses` were removed from the top-level contract in the Phase 4 schema cut; do not author against them. `actions` and `entities` remain current schema fields but are compatibility-oriented -- new authoring prefers System-owned ontology/config/resource contracts.
46
46
 
47
- **OrganizationModelSystemEntry** -- System node in `OrganizationModel.systems`. Primary authoring fields include `id`, `label`, `description`, `parentSystemId`, `systems`, `lifecycle`, `ui`, `requiresAdmin`, `devOnly`, `responsibleRoleId`, `governedByKnowledge`, `drivesGoals`, `actions`, `policies`, `ontology`, `config`, and `order`. `subsystems` and `content` are retained compatibility inputs for older projects and should not be used for new recursive Systems, schemas, catalogs, or config.
47
+ **OrganizationModelSystemEntry** -- System node in `OrganizationModel.systems`. Primary authoring fields include `id`, `label`, `description`, `parentSystemId`, `systems`, `lifecycle`, `ui`, `requiresAdmin`, `devOnly`, `responsibleRoleId`, `governedByKnowledge`, `drivesGoals`, `actions`, `policies`, `ontology`, `config`, and `order`. `subsystems` is a retained compatibility input for older projects and should not be used for new recursive Systems. `content` is **retired** — the System schema is strict and rejects it. Author schemas and catalogs in `ontology`, and system-local settings in `config`.
48
48
 
49
49
  **Provider / ElevasisSystemsProvider** -- runtime that registers System modules, resolves System lifecycle against the org model, projects sidebar navigation, and exposes shell helpers through `useElevasisSystems()`.
50
50
 
@@ -56,7 +56,7 @@ description: Terminology disambiguation for Organization OS concepts used in the
56
56
 
57
57
  **System Interface** -- flat `System.apiInterface` marker that adopts a platform-provided API capability for a System. It declares intent through lifecycle, a closed `readinessProfile`, and optional scoped resource IDs; readiness is derived. Custom tenant Systems should not add custom `apiInterface` profiles. They extend behavior through workflows/operations plus ontology, resources, catalogs, topology, and navigation.
58
58
 
59
- **System Interface profile** -- platform-owned readiness profile from `SYSTEM_INTERFACE_PROFILES`, such as `sales.lead-gen.api`, `sales.crm.api`, or `sales.lead-gen.crm-handoff`. Profiles are a closed literal union tied to platform API consumers and readiness checkers, not tenant-defined extension strings.
59
+ **System Interface profile** -- readiness profile id referenced by `system.apiInterface.readinessProfile`. The schema field itself is an open, non-empty string, not a closed literal union. Built-in platform presets (`sales.lead-gen.api`, `sales.crm.api`, `sales.lead-gen.crm-handoff` -- from `SYSTEM_INTERFACE_PROFILES`) are looked up through the profile registry and derive their requirements from platform code. A custom (non-built-in) profile id is validated structurally instead: the System must declare a `readinessContract` (`requiredObjects`, `requiredCatalogs`) so readiness can be checked without platform hardcoding.
60
60
 
61
61
  **ResourceCategory** -- resource metadata category: `production`, `diagnostic`, `internal`, or `testing`.
62
62
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  # System Interface Capabilities
8
8
 
9
- This catalog is generated from `SYSTEM_INTERFACE_PROFILES` and the derived-readiness checks in `packages/core/src/business/acquisition/ontology-validation.ts`.
9
+ This catalog is generated from `SYSTEM_INTERFACE_PROFILES` and the derived-readiness checks in `packages/core/src/organization-model/readiness/` (built-in lead-gen/CRM profiles are registered from `packages/core/src/business/acquisition/ontology-validation.ts`).
10
10
 
11
11
  System Interface profiles are a closed platform adoption handshake. Tenant custom Systems should extend behavior through workflows/operations plus ontology, resources, and topology instead of declaring custom `apiInterface.readinessProfile` values.
12
12
 
@@ -24,9 +24,10 @@ System Interface profiles are a closed platform adoption handshake. Tenant custo
24
24
  - System Interface marker must be active and scope at least one active `sales.lead-gen` Resource.
25
25
  - Object types: `sales.lead-gen:object/list`, `sales.lead-gen:object/company`, `sales.lead-gen:object/contact`.
26
26
  - Scoped Resource `ontology.reads` bindings for each required object type.
27
- - Catalog types with entries: `sales.lead-gen:catalog/build-template`, `sales.lead-gen:catalog/company-stage`, `sales.lead-gen:catalog/contact-stage`, and derived `sales.lead-gen:catalog/lead-gen.stage-catalog`.
27
+ - Catalog types with entries: `sales.lead-gen:catalog/build-template`, `sales.lead-gen:catalog/company-stage`, `sales.lead-gen:catalog/contact-stage`.
28
28
  - Scoped Resource `ontology.usesCatalogs` bindings for each required catalog.
29
29
  - A lead-gen template-step catalog owned by `sales.lead-gen` whose `appliesTo` value is `sales.lead-gen:object/list`, plus a scoped `ontology.usesCatalogs` binding for it.
30
+ - Derived catalog `sales.lead-gen:catalog/lead-gen.stage-catalog` must exist and be non-empty; it carries no scoped-binding requirement.
30
31
 
31
32
  ## `sales.crm.api`
32
33
 
@@ -34,8 +35,8 @@ System Interface profiles are a closed platform adoption handshake. Tenant custo
34
35
  - Interface key: `api`
35
36
  - Derived-readiness requirements:
36
37
  - System Interface marker must be active and scope at least one active `sales.crm` Resource.
37
- - Catalog type with entries: `sales.crm:catalog/crm.pipeline`.
38
- - Scoped Resource `ontology.usesCatalogs` binding for `sales.crm:catalog/crm.pipeline`.
38
+ - Catalog types with entries: `sales.crm:catalog/crm.pipeline`.
39
+ - Scoped Resource `ontology.usesCatalogs` bindings for each required catalog.
39
40
 
40
41
  ## `sales.lead-gen.crm-handoff`
41
42