@elevasis/sdk 1.44.2 → 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 (245) hide show
  1. package/dist/cli.cjs +1001 -652
  2. package/dist/index.d.ts +1045 -509
  3. package/dist/index.js +748 -690
  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 +549 -732
  7. package/dist/worker/index.d.ts +12112 -0
  8. package/dist/worker/index.js +211 -186
  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 +23 -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-cli-gateway-errors-and-request-timeout.md +0 -120
  241. package/reference/claude-config/sync-notes/README.md +0 -43
  242. package/reference/sdk/framework/interaction-guidance.mdx +0 -182
  243. package/reference/sdk/framework/memory.mdx +0 -326
  244. package/reference/sdk/framework/resource-documentation.mdx +0 -90
  245. package/reference/sdk/roadmap.mdx +0 -164
@@ -14,6 +14,8 @@ The Knowledge Browser is a built-in feature surface that renders MDX documents c
14
14
 
15
15
  In template-derived projects, `ui/vite.config.ts` imports `elevasisVite` from `@elevasis/ui/vite` and spreads it into the plugins array:
16
16
 
17
+ <!-- doc-snippet:skip: illustrative excerpt from the ui/ project's own vite.config.ts -- `defineConfig` and `react` are shown unimported, and this doc-snippet check project (external/_template/operations) does not depend on the ui/ project's vite plugins or @elevasis/ui -->
18
+
17
19
  ```ts
18
20
  // ui/vite.config.ts
19
21
  import { tanstackRouter } from '@tanstack/router-plugin/vite'
@@ -105,7 +107,7 @@ The template's `ui/src/routes/__root.tsx` registers `knowledgeManifest` from `@e
105
107
  ```tsx
106
108
  // ui/src/routes/__root.tsx
107
109
  import { knowledgeManifest } from '@elevasis/ui/features/knowledge'
108
- import { ElevasisSystemsProvider } from '@elevasis/ui'
110
+ import { ElevasisSystemsProvider } from '@elevasis/ui/provider'
109
111
 
110
112
  <ElevasisSystemsProvider
111
113
  organizationModel={canonicalOrganizationModel}
@@ -117,34 +119,21 @@ import { ElevasisSystemsProvider } from '@elevasis/ui'
117
119
 
118
120
  A "Knowledge" sidebar entry appears, routes resolve under `/knowledge`, and the Browser renders with the default tree and node viewer. No additional code required.
119
121
 
120
- ### Extend (Custom Nav Items, Default Chrome)
122
+ ### Extend (Custom Sidebar, Default Routes)
123
+
124
+ Spread the manifest and override `sidebar` with a project-owned component. `SystemModule.sidebar` is the supported extension point; everything else in `knowledgeManifest` — routes, the node viewer, the main pane — keeps working unchanged.
121
125
 
122
- Spread the manifest and override `sidebar` to a custom component. The custom component composes `KnowledgeSidebarMiddle` with a modified items array. This is the shortest path to adding project-specific nav entries while keeping the platform chrome.
126
+ The platform's own sidebar internals are **not** part of the published surface. `@elevasis/ui/features/knowledge` exports `knowledgeManifest` and nothing else, so a custom sidebar is project-owned markup. Build it from the knowledge primitives that _are_ published on `@elevasis/ui/knowledge` `KnowledgeTree`, `KnowledgeNodeList`, `KnowledgeSearchBar`, `KnowledgeBrowser`, and `getSharedOrganizationGraph` rather than from the default sidebar's parts.
123
127
 
124
128
  ```tsx
125
129
  // ui/src/features/knowledge/sidebar.tsx
126
- import {
127
- KnowledgeSidebarMiddle,
128
- KNOWLEDGE_ITEMS,
129
- } from '@elevasis/ui/knowledge'
130
- import { knowledgeManifest, KnowledgeSidebar } from '@elevasis/ui/features/knowledge'
131
- import { IconBook } from '@tabler/icons-react'
132
-
133
- const customItems = [
134
- ...KNOWLEDGE_ITEMS,
135
- {
136
- label: 'Internal Runbooks',
137
- to: '/knowledge/by-owner/internal',
138
- icon: IconBook,
139
- exact: false,
140
- },
141
- ]
142
-
143
- const CustomKnowledgeSidebar = () => (
144
- <KnowledgeSidebar>
145
- <KnowledgeSidebarMiddle items={customItems} />
146
- </KnowledgeSidebar>
147
- )
130
+ import { knowledgeManifest } from '@elevasis/ui/features/knowledge'
131
+ import { useElevasisSystems } from '@elevasis/ui/provider'
132
+
133
+ const CustomKnowledgeSidebar = () => {
134
+ const { organizationModel } = useElevasisSystems()
135
+ return <MyProjectSidebar organizationModel={organizationModel} />
136
+ }
148
137
 
