@elevasis/sdk 1.17.0 → 1.19.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevasis/sdk",
3
- "version": "1.17.0",
3
+ "version": "1.19.0",
4
4
  "description": "SDK for building Elevasis organization resources",
5
5
  "type": "module",
6
6
  "bin": {
@@ -57,7 +57,7 @@
57
57
  "tsup": "^8.0.0",
58
58
  "typescript": "5.9.2",
59
59
  "zod": "^4.1.0",
60
- "@repo/core": "0.17.0",
60
+ "@repo/core": "0.20.0",
61
61
  "@repo/eslint-config": "0.0.0",
62
62
  "@repo/typescript-config": "0.0.0"
63
63
  },
@@ -0,0 +1,4 @@
1
+ {
2
+ "generatedBy": "generate-knowledge-nodes",
3
+ "domains": {}
4
+ }
@@ -0,0 +1,33 @@
1
+ # Package Taxonomy (Consumer View)
2
+
3
+ External projects consume the **published `@elevasis/*` surface only**. The Elevasis monorepo also has workspace-internal `@repo/elevasis-*` packages — those are NOT installable here and should never appear in your imports or `package.json`.
4
+
5
+ ## What You Can Import
6
+
7
+ | Package | Subpaths | Where it lives in `node_modules` |
8
+ | ---------------- | -------------------------------------------- | -------------------------------- |
9
+ | `@elevasis/sdk` | default, `/worker`, `/node`, `/test-utils` | `node_modules/@elevasis/sdk/` |
10
+ | `@elevasis/ui` | default, `/auth`, `/initialization`, etc. | `node_modules/@elevasis/ui/` |
11
+ | `@elevasis/core` | `/organization-model`, `/entities`, `/utils` | `node_modules/@elevasis/core/` |
12
+
13
+ ## What You Will See in Monorepo Docs (and should NOT import)
14
+
15
+ Monorepo source and docs reference `@repo/elevasis-core` and `@repo/elevasis-operations`. These are workspace-internal packages used by Elevasis as a tenant of its own platform. They are `private: true` and never published. If you see them mentioned:
16
+
17
+ - Do NOT add them to this project's `package.json`
18
+ - Do NOT try to import from them — they are not in your `node_modules`
19
+ - They are not a substitute for `@elevasis/core` even though the name overlaps
20
+
21
+ ## Confused About Where Something Lives?
22
+
23
+ Check the import path:
24
+
25
+ - `@elevasis/...` → published, consumable here
26
+ - `@repo/...` → monorepo-internal, not consumable
27
+
28
+ This project's own org-model and workflows live in `core/config/organization-model.ts` and `operations/src/**` — those are project-owned, not part of either family above.
29
+
30
+ ## References
31
+
32
+ - `node_modules/@elevasis/sdk/reference/scaffold/index.mdx` — full SDK scaffold reference
33
+ - Monorepo source rule: `.claude/rules/package-taxonomy.md` in the elevasis-monorepo (when working across both)
@@ -66,6 +66,17 @@ The user wants the agent to explain something -- a scope, an entity, a concept w
66
66
 
67
67
  **Agent action:** read the relevant org-model label, entity, or scope. Narrate in plain language using label fields from the model -- never invent vocabulary not present in the model. Phase-1 scope covers Model, Features, and Foundations layers only.
68
68
 
69
+ **Stage/state/catalog sub-routing:** when the noun being described is a stage, state, status
70
+ bucket, catalog entry, progress step, pipeline column, or similarly closed business vocabulary,
71
+ also show the cross-system impact before the normal description:
72
+
73
+ 1. Read `node_modules/@elevasis/sdk/reference/spine/spine-primer.md` for the layering pattern.
74
+ 2. Read the relevant domain in `foundations/config/organization-model.ts`.
75
+ 3. Explain the impact in vibe-coder language only: the business profile entry, the saved progress
76
+ on each record, the automations that produce updates, and the dashboard or reports that read it.
77
+ 4. Route follow-up changes through `/knowledge <domain>`. Do not mention the technical pattern name
78
+ unless the user explicitly asks for internals.
79
+
69
80
  ### 4. Transition
70
81
 
71
82
  The user wants to change the status of a task or entity.
@@ -114,6 +125,18 @@ The user describes organizational reality that is not yet expressed in the model
114
125
 