149
138
  export const customKnowledgeManifest = {
150
139
  ...knowledgeManifest,
@@ -165,7 +154,7 @@ import { customKnowledgeManifest } from '../features/knowledge/sidebar'
165
154
  </ElevasisSystemsProvider>
166
155
  ```
167
156
 
168
- `KNOWLEDGE_ITEMS` is the exported default items array (matches the `CRM_ITEMS` shape from `@elevasis/ui/features/crm`). Spread it and append project-specific entries.
157
+ `KNOWLEDGE_ITEMS` is still exported from `@elevasis/ui/knowledge` as a starting nav-item array, but it is deprecated — it exists for the legacy nav-items sidebar variant. Prefer deriving your nav entries from the organization model.
169
158
 
170
159
  ### Replace (Project-Owned UI)
171
160
 
@@ -174,10 +163,14 @@ Skip `knowledgeManifest` entirely and build a project-owned route that calls `@e
174
163
  ```tsx
175
164
  // ui/src/routes/knowledge/index.tsx
176
165
  import { bySystem } from '@elevasis/core/knowledge'
177
- import { useElevasisSystems } from '@elevasis/ui'
166
+ import { getSharedOrganizationGraph } from '@elevasis/ui/knowledge'
167
+ import { useElevasisSystems } from '@elevasis/ui/provider'
178
168
 
179
169
  function MyCustomKnowledgeView() {
180
- const { graph } = useElevasisSystems()
170
+ const { organizationModel } = useElevasisSystems()
171
+ if (!organizationModel) return null
172
+
173
+ const graph = getSharedOrganizationGraph(organizationModel)
181
174
  const nodes = bySystem(graph, 'sales.crm')
182
175
  return <MyOwnLayout nodes={nodes} />
183
176
  }
@@ -189,20 +182,19 @@ The `knowledgePlugin()` Vite plugin is still needed in this path because it gene
189
182
 
190
183
  ## Exports Reference
191
184
 
192
- | Export | Package | Purpose |
193
- | -------------------------------------------------------- | ------------------------------------ | --------------------------------------------------------- |
194
- | `elevasisVite` | `@elevasis/ui/vite` | Umbrella plugin factory; includes `knowledgePlugin` |
195
- | `knowledgeManifest` | `@elevasis/ui/features/knowledge` | Default `SystemModule` manifest; spread or pass directly |
196
- | `KnowledgeSidebar` | `@elevasis/ui/features/knowledge` | Default sidebar wrapper |
197
- | `KnowledgeSidebarMiddle` | `@elevasis/ui/features/knowledge` | Sidebar middle section; accepts `items?: NavItem[]` |
198
- | `KNOWLEDGE_ITEMS` | `@elevasis/ui/knowledge` | Default sidebar nav items array |
199
- | `KnowledgeBrowser` | `@elevasis/ui/knowledge` | Composed browser: search bar + detail view |
200
- | `KnowledgeTree` | `@elevasis/ui/knowledge` | Tree for one mount axis |
201
- | `KnowledgeNodeList` | `@elevasis/ui/knowledge` | Flat list of node cards |
202
- | `KnowledgeNodeView` | `@elevasis/ui/knowledge` | Single node: title, kind badge, body, edge sidecar |
203
- | `KnowledgeSearchBar` | `@elevasis/ui/knowledge` | FlexSearch over title, summary, and body |
204
- | `KnowledgeMDXProvider` | `@elevasis/ui/knowledge` | React context supplying the component allowlist |
205
- | `knowledgePlugin` | `@elevasis/ui/vite-plugin-knowledge` | Vite plugin for build-time MDX codegen + HMR (direct use) |
185
+ | Export | Package | Purpose |
186
+ | ---------------------------------------------------------------------- | ------------------------------------ | --------------------------------------------------------- |
187
+ | `elevasisVite` | `@elevasis/ui/vite` | Umbrella plugin factory; includes `knowledgePlugin` |
188
+ | `knowledgeManifest` | `@elevasis/ui/features/knowledge` | Default `SystemModule` manifest; spread or pass directly |
189
+ | `getSharedOrganizationGraph` | `@elevasis/ui/knowledge` | Memoized graph for the current organization model |
190
+ | `KNOWLEDGE_ITEMS` | `@elevasis/ui/knowledge` | Deprecated legacy nav-items array |
191
+ | `KnowledgeBrowser` | `@elevasis/ui/knowledge` | Composed browser: search bar + detail view |
192
+ | `KnowledgeTree` | `@elevasis/ui/knowledge` | Tree for one mount axis |
193
+ | `KnowledgeNodeList` | `@elevasis/ui/knowledge` | Flat list of node cards |
194
+ | `KnowledgeNodeView` | `@elevasis/ui/knowledge` | Single node: title, kind badge, body, edge sidecar |
195
+ | `KnowledgeSearchBar` | `@elevasis/ui/knowledge` | FlexSearch over title, summary, and body |
196
+ | `KnowledgeMDXProvider` | `@elevasis/ui/knowledge` | React context supplying the component allowlist |
197
+ | `knowledgePlugin` | `@elevasis/ui/vite-plugin-knowledge` | Vite plugin for build-time MDX codegen + HMR (direct use) |
206
198
  | `bySystem`, `byOntology`, `byKind`, `byOwner`, `governs`, `governedBy` | `@elevasis/core/knowledge` | Pure query functions for project-owned custom UI |
207
199
 
208
200
  For template-derived projects, import `elevasisVite` from `@elevasis/ui/vite` rather than `knowledgePlugin` directly. The direct `knowledgePlugin` import from `@elevasis/ui/vite-plugin-knowledge` remains available for advanced or non-template wiring.
@@ -210,77 +202,16 @@ For template-derived projects, import `elevasisVite` from `@elevasis/ui/vite` ra
210
202
  ## Decision Tree
211
203
 
212
204
  - **Just want knowledge nodes to show up?** Author `.mdx` files under `core/config/knowledge/nodes/`. That is it.
213
- - **Need extra sidebar nav entries or a different items order?** Spread the manifest, override `sidebar` with a composed `KnowledgeSidebarMiddle` using custom `items`.
205
+ - **Need different sidebar navigation?** Spread the manifest and override `sidebar` with a project-owned component. The default sidebar's own parts are not published.
214
206
  - **Need a completely different layout, data sources, or knowledge UX?** Skip the manifest, own the route, call `@elevasis/core/knowledge` directly.
215
207
  - **Need to extend the MDX component allowlist for custom body components?** Pass `extraComponents` to `KnowledgeMDXProvider` in your custom renderer.
216
- - **Need to add a 6th segment to the sidebar strip?** See the SegmentedControl extension section below.
217
208
  - **Need a custom main-pane dispatcher?** See the DescribeNodeView section below.
218
209
 
219
210
  ## Phase 1.5 Extensions
220
211
 
221
- Phase 1.5 adds two extension surfaces on top of the customization tiers above: a mount-axis `SegmentedControl` strip in the sidebar and a `DescribeNodeView` dispatcher in the main pane. Both are composable -- you can extend the defaults or replace them entirely.
222
-
223
- ### Extending the SegmentedControl (add a 6th segment)
224
-
225
- Phase 1.5 ships `KnowledgeSidebarMiddle` with a five-segment strip above the search bar:
226
-
227
- ```
228
- [ By System ] [ By Kind ] [ By Owner ] [ Governs ] [ Governed By ]
229
- ```
230
-
231
- Each segment maps to a mount axis exposed by `@elevasis/core/knowledge`. The strip is a `SegmentedControl` from `@mantine/core`; selected axis is local sidebar state and does NOT affect the URL.
212
+ Phase 1.5 adds a `DescribeNodeView` dispatcher in the main pane. It is composable -- you can extend the default or replace it entirely.
232
213
 
233
- To add a 6th segment, supply a `segments` prop to `KnowledgeSidebarMiddle`:
234
-
235
- ```tsx
236
- import {
237
- KnowledgeSidebar,
238
- KnowledgeSidebarMiddle,
239
- KNOWLEDGE_SEGMENTS,
240
- } from '@elevasis/ui/knowledge'
241
- import { knowledgeManifest } from '@elevasis/ui/features/knowledge'
242
- import { byOwner } from '@elevasis/core/knowledge'
243
-
244
- // KNOWLEDGE_SEGMENTS is the default five-item array; spread and append.
245
- const customSegments = [
246
- ...KNOWLEDGE_SEGMENTS,
247
- {
248
- value: 'by-team',
249
- label: 'By Team',
250
- // renderBody receives (graph, knowledgeNodes, selectedNodeId, onSelectNode).
251
- // Return any ReactNode -- the strip swaps the tree area for your component.
252
- renderBody: ({ graph, knowledgeNodes, onSelectNode, selectedNodeId }) => {
253
- const teamNodes = byOwner(graph, 'team:product', knowledgeNodes)
254
- return (
255
- <MyTeamList
256
- nodes={teamNodes}
257
- onSelect={onSelectNode}
258
- activeId={selectedNodeId}
259
- />
260
- )
261
- },
262
- },
263
- ]
264
-
265
- const CustomKnowledgeSidebar = () => (
266
- <KnowledgeSidebar>
267
- <KnowledgeSidebarMiddle segments={customSegments} />
268
- </KnowledgeSidebar>
269
- )
270
-
271
- export const customKnowledgeManifest = {
272
- ...knowledgeManifest,
273
- sidebar: CustomKnowledgeSidebar,
274
- }
275
- ```
276
-
277
- Rules and constraints:
278
-
279
- - `value` must be unique across all segments in the array.
280
- - `label` is the display string inside the `SegmentedControl`; keep it short (under 10 characters) to fit the 320 px sidebar width.
281
- - `renderBody` receives the same props as the built-in axis renderers. The tree area is replaced by whatever the function returns while that segment is active.
282
- - The first segment in the array is the default selection on mount.
283
- - Segment selection is reset to the first item whenever the user navigates to `/knowledge/command-view*` (the command-view sub-route bypasses the strip entirely and renders `CommandViewSidebarContent` instead).
214
+ The default sidebar renders a mount-axis strip above the search bar, but that strip is internal: it is not configurable through a prop and its parts are not published. Projects that need different sidebar axes own the sidebar, per the Extend tier above.
284
215
 
285
216
  ### Replacing `DescribeNodeView` Entirely
286
217
 
@@ -303,11 +234,15 @@ function DescribeNodeView({ node, graph, onNavigateToNode }) {
303
234
  ```tsx
304
235
  // ui/src/routes/knowledge/$nodeId.tsx
305
236
  import { useParams } from '@tanstack/react-router'
306
- import { useElevasisSystems } from '@elevasis/ui'
237
+ import { getSharedOrganizationGraph } from '@elevasis/ui/knowledge'
238
+ import { useElevasisSystems } from '@elevasis/ui/provider'
307
239
 
308
240
  export default function KnowledgeNodeRoute() {
309
241
  const { nodeId } = useParams({ from: '/knowledge/$nodeId' })
310
- const { graph } = useElevasisSystems()
242
+ const { organizationModel } = useElevasisSystems()
243
+ if (!organizationModel) return null
244
+
245
+ const graph = getSharedOrganizationGraph(organizationModel)
311
246
  const node = graph.nodes.find((n) => n.id === nodeId)
312
247
 
313
248
  if (!node) return <MyNotFoundView />
@@ -363,16 +298,16 @@ function MyDescribeNodeView(props: DescribeNodeViewProps) {
363
298
 
364
299
  The following exports are added in Phase 1.5 on top of the exports table above:
365
300
 
366
- | Export | Package | Purpose |
367
- | ------------------------------ | ------------------------ | ---------------------------------------------------------------------------- |
368
- | `DescribeNodeView` | `@elevasis/ui/knowledge` | Default graph-node dispatcher; routes by `node.kind` |
369
- | `SystemDescribeView` | `@elevasis/ui/knowledge` | Minimal System node view: path, icon, lifecycle, hierarchy, edges |
370
- | `ResourceDescribeView` | `@elevasis/ui/knowledge` | Minimal resource node view: resourceType, description, edges |
371
- | `OrganizationDescribeView` | `@elevasis/ui/knowledge` | Minimal organization node view: label, edges |
372
- | `GenericDescribeView` | `@elevasis/ui/knowledge` | Key/value fallback for unknown kinds |
373
- | `KNOWLEDGE_SEGMENTS` | `@elevasis/ui/knowledge` | Default five-segment array for `KnowledgeSidebarMiddle` |
301
+ | Export | Package | Purpose |
302
+ | -------------------------- | ------------------------ | ----------------------------------------------------------------- |
303
+ | `DescribeNodeView` | `@elevasis/ui/knowledge` | Default graph-node dispatcher; routes by `node.kind` |
304
+ | `SystemDescribeView` | `@elevasis/ui/knowledge` | Minimal System node view: path, icon, lifecycle, hierarchy, edges |
305
+ | `ResourceDescribeView` | `@elevasis/ui/knowledge` | Minimal resource node view: resourceType, description, edges |
306
+ | `OrganizationDescribeView` | `@elevasis/ui/knowledge` | Minimal organization node view: label, edges |
307
+ | `GenericDescribeView` | `@elevasis/ui/knowledge` | Key/value fallback for unknown kinds |
308
+ | `DomainPanelDispatcher` | `@elevasis/ui/knowledge` | Per-domain panel dispatcher used inside the describe views |
374
309
 
375
- `KnowledgeSidebarMiddle` gains an optional `segments?: KnowledgeSegment[]` prop (defaults to `KNOWLEDGE_SEGMENTS`). The `KnowledgeSegment` type is exported from `@elevasis/ui/knowledge`.
310
+ Each view also exports its props type (`DescribeNodeViewProps`, `SystemDescribeViewProps`, and so on) from the same subpath.
376
311
 
377
312
  ## See Also
378
313
 
@@ -1,102 +1,104 @@
1
1
  <!-- @generated by packages/sdk/scripts/copy-reference-docs.mjs -- DO NOT EDIT -->
2
2
  <!-- Regenerate: pnpm scaffold:sync -->
3
3
 
4
- ---
5
- title: Customize organization-model.ts
6
- description: Annotated walkthrough for customizing the System-backed Organization Model in template-derived projects.
7
- ---
8
-
9
- # Customize organization-model.ts
10
-
11
- `core/config/organization-model.ts` is the semantic contract between the UI shell and platform operations. The shell reads the id-keyed `systems` map for semantic ownership and access, reads `navigation.sidebar` for shell navigation, and binds resources through the id-keyed `resources` map.
12
-
13
- ## Imports
14
-
15
- ```ts
16
- import {
17
- createFoundationOrganizationModel,
18
- defineOrganizationModel,
19
- type OrganizationModel
20
- } from '@elevasis/core/organization-model'
21
- ```
22
-
23
- - `defineOrganizationModel` gives a typed override shape.
24
- - `createFoundationOrganizationModel` resolves defaults and returns the canonical model plus UI-facing helpers.
25
- - `OrganizationModel` is the fully resolved model type.
26
-
27
- ## Systems
28
-
29
- The `systems` map is the source of truth for semantic hierarchy, lifecycle, admin visibility, and governed ownership.
30
-
31
- ```ts
32
- const override = defineOrganizationModel({
33
- systems: {
34
- dashboard: {
35
- id: 'dashboard',
36
- order: 10,
37
- label: 'Dashboard',
38
- lifecycle: 'active',
39
- description: 'Command Center home'
40
- },
41
- sales: {
42
- id: 'sales',
43
- order: 20,
44
- label: 'Sales',
45
- lifecycle: 'active'
46
- },
47
- 'sales.crm': {
48
- id: 'sales.crm',
49
- order: 30,
50
- label: 'CRM',
51
- parentSystemId: 'sales',
52
- lifecycle: 'active',
53
- description: 'CRM pipeline and deal operations'
54
- }
55
- },
56
- navigation: {
57
- sidebar: {
58
- primary: {
59
- dashboard: {
60
- type: 'surface',
61
- order: 10,
62
- label: 'Dashboard',
63
- path: '/',
64
- surfaceType: 'dashboard',
65
- icon: 'feature.dashboard',
66
- targets: { systems: ['dashboard'] }
67
- },
68
- business: {
69
- type: 'group',
70
- order: 20,
71
- label: 'Business',
72
- children: {
73
- crm: {
74
- type: 'surface',
75
- order: 10,
76
- label: 'CRM',
77
- path: '/crm',
78
- surfaceType: 'page',
79
- targets: { systems: ['sales.crm'] }
80
- }
81
- }
82
- }
83
- },
84
- bottom: {}
85
- }
86
- }
87
- })
88
- ```
89
-
90
- System field reference:
91
-
92
- - `id` -- lowercase dotted path. Parent Systems are inferred from prefix segments or declared through `parentSystemId`.
93
- - `order` -- deterministic map iteration order. Use multiples of 10 for easy insertion.
94
- - `label` -- sidebar and breadcrumb label.
95
- - `description` -- optional settings/help text.
96
- - `kind` -- product, operational, platform, or diagnostic.
97
- - `parentSystemId` -- explicit parent System link.
98
- - `lifecycle` -- draft, beta, active, deprecated, or archived.
99
- - `ui` -- optional route metadata used by shell matching during migration.
4
+ ---
5
+ title: Customize organization-model.ts
6
+ description: Annotated walkthrough for customizing the System-backed Organization Model in template-derived projects.
7
+ ---
8
+
9
+ # Customize organization-model.ts
10
+
11
+ `core/config/organization-model.ts` is the semantic contract between the UI shell and platform operations. The shell reads the id-keyed `systems` map for semantic ownership and access, reads `navigation.sidebar` for shell navigation, and binds resources through the id-keyed `resources` map.
12
+
13
+ ## Imports
14
+
15
+ ```ts
16
+ import {
17
+ createFoundationOrganizationModel,
18
+ defineOrganizationModel,
19
+ type OrganizationModel
20
+ } from '@elevasis/core/organization-model'
21
+ ```
22
+
23
+ - `defineOrganizationModel` gives a typed override shape.
24
+ - `createFoundationOrganizationModel` resolves defaults and returns the canonical model plus UI-facing helpers.
25
+ - `OrganizationModel` is the fully resolved model type.
26
+
27
+ ## Systems
28
+
29
+ The `systems` map is the source of truth for semantic hierarchy, lifecycle, admin visibility, and governed ownership.
30
+
31
+ <!-- doc-snippet:skip: continues from the Imports section above -- `defineOrganizationModel` is shown unimported here -->
32
+
33
+ ```ts
34
+ const override = defineOrganizationModel({
35
+ systems: {
36
+ dashboard: {
37
+ id: 'dashboard',
38
+ order: 10,
39
+ label: 'Dashboard',
40
+ lifecycle: 'active',
41
+ description: 'Command Center home'
42
+ },
43
+ sales: {
44
+ id: 'sales',
45
+ order: 20,
46
+ label: 'Sales',
47
+ lifecycle: 'active'
48
+ },
49
+ 'sales.crm': {
50
+ id: 'sales.crm',
51
+ order: 30,
52
+ label: 'CRM',
53
+ parentSystemId: 'sales',
54
+ lifecycle: 'active',
55
+ description: 'CRM pipeline and deal operations'
56
+ }
57
+ },
58
+ navigation: {
59
+ sidebar: {
60
+ primary: {
61
+ dashboard: {
62
+ type: 'surface',
63
+ order: 10,
64
+ label: 'Dashboard',
65
+ path: '/',
66
+ surfaceType: 'dashboard',
67
+ icon: 'feature.dashboard',
68
+ targets: { systems: ['dashboard'] }
69
+ },
70
+ business: {
71
+ type: 'group',
72
+ order: 20,
73
+ label: 'Business',
74
+ children: {
75
+ crm: {
76
+ type: 'surface',
77
+ order: 10,
78
+ label: 'CRM',
79
+ path: '/crm',
80
+ surfaceType: 'page',
81
+ targets: { systems: ['sales.crm'] }
82
+ }
83
+ }
84
+ }
85
+ },
86
+ bottom: {}
87
+ }
88
+ }
89
+ })
90
+ ```
91
+
92
+ System field reference:
93
+
94
+ - `id` -- lowercase dotted path. Parent Systems are inferred from prefix segments or declared through `parentSystemId`.
95
+ - `order` -- deterministic map iteration order. Use multiples of 10 for easy insertion.
96
+ - `label` -- sidebar and breadcrumb label.
97
+ - `description` -- optional settings/help text.
98
+ - `kind` -- product, operational, platform, or diagnostic.
99
+ - `parentSystemId` -- explicit parent System link.
100
+ - `lifecycle` -- draft, beta, active, deprecated, or archived.
101
+ - `ui` -- optional route metadata used by shell matching during migration.
100
102
  - `requiresAdmin` -- hides the node for non-admin members; descendants inherit it.
101
103
  - `actions` / `policies` -- references to cross-cutting domains.
102
104
  - `ontology` -- System-owned object, link, action, catalog, event, surface, interface, value-type, property, or group records.
@@ -107,6 +109,8 @@ System field reference:
107
109
 
108
110
  Use top-level `ontology` for global/shared primitives and `System.ontology` for owned contracts. The resolved ontology index is compiled from root and System scopes and validated for ID shape, kind mismatch, and duplicate IDs.
109
111
 
112
+ <!-- doc-snippet:skip: continues from the Imports section above -- `defineOrganizationModel` is shown unimported here -->
113
+
110
114
  ```ts
111
115
  const override = defineOrganizationModel({
112
116
  ontology: {
@@ -154,12 +158,14 @@ const override = defineOrganizationModel({
154
158
  })
155
159
  ```
156
160
 
157
- Top-level `entities`, top-level `actions`, and `System.content kind: "schema"` remain accepted for existing consumers and are projected into compiled ontology indexes. Prefer `System.ontology` for new object/action/catalog contracts.
161
+ Top-level `entities` and top-level `actions` remain accepted for existing consumers and are projected into compiled ontology indexes. `System.content` is **not** — it is retired, and the strict System schema rejects it. Author object, action, and catalog contracts in `System.ontology`.
158
162
 
159
163
  ## System Config
160
164
 
161
165
  Use `systems[*].config` for local settings and defaults that are not semantic contracts:
162
166
 
167
+ <!-- doc-snippet:skip: continues from the Imports section above -- `defineOrganizationModel` is shown unimported here -->
168
+
163
169
  ```ts
164
170
  const override = defineOrganizationModel({
165
171
  systems: {
@@ -190,19 +196,21 @@ const override = defineOrganizationModel({
190
196
  ```
191
197
 
192
198
  Keep semantic nouns, verbs, relationships, events, catalogs, interfaces, and value types in ontology. Keep secrets, credentials, per-run execution state, logs, and external service state outside the Organization Model.
193
-
194
- ## Sidebar Navigation
195
-
196
- Author shell navigation under `navigation.sidebar`. Groups can contain nested nodes; routeable surface leaves provide `path`, `surfaceType`, and `targets`. Dashboard should appear before Business, Business is a navigation group only, and `/clients` is the canonical clients route.
197
-
198
- ## Resource Binding
199
-
200
- Resource identity and governance metadata live in `OrganizationModel` under `resources`. Workflows, agents, integrations, and scripts import those descriptors and derive runtime `resourceId` / `type` from them. The graph derives System membership from `ResourceEntry.systemPath`.
201
-
202
- ```ts
203
- // core/config/organization-model.ts
204
- import { defineResources } from '@elevasis/core/organization-model'
205
-
199
+
200
+ ## Sidebar Navigation
201
+
202
+ Author shell navigation under `navigation.sidebar`. Groups can contain nested nodes; routeable surface leaves provide `path`, `surfaceType`, and `targets`. Dashboard should appear before Business, Business is a navigation group only, and `/clients` is the canonical clients route.
203
+
204
+ ## Resource Binding
205
+
206
+ Resource identity and governance metadata live in `OrganizationModel` under `resources`. Workflows, agents, integrations, and scripts import those descriptors and derive runtime `resourceId` / `type` from them. The graph derives System membership from `ResourceEntry.systemPath`.
207
+
208
+ <!-- doc-snippet:skip: illustrative excerpt, not a standalone compilable file -->
209
+
210
+ ```ts
211
+ // core/config/organization-model.ts
212
+ import { defineResources } from '@elevasis/core/organization-model'
213
+
206
214
  export const resourceDescriptors = defineResources({
207
215
  leadImport: {
208
216
  id: 'lead-import',
@@ -223,26 +231,26 @@ export const resourceDescriptors = defineResources({
223
231
  }
224
232
  }
225
233
  })
226
-
227
- // operations/src/lead-import/index.ts
228
- config: {
229
- resource: resourceDescriptors.leadImport,
230
- resourceId: resourceDescriptors.leadImport.id,
231
- name: 'Lead Import',
232
- type: resourceDescriptors.leadImport.kind,
233
- version: '1.0.0',
234
- status: 'prod',
235
- category: 'production'
236
- }
237
- ```
238
-
239
- Use kind-prefixed graph IDs for cross-collection links:
240
-
241
- - `system:sales.crm`
242
- - `integration:instantly`
243
- - `resource:lead-import`
244
- - `action:operations.queue.review`
245
-
234
+
235
+ // operations/src/lead-import/index.ts
236
+ config: {
237
+ resource: resourceDescriptors.leadImport,
238
+ resourceId: resourceDescriptors.leadImport.id,
239
+ name: 'Lead Import',
240
+ type: resourceDescriptors.leadImport.kind,
241
+ version: '1.0.0',
242
+ status: 'prod',
243
+ category: 'production'
244
+ }
245
+ ```
246
+
247
+ Use kind-prefixed graph IDs for cross-collection links:
248
+
249
+ - `system:sales.crm`
250
+ - `integration:instantly`
251
+ - `resource:lead-import`
252
+ - `action:operations.queue.review`
253
+
246
254
  `category` is one of `production`, `diagnostic`, `internal`, or `testing`.
247
255
 
248
256
  Descriptor `title` and `description` own executable display metadata. Use nested `resource.ontology` bindings to declare which ontology actions, objects, catalogs, and events the resource performs, reads, writes, uses, or emits. `resource.ontology.primaryAction` names the default/selectable action and must be included in `resource.ontology.actions`. Resource event emissions can still be declared through top-level `emits` for older descriptors, but new descriptors should use `resource.ontology.emits`.
@@ -255,7 +263,9 @@ The old `sales`, `prospecting`, and `projects` top-level keys are not part of th
255
263
  - stable verbs -> `System.ontology.actionTypes`
256
264
  - pipelines, stages, templates, and status vocabularies -> `System.ontology.catalogTypes`
257
265
  - local settings and defaults -> `System.config`
258
- - existing `System.content kind: "schema"` nodes -> compatibility catalog projections
266
+ - legacy `content-node:*` graph IDs from pre-migration projects -> compatibility catalog projections (authoring new `System.content` is rejected)
267
+
268
+ <!-- doc-snippet:skip: illustrative excerpt, not a standalone compilable file -->
259
269
 
260
270
  ```ts
261
271
  systems: {
@@ -290,27 +300,29 @@ systems: {
290
300
  }
291
301
  }
292
302
  ```
293
-
303
+
294
304
  Keep `semanticClass` values stable; platform analytics and triggers depend on them.
295
305
 
296
306
  Policy and role integration remains outside ontology in this pass. Use `roles`, `policies`, `responsibleRoleId`, and `ownerRoleId` for accountability and access semantics until a dedicated policy/role ontology design is published.
297
-
298
- ## Export Pattern
299
-
300
- ```ts
301
- const foundation = createFoundationOrganizationModel(override)
302
-
303
- export const canonicalOrganizationModel: OrganizationModel = foundation.canonical
304
- export const organizationModel = foundation.model
305
- export const { getOrganizationSurface } = foundation
306
- ```
307
-
308
- Pass `canonicalOrganizationModel` to `ElevasisSystemsProvider` in `ui/src/routes/__root.tsx`.
309
-
310
- ## Resolve Behavior
311
-
312
- `createFoundationOrganizationModel(override)` resolves defaults, validates System hierarchy, and exposes helper functions used by the shell. Id-keyed domain maps merge additively by key, so tenant overrides can add one System or resource without re-authoring every default entry.
313
-
307
+
308
+ ## Export Pattern
309
+
310
+ <!-- doc-snippet:skip: continues from the Imports section above -- `createFoundationOrganizationModel`, `override`, and `OrganizationModel` are shown unimported here -->
311
+
312
+ ```ts
313
+ const foundation = createFoundationOrganizationModel(override)
314
+
315
+ export const canonicalOrganizationModel: OrganizationModel = foundation.canonical
316
+ export const organizationModel = foundation.model
317
+ export const { getOrganizationSurface } = foundation
318
+ ```
319
+
320
+ Pass `canonicalOrganizationModel` to `ElevasisSystemsProvider` in `ui/src/routes/__root.tsx`.
321
+
322
+ ## Resolve Behavior
323
+
324
+ `createFoundationOrganizationModel(override)` resolves defaults, validates System hierarchy, and exposes helper functions used by the shell. Id-keyed domain maps merge additively by key, so tenant overrides can add one System or resource without re-authoring every default entry.
325
+
314
326
  Validation catches duplicate System IDs, missing parent Systems, invalid graph IDs, invalid UI paths, invalid ontology IDs, ontology kind mismatches, and duplicate ontology IDs.
315
327
 
316
328
  ## Refresh Generated Scaffold Copies