115
126
  **Agent action:** delegate immediately to `/knowledge`. Do not attempt the ceremony yourself. Invoke with the relevant domain: `/knowledge crm` for deal/contact changes, `/knowledge projects` for project types, `/knowledge features` for feature toggles. Plain-language summary of what was detected is acceptable before delegating, but the actual draft-confirm-write ceremony belongs to `/knowledge`.
116
127
 
128
+ **Stage/state/catalog impact preview:** if the Codify intent adds, renames, removes, reorders, or
129
+ re-scopes a stage, state, status bucket, catalog member, pipeline step, or progress vocabulary,
130
+ preview the cross-system impact before delegating:
131
+
132
+ - Which business-profile entry changes.
133
+ - Which saved record progress keys may already exist.
134
+ - Which automations or templates reference the key.
135
+ - Which dashboard, report, queue, or API reads may display or filter by it.
136
+
137
+ Then delegate to `/knowledge <domain>` with that preview as context. Vibe does not write the
138
+ change and does not expose monorepo-only commands.
139
+
117
140
  This routing applies to both codify levels (decision #21 -- Codify ceremony delegated to `/knowledge`):
118
141
 
119
142
  - **Level A** (config-only edits to `organization-model.ts`, feature toggles, label renames): delegate to `/knowledge <domain>` immediately.
@@ -92,11 +92,38 @@ cannot bypass the write gate.
92
92
  | Read | "what playbooks govern sales.crm?", "show me all reference docs", "list my roles" | Run CLI read commands (monorepo or external); format result |
93
93
  | Navigate | "what governs this feature?", "where does outreach-cadence apply?" | Same CLI; pick mount axis from intent; default to `by-feature` for orientation queries |
94
94
  | Describe | "what is our identity set to?", "what's our timezone?" | Read current values from OM source; narrate |
95
- | Codify | "we're an e-commerce company", "add a customer segment", "our outreach goal is..." | Run codify ceremony: snapshot -> propose -> confirm -> write -> typecheck -> Zod parse -> rollback on failure |
95
+ | Codify | "we're an e-commerce company", "add a customer segment", "our outreach goal is..." | Run codify ceremony with shared-layer impact preview: snapshot -> propose -> confirm -> write -> typecheck -> Zod parse -> rollback on failure |
96
96
  | Toggle | "enable the lead-gen feature", "turn off SEO" | Codify ceremony scoped to `features` domain; flip the boolean; same validation/rollback |
97
97
 
98
98
  ---
99
99
 
100
+ ## Shared Layering Preview
101
+
102
+ When opening a domain that uses a closed stage, status, or catalog vocabulary -- especially
103
+ prospecting, CRM, outreach, or another pipeline-like domain -- read the scaffold-shipped primer:
104
+
105
+ ```bash
106
+ node_modules/@elevasis/sdk/reference/spine/spine-primer.md
107
+ ```
108
+
109
+ Use it to emit a short domain layering preview before the normal read, describe, or codify flow:
110
+
111
+ 1. **Catalog:** which `organizationModel.<domain>` catalog owns the keys, labels, descriptions,
112
+ ordering, and entity ownership.
113
+ 2. **Runtime state:** where record progress is stored as sparse state keyed by those catalog
114
+ members.
115
+ 3. **Producers:** which templates, automations, or factories write entity-tagged results for those
116
+ keys.
117
+ 4. **Consumers:** which dashboards, queues, reports, filters, or API reads render or aggregate the
118
+ same keys.
119
+
120
+ For vibe-coder sessions, translate this into plain language: "business profile", "saved progress",
121
+ "automations", and "dashboard or reports". For technical sessions, it is acceptable to name the
122
+ catalog, state map, producer, and consumer surfaces directly. External tenants route all follow-ups
123
+ through `/knowledge`; do not point them at monorepo-only commands.
124
+
125
+ ---
126
+
100
127
  ## Read Patterns
101
128
 
102
129
  ### Monorepo (platform defaults)
@@ -104,9 +131,9 @@ cannot bypass the write gate.
104
131
  ```bash
105
132
  pnpm exec elevasis knowledge:ls
106
133
  pnpm exec elevasis knowledge:cat <node-id>
107
- pnpm exec elevasis knowledge:graph --axis by-feature
108
- pnpm exec elevasis knowledge:graph --axis by-domain
109
- pnpm exec elevasis knowledge:graph --mount <mount-id>
134
+ pnpm exec elevasis knowledge:ls /by-feature/<feature-id>
135
+ pnpm exec elevasis knowledge:ls /by-owner/<owner-id>
136
+ pnpm exec elevasis knowledge:graph <node-id>
110
137
  ```
111
138
 
112
139
  ### External projects (org instance)
@@ -114,14 +141,15 @@ pnpm exec elevasis knowledge:graph --mount <mount-id>
114
141
  ```bash
115
142
  pnpm exec elevasis-sdk knowledge:ls
116
143
  pnpm exec elevasis-sdk knowledge:cat <node-id>
117
- pnpm exec elevasis-sdk knowledge:graph --axis by-feature
118
- pnpm exec elevasis-sdk knowledge:graph --axis by-domain
119
- pnpm exec elevasis-sdk knowledge:graph --mount <mount-id>
144
+ pnpm exec elevasis-sdk knowledge:ls /by-feature/<feature-id>
145
+ pnpm exec elevasis-sdk knowledge:ls /by-owner/<owner-id>
146
+ pnpm exec elevasis-sdk knowledge:graph <node-id>
120
147
  ```
121
148
 
122
149
  Use `knowledge:ls` to enumerate all knowledge nodes. Use `knowledge:cat` to read a specific
123
- node's content. Use `knowledge:graph` to navigate the governance graph -- `by-feature` is the
124
- default axis for "what governs X?" queries; `by-domain` for domain-wide surveys.
150
+ node's content. Use `knowledge:ls /by-feature/<feature-id>` or
151
+ `knowledge:ls /by-owner/<owner-id>` to navigate feature and owner groupings. Use
152
+ `knowledge:graph <node-id>` to inspect incoming and outgoing graph edges for a specific node.
125
153
 
126
154
  ### `/knowledge read-folder` (chat shorthand from the Knowledge Browser)
127
155
 
@@ -156,6 +184,12 @@ Read `foundations/config/organization-model.ts` (external) or the appropriate pl
156
184
  Show the diff in chat. Identify which domain and field changes. Present the proposed new value
157
185
  in context alongside the current value.
158
186
 
187
+ For stage, status, or catalog vocabulary edits, include the shared-layer impact preview before
188
+ asking for confirmation. Name the affected catalog key, whether existing sparse runtime state may
189
+ contain the old key, which producers/templates reference it, and which consumers render or filter by
190
+ it. If the impact cannot be determined from the local project, say which surface is unknown and keep
191
+ the write gated.
192
+
159
193
  ### Step 3: Confirm
160
194
 
161
195
  Pause for explicit user confirmation. Do not proceed without a clear yes. Permission prompts
@@ -240,13 +274,12 @@ Cross-link: `.claude/skills/knowledge/SKILL.md` (monorepo pointer)
240
274
 
241
275
  ## Cross-Links
242
276
 
243
- - `/org-os` -- Organization OS architecture overview, seven layers, propagation pipeline,
244
- feature/surface management. Use `/org-os` when the question is about the architecture or
245
- propagation system rather than reading or editing org-model values. Cross-link:
246
- `.claude/skills/org-os/SKILL.md`
247
277
  - `/configure` -- Legacy org-model editor (pre-absorption). Absorbed into this skill; all
248
278
  Codify and Toggle intents now route here. `/configure` vocabulary still works as a domain
249
279
  hint (e.g., "configure identity" is parsed as domain=identity, intent=Describe-or-Codify).
280
+ - `node_modules/@elevasis/sdk/reference/spine/spine-primer.md` -- Scaffold-shipped layering
281
+ primer for stage/status/catalog vocabularies that coordinate business-profile entries, runtime
282
+ progress, producers, and consumers in tenant projects.
250
283
 
251
284
  ---
252
285
 
@@ -399,6 +399,27 @@ Recent Notes
399
399
  2026-04-01 [call_note] Kickoff — confirmed scope and timeline
400
400
  ```
401
401
 
402
+ #### Tenant Skill Bindings Footer
403
+
404
+ After the normal status output, append a short footer when the project kind, tags, name,
405
+ description, milestones, or active tasks map to a known tenant domain such as `prospecting`,
406
+ `crm`, `outreach`, `finance`, or `support`.
407
+
408
+ Resolve the best domain from explicit metadata first (`tags`, `kind`, domain fields), then from
409
+ project/task text. If no clear domain maps, omit the footer.
410
+
411
+ Footer shape:
412
+
413
+ ```text
414
+ Related skill bindings
415
+ - Domain: <domain>
416
+ - Read or change business profile: /knowledge <domain>
417
+ - Layering primer: node_modules/@elevasis/sdk/reference/spine/spine-primer.md
418
+ ```
419
+
420
+ External projects do not expose monorepo-only architecture commands. Never suggest `/org-os`,
421
+ `/om-spine`, or monorepo paths in this footer.
422
+
402
423
  ### `create` — Guided Project Creation (QnA Flow)
403
424
 
404
425
  Interactive walkthrough that collects project details step by step using `AskUserQuestion`,
@@ -29,6 +29,15 @@ This router does not enforce that tone -- it only writes profile.md and loads th
29
29
  file. The project-wide tone effect is handled by the rules layer reading profile.md on each
30
30
  session start.
31
31
 
32
+ Track separation is explicit:
33
+
34
+ - The vibe-coder track teaches the underlying coordination idea through business language only:
35
+ business profile, saved progress, automations, dashboard, and reports. Do not name the technical
36
+ pattern in vibe-coder menus, lessons, prompts, or progress labels.
37
+ - The technical track may name OM spine vocabulary and can point developers at
38
+ `node_modules/@elevasis/sdk/reference/spine/spine-primer.md` when lessons discuss shared stage,
39
+ status, or catalog vocabularies.
40
+
32
41
  ---
33
42
 
34
43
  ## Step 1: Parse the Argument
@@ -111,8 +120,9 @@ In this project, always:
111
120
 
112
121
  ## Tone Implications
113
122
 
114
- Code-first communication. Use current command names and SDK terminology without hand-holding.
115
- No vocabulary substitutions. Slash commands may be surfaced directly. Full technical depth.
123
+ Code-first communication. Use current command names, SDK terminology, and OM spine vocabulary
124
+ without hand-holding. No vocabulary substitutions. Slash commands may be surfaced directly. Full
125
+ technical depth.
116
126
  ```
117
127
 
118
128
  ### Initialize Progress File
@@ -156,7 +166,7 @@ Read `.claude/memory/tutorial-progress.md`.
156
166
  - [ ] 15 Error handling
157
167
  - [ ] 16 LLM and agents
158
168
  - [ ] 17 Composition
159
- - [ ] 18 Rules, memory, scaffold registry
169
+ - [ ] 18 Rules, memory, scaffold registry, OM spine
160
170
  - [ ] 19 Template lifecycle and /git-sync
161
171
  ```
162
172
 
@@ -570,12 +570,12 @@ the user what happens if they omit the `default` route (runtime failure for unma
570
570
 
571
571
  ### Item 8: Going to production
572
572
 
573
- **Goal:** The user knows the dev/prod split, version bumping flags, and the `cli-cwd-invariant`
574
- rule for `--prod` flag placement.
573
+ **Goal:** The user knows the dev/prod split, version bumping flags, and the SDK CLI CWD
574
+ guidance in the deployment rule.
575
575
 
576
576
  **Estimated time:** 15 min
577
577
 
578
- **Files referenced:** `.claude/rules/deployment.md`, `.claude/rules/cli-cwd-invariant.md`
578
+ **Files referenced:** `.claude/rules/deployment.md`
579
579
 
580
580
  **Commands:** `pnpm -C operations deploy:prod`
581
581
 
@@ -606,19 +606,17 @@ pnpm elevasis-sdk deploy --prod --major # 1.0.0 -> 2.0.0
606
606
  Bump rules: `--patch` for bug fixes, `--minor` for new features (no breaking schema changes),
607
607
  `--major` for breaking input/output schema changes.
608
608
 
609
- **The `cli-cwd-invariant`.** Read `.claude/rules/cli-cwd-invariant.md`. Two critical rules:
609
+ **SDK CLI CWD guidance.** Read `.claude/rules/deployment.md`. Two critical rules:
610
610
 
611
- 1. The `--prod` flag on the `elevasis-sdk` binary MUST come before the subcommand name:
611
+ 1. The `--prod` flag belongs to the `deploy` command:
612
612
 
613
613
  ```bash
614
614
  # Correct
615
- pnpm elevasis-sdk --prod deploy
616
- # Wrong -- --prod after deploy is silently ignored
617
615
  pnpm elevasis-sdk deploy --prod
618
616
  ```
619
617
 
620
618
  The `pnpm -C operations deploy:prod` script in `package.json` handles this correctly.
621
- Prefer the script over a raw CLI call to avoid the pitfall.
619
+ Prefer the script over a raw CLI call for production deploys.
622
620
 
623
621
  2. Never use bare `cd <dir> && elevasis-sdk ...` -- use a subshell `(cd <dir> && ...)` or
624
622
  `pnpm -C <dir> ...` to avoid CWD drift that causes env resolution failures.
@@ -0,0 +1,42 @@
1
+ # 2026-05-05 — List Builder UX + Schema-Driven Step Config
2
+
3
+ ## Why this note exists
4
+
5
+ The list-builder ship train publishes a coordinated `@elevasis/core` + `@elevasis/ui` release that:
6
+
7
+ - Replaces every per-integration bespoke step-config component (and the `SerializedExecutionFormSchema` middle tier) with one generic `<StepConfigForm>` driven by the workflow's `contract.inputSchema` (Zod) plus a small `StepConfigLayout` hints object per integration.
8
+ - Standardizes the BuildTab step-detail right column on a `Configuration | Advanced | Runs` tab shell (`StepDetailRightColumn`).
9
+ - Makes `schema + layout` REQUIRED on `ListBuilderWorkflow`. The legacy `configSchema?` / `ConfigurationFields?` / `AdvancedFields?` / `inputForm?` fields are gone.
10
+ - Removes several `@elevasis/core` execution-form types (`SerializedFormField`, `SerializedFormSchema`, `SerializedExecutionFormSchema`, `SerializedExecutionInterface`, `ExecutionRunnerCatalogItem`, `ExecutionRunnerCatalogResponse`, plus `interface?` from definition types), the `ResourceExecuteForm` / `ResourceExecuteDialog` / `ExecutionRunner` surfaces from `@elevasis/ui`, and the API `execution/runner/` runtime.
11
+
12
+ If a derived project authors its own list-builder step actions or imported any of the deleted types, it will not compile against the new `@elevasis/ui` / `@elevasis/core` baselines without the migration below.
13
+
14
+ ## Applies to
15
+
16
+ - All template-derived projects whose `ui/` consumes `@elevasis/ui` and registers list-builder actions.
17
+ - Any project whose `core/` or `operations/` imports the removed execution-form types from `@elevasis/core`.
18
+ - Any project rendering the list-builder Build tab via `LeadGenListDetailPage` or its `RunWorkflowModal`.
19
+
20
+ ## Required actions
21
+
22
+ 1. Bump `@elevasis/core` and `@elevasis/ui` to the versions published by this train (see `external/_template/{core,ui}/package.json` baselines).
23
+ 2. For every `ListBuilderWorkflow` registry entry the project authors locally, swap to the `schema + layout` contract:
24
+ - Add a browser-safe sibling schema export (split-file pattern: keep Node-only deps out of `ui/`).
25
+ - Provide a `StepConfigLayout<T>` describing field hints (no React, no validation logic).
26
+ - Drop any `ConfigurationFields` / `AdvancedFields` / `configSchema` / `inputForm` references.
27
+ 3. Delete any imports of the removed core types: `SerializedFormField`, `SerializedFormSchema`, `SerializedExecutionFormSchema`, `SerializedExecutionInterface`, `ExecutionRunnerCatalogItem`, `ExecutionRunnerCatalogResponse`, and the `interface?` field on workflow definitions.
28
+ 4. If the project rendered the deleted `ResourceExecuteForm` / `ResourceExecuteDialog` / `ExecutionRunner` surfaces, replace with `<StepConfigForm>` (curated UX) or `<ZodFormRenderer>` (auto-derived from Zod) as appropriate. `renderExecuteDialog` is now REQUIRED on `ResourceDetailPage`.
29
+ 5. Re-run `pnpm -C ui check-types` and `pnpm -C operations check-types` to confirm the schema sibling files resolve and no removed types remain referenced.
30
+
31
+ ## Verification
32
+
33
+ - `pnpm -C ui check-types` — no references to `SerializedFormField`, `SerializedExecutionFormSchema`, `ResourceExecuteForm`, etc.
34
+ - `pnpm -C ui build` — clean build with the new `@elevasis/ui` baseline.
35
+ - `pnpm -C operations check` and `check-types` — clean.
36
+ - BuildTab smoke (manual): open a list under `/lead-gen/lists/{listId}`, select a step, confirm the right column renders the `Configuration | Advanced | Runs` tabs and the schema-driven form (defaults populate, validation Alert fires + clears on edit, conditional `when:` predicates toggle, `recentRuns[0]` auto-load works).
37
+
38
+ ## Not handled by /git-sync
39
+
40
+ - Project-authored `ListBuilderWorkflow` registrations are project-owned code; `/git-sync` does not migrate them. Each project must port its action entries to `schema + layout` by hand following the `apolloImportLayout` pattern in the template's `apps/command-center/src/main.tsx`.
41
+ - Browser dev-smoke for each migrated step type is operator-driven; not automatable through sync.
42
+ - Any local re-implementations or extensions of the deleted `ResourceExecuteForm` / `ExecutionRunner` surfaces must be removed manually before this baseline can be adopted.
@@ -0,0 +1,60 @@
1
+ # 2026-05-06 -- CRM OM Spine Migration
2
+
3
+ ## Why this note exists
4
+
5
+ The CRM deal vocabulary (`stage_key`, `state_key`, `pipeline_key`) is now a fully-realized OM Spine matching the lead-gen list-builder pattern. `CRM_PIPELINE_DEFINITION` becomes the single source of truth: `@elevasis/core` derives `CrmStageKeySchema` and `CrmStateKeySchema` from the catalog, the catalog gains optional `color?` metadata on each stage, and `@elevasis/sdk` re-exports both schemas plus the catalog so external SDK consumers see the same vocabulary as monorepo callers. `@elevasis/ui` rewires the CRM page helpers (`DEAL_STAGE_COLORS`, `DEAL_STAGE_OPTIONS`, `formatDealStageLabel`, `formatDealStateLabel`) to read from the catalog instead of hardcoded maps -- public exports are preserved, behavior is now catalog-driven.
6
+
7
+ The platform side also closed a long-standing data drift: `pipeline_key='default'` in `acq_deals` is gone; live writers now use `pipeline_key='crm'` matching the catalog's `pipelineKey: 'crm'`. The Elevasis backfill applied directly to prod and dev on 2026-05-06; tenant deal rows are not affected by that backfill and continue to use whatever value tenant code wrote.
8
+
9
+ ## Applies to
10
+
11
+ - All template-derived projects that consume `@elevasis/core`, `@elevasis/ui`, or `@elevasis/sdk`.
12
+ - Projects that customize CRM stages or states in `core/config/organization-model.ts` under the `sales` domain.
13
+ - Projects that read or write CRM transitions through `@elevasis/sdk` worker adapters (`acqDb.transitionDeal`, `acqDb.transitionItem`).
14
+ - Projects that render CRM pipeline UI from `@elevasis/ui/features/crm`.
15
+
16
+ ## Required actions
17
+
18
+ 1. Pull synced template package baselines through `/git-sync`:
19
+ - `core/package.json`: `@elevasis/core` -> 0.20.0
20
+ - `ui/package.json`: `@elevasis/ui` -> 2.29.0
21
+ - `operations/package.json`: `@elevasis/core` -> 0.20.0 and `@elevasis/sdk` -> 1.19.0
22
+
23
+ 2. Run `pnpm install` and rebuild the project:
24
+
25
+ ```bash
26
+ pnpm install
27
+ pnpm -C ui build
28
+ pnpm -C ui exec tsc --noEmit
29
+ pnpm -C operations exec tsc --noEmit
30
+ ```
31
+
32
+ 3. **Optional: adopt `color?` on customized CRM stages.** If `core/config/organization-model.ts` overrides `sales.stages` with custom labels, you may now add an optional `color` field per stage (any Mantine palette key: `blue`, `yellow`, `orange`, `green`, `red`, `grape`, etc.). The shipped `DEAL_STAGE_COLORS` map and CRM kanban UI will read it. Stages without a `color` fall back to the platform default mapping in the catalog.
33
+
34
+ 4. **Optional: tighten project-owned CRM workflow inputs.** New schemas are available from `@elevasis/sdk`:
35
+
36
+ ```ts
37
+ import { CrmStageKeySchema, CrmStateKeySchema, CRM_PIPELINE_DEFINITION } from '@elevasis/sdk'
38
+ ```
39
+
40
+ Project-authored CRM action workflows that previously used `z.string()` for `toStage` / `toState` can now validate against the catalog-derived enum. The `transitionItem` / `transitionDeal` worker adapters still accept strings, but unknown stage/state keys are rejected at the platform writer layer for `pipelineKey: 'crm'` writers.
41
+
42
+ 5. **No tenant data backfill required.** The `pipeline_key='default'` -> `'crm'` backfill was applied to Elevasis databases only. Tenant `acq_deals` rows are unaffected. If tenant code writes `pipelineKey: 'default'` to `acqDb.transitionDeal`, that behavior is unchanged; only the published catalog declares `'crm'` as canonical and the published schemas validate `'crm'` exclusively for CRM-shaped transitions.
43
+
44
+ ## Verification
45
+
46
+ After applying the actions above:
47
+
48
+ - `pnpm -C ui check-types`
49
+ - `pnpm -C ui build`
50
+ - `pnpm -C ui test`
51
+ - `pnpm -C operations check`
52
+ - `pnpm -C operations check-types`
53
+ - `pnpm -C operations test`
54
+ - Browser smoke: open `/crm/pipeline` (or the project's CRM kanban surface) and verify stage labels and column colors render from the catalog. Custom-labeled stages should show the override label; default stages show the platform palette.
55
+
56
+ ## Not handled by /git-sync
57
+
58
+ - **Tenant CRM action workflows.** If a project authored its own CRM action workflows in `operations/` that import `transitionDeal` / `syncDealStateKeyToDb` directly (rather than `emitCrmTransition`), `/git-sync` does NOT refactor them. The platform-side `emitCrmTransition` factory is internal to `@repo/elevasis-operations` (workspace-internal) and is not part of the published SDK surface. Project-owned workflows continue to call the worker adapters directly; the new validation guard rejects unknown stage/state keys but does not require migration.
59
+ - **Customized stage colors.** Existing tenant overrides under `sales.stages[].label` and `sales.stages[].states[]` continue to work unchanged. Adopting the new optional `color` field is a project-by-project decision; `/git-sync` will not infer colors for custom stages.
60
+ - **`pipeline_key` data in tenant databases.** If a project has historic `acq_deals` rows with `pipeline_key='default'` and wants to align with the new canonical `'crm'` identity, that is a tenant-managed migration -- not part of this train.
@@ -0,0 +1,37 @@
1
+ # 2026-05-06 -- SDK Changes Release Train
2
+
3
+ ## Why this note exists
4
+
5
+ This train coordinates the Google Calendar integration, list-builder OM Spine cleanup, and OM Spine documentation/skill surfaces into one package and external-sync release. It publishes updated `@elevasis/core`, `@elevasis/ui`, and `@elevasis/sdk` baselines, then syncs template Claude guidance and package versions to derived projects.
6
+
7
+ ## Applies to
8
+
9
+ - Template-derived projects consuming `@elevasis/core`, `@elevasis/ui`, or `@elevasis/sdk`.
10
+ - Projects using the list-builder workflow factory or custom lead-gen build-state UI.
11
+ - Projects relying on tenant Claude guidance for `/knowledge`, `/project`, `/tutorial`, or ambient `vibe` behavior.
12
+
13
+ ## Required actions
14
+
15
+ 1. Pull the synced template changes through `/git-sync`.
16
+ 2. Accept the package baseline bumps published by this train:
17
+ - `core/package.json`: `@elevasis/core`
18
+ - `ui/package.json`: `@elevasis/ui`
19
+ - `operations/package.json`: `@elevasis/core` and `@elevasis/sdk`
20
+ 3. Review local list-builder customizations against the OM-owned stage vocabulary and SDK `listBuilderWorkflow(...)` factory.
21
+ 4. Review any local tenant guidance overrides before accepting the synced `.claude/rules/vibe.md` and `.claude/skills/{knowledge,project,tutorial}/SKILL.md` changes.
22
+
23
+ ## Verification
24
+
25
+ - `pnpm -C ui check-types`
26
+ - `pnpm -C ui build`
27
+ - `pnpm -C ui test`
28
+ - `pnpm -C operations check`
29
+ - `pnpm -C operations check-types`
30
+ - `pnpm -C operations test`
31
+ - `pnpm -C core test`
32
+
33
+ ## Not handled by /git-sync
34
+
35
+ - Project-authored list-builder workflow registrations remain project-owned code.
36
+ - Google Calendar OAuth configuration remains an Elevasis platform/admin responsibility, not a tenant scaffold migration.
37
+ - Manual browser smoke for authenticated calendar views is not automated by template sync